RS232 in verilog

Gast #3034267
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.
Angehängte Dateien:
Gast #3034358
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.
Gast #3034492
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 ;).
Gast #3036711
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 ...
Angehängte Dateien:
Persönliche Seite #3037559
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
Angehängte Dateien:
Gast #3038102
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
Gast #3038122
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"
Beitrag #5183702 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren