Forum: FPGA, VHDL & Co. RS232 in verilog


von Jan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich arbeite mich gerade in Verilog an einem Cyclone III Starter Kit ein 
und wollte eine einfache RS232 Kommunikation aufbauen. Im Forum bin ich 
auf die Seite fpga4fun.com gestoßen. Diese war mir auch sehr hilfreich 
:). Ich habe den Code weitestgehend übernommen, nur ein paar Anpassungen 
habe ich gemacht (Takt, Taktrate zur Erkennung des Startbits..).

Insgesamt möchte ich folgendes programmieren. Ich möchte vom PC aus an 
den FPGA eine 8 Bit Binärfolge schicken. Diese wird vom Empfänger 
verarbeitet.
Antworten soll der FPGA mit der gleichen Binärfolge.

Mit HTerm habe ich nun ein paar Daten zum FPGA geschickt. Dieser 
antwortet mir auch, aber nicht immer korrekt. Mir ist aufgefallen, dass 
solange Bit 3 und 4 gesetzt sind, habe ich eine korrekte Rückgabe meines 
Wertes. Ändere ich diese Bits, stimmen die restlichen auch nicht immer 
überein oder der Rest stimmt, aber Bit 3 oder 4 nicht.

Momentan weiß ich nicht mehr so richtig weiter, wo der Fehler sein 
könnte. Bin noch relativ neu in der Programmierung von FPGAs, deswegen 
würde ich mich sehr über Hilfestellung oder irgendwelche konstruktiven 
Tipps freuen.
Vielen Dank.

von Lattice User (Gast)


Lesenswert?

1
// Baud generator (we use 12 times oversampling)

habe nicht überprüft ob das stimmt, aber wenn dann ist es in konflikt 
mit
1
always @(posedge clk)
2
if(state ==0)
3
  bit_spacing <= 4'b0000;
4
else
5
 if (Baud8Tick)
6
  bit_spacing <= bit_spacing + 4'b001;
7
  
8
wire next_bit = (bit_spacing==4'b1011);

bit_spacing zählt immer von 0-15. Das ist ein Oversampling von 16.

Das ist übrigens etwas wofür man den Simulator erfunden hat. Da sieht 
man sofort wie sich der Abstastzeitpunkt relativ zu den Bits verschiebt.

von Jan (Gast)


Lesenswert?

Das stimmt, danke.
Ich habe das gerade mal korrigiert, kriege aber leider immernoch die 
gleichen Probleme.
Ich tue mich noch ein bisschen schwer mit der Simulation. Ich werde dann 
mal versuchen, da etwas weiter zu kommen. Für weitere Tipps bin ich sehr 
dankbar ;).

von Jan (Gast)


Angehängte Dateien:

Lesenswert?

vielleicht kann mir jemand Tipps bei der Simulation geben. Ich habe eine 
Testbench für das Empfänger Modul geschrieben und wenn ich das über 
Quartus in Modelsim starte, zeigt Modelsim mir nur die Eingänge und die 
Ausgänge sind undefiniert. Irgendwo mache ich einen Fehler, aber ich 
finde ihn einfach leider nicht ...

von Holger H. (holger-h-hennef) Benutzerseite


Angehängte Dateien:

Lesenswert?

Jan schrieb:

> Momentan weiß ich nicht mehr so richtig weiter, wo der Fehler sein
> könnte. Bin noch relativ neu in der Programmierung von FPGAs, deswegen
> würde ich mich sehr über Hilfestellung oder irgendwelche konstruktiven
> Tipps freuen.
> Vielen Dank.

Du kannst dich auf der Lattice Webseite registrieren, nur somit hast du
Zugriff auf  geproofte Ref-Desig-s. (zu modden testen lernen )
#############################################################
Z.B MachXO Controll Developer Kit. oder MachXo2 Dev. Kit.

Ich habe mit den Lattice MachXO Ref-Designs speziell
Verilog getestet, die gehen super.

Gruss Holger.
Das ist das Ref- für MachXO den du einfach auf den Altera mit 
PIN-Anpassung adaptieren kannst.
 Uart_core .... Siehe Bild: Holg_rd1042.PNG

von Holger H. (holger-h-hennef) Benutzerseite


Lesenswert?

Hier noch ein Link:
http://www.latticesemi.com/products/developmenthardware/developmentkits/machxocontroldevelopmentk.cfm
Unten ist der Link zu dem Source-Code..

Den SOC Source-Code habe ich in ein Daimond Project importiert.


Aber sicher haben die bei Altera ein einfachen UART-Core.


Gruss Holger.

von OlliH (Gast)


Lesenswert?

Hallo Jan,

Tipp für deine Simulation:
das Register Baud8GeneratorAcc wird in deinem Modell nicht initialisiert 
und ist beim Simulationsstart "undefined". Bei jedem "posedge clk" wird 
dann "undefined" + irgendwas gerechnet und da kommt immer "undefined" 
raus.

Eine Möglichkeit wäre ein reset-Signal einzufügen, mit dem du das Modul 
initialisierst:

always @(posedge clk or posedge reset)
begin
 if (reset)
    Baud8GeneratorAcc <= 0;
  else
    Baud8GeneratorAcc <= Baud8GeneratorAcc[30:0] + Baud8GeneratorInc;
end

Gruß
 OlliH

von brüderle & schwesterle (Gast)


Lesenswert?

@Jan
>Quartus in Modelsim starte, zeigt Modelsim mir nur die Eingänge und die
>Ausgänge sind undefiniert. Irgendwo mache ich einen Fehler, aber ich

Was genau hast du dir bei deiner Simulation angesehen?
Schau dir doch mal deine statemachine an, genauer das Signal "state".

Spontan würde ich sagen das "state" in deiner Simulation immer x bleiben
muss weil ich nirgentwo einen Reset oder initial wert für "state" sehe!
 Also entweder einen Initialwert einbauen:
a) reg [3:0] state = 0; // Ist in SRAM-basierten-FPGA erlaubt

oder Resets:
b) syncroner reset:
1
  always @(posedge clk)
2
     if (reset) 
3
         state <= 0;
4
     else
5
         state <= funktion_von(state)...
c) oder (nicht so gut in FPGAs) asyncron:
1
  always @(posedge clk or posedge reset)
2
     if (reset)   
3
         state <= 0;
4
     else
5
         state <= funktion_von(state)...

 (gilt evtl auch für andere Signal in einem verilog code)

Wobei hier schon viel über Resets geschrieben wurde z.B.
Beitrag "Xilinx und die Resets"

von Jan (Gast)


Lesenswert?

Danke für die Tips. Die haben mich auf den richtigen Weg gebracht, waren 
noch ein paar andere Fehler darin, aber jetzt läuft es.

Beitrag #5183702 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.