Forum: Projekte & Code RS232-Interface in VHDL


von bebork (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
hier mal eine Schnittstellenbeschreibung für die RS232 in VHDL mit 
zugehöriger Testbench. Der Code ist plattformunabhängig.
Das System kann unter Angabe der Parameter clk_rate und baud_rate vor 
der Synthese auf die gewünschte Baudrate eingestellt werden.

Die Verifikation habe ich bis jetzt nur auf einem Virtex4-Board mit 100 
MHz Taktrate und bei 57600 Baud durchgeführt.

Anregungen, Bugs, Verbesserungsvorschläge bitte hier posten. Ansonsten 
viel Spaß damit...

von bebork (Gast)


Lesenswert?

... was ich noch vergessen habe: 1 Startbit, 8 Datenbits, 1 Stopbit, 
keine Parität, kein Handshake.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Auch wenns schon älter ist, wollte das gerade mal auf meinem neu 
erworbenem Baord (Spartan-3A Starter) ausprobieren, leider "rührt und 
ruckt" sich nix.

Im UCF sind die Pins nach der Vorgabe von XILINX folgendermaßen gesezt:
NET "RS232_DTE_RXD" LOC = "F16"  | IOSTANDARD = LVCMOS33 ;
NET "RS232_DTE_TXD" LOC = "E15"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | 
SLEW = SLOW;

Hab das folgendrmaßen eingebunden:
1
component RS232_Interface is
2
  generic(clk_rate  : integer := 50000000; -- Taktrate
3
  baud_rate: integer := 57600
4
);
5
  port(...);
6
end component;
7
8
RS232if: RS232_Interface
9
port map(
10
 clk            => CLK_50M,
11
 rs232_rxd      => RS232_DTE_RXD,
12
 rs232_txd      => RS232_DTE_TXD,
13
 rs232_tra_en   => tx_send,
14
 rs232_dat_in   => tx_data,
15
 rs232_txd_busy  => tx_busy,
16
 rs232_rec_en   => rx_ready,
17
 rs232_dat_out  => rx_data
18
);
Da ich noch nicht ganz sicher war wie jezt die Signalzustände liegen 
müssen fürs senden, hab ich erstmal die Statusleitungen auf die LEDs 
gelegt ebenso die unteren 4bit der Empfangene Daten.
1
ledkeys: process(CLK_50M) 
2
begin 
3
 if rising_edge(CLK_50M) then 
4
  led(0) <= BTN_EAST XOR ROT_A XOR SW(3) XOR SW(0) XOR SW(1) XOR SW(2);
5
  led(1) <= rx_data(4);
6
  led(2) <= rx_data(5);
7
  led(3) <= rx_data(6);
8
  led(4) <= rx_data(7);
9
  led(5) <= rx_ready;
10
  led(6) <= tx_send;
11
  led(7) <= tx_busy;
12
 end if; 
13
end process;
Dann habe ich mit Hterm die Verbindung hergestellt und erstmal 
Loopbacktest(am Kabel 2+3 gebrückt) ging, dann mit dem Board verbunden 
und mal kontinuierlich Zeichen gesendet, an den LEDs ändert sich leider 
nix...

(LED 0-5 leuchten, LED 6+7 sind aus)

Habe ich irgenwas übersehen?

von Patrick S. (abaddon1979)


Lesenswert?

Lade dir von Xilinx Modelsim XE herunter. Schreibe eine Testbench und 
schau dir an wie dein Signalverlauf ist. Das RS232 Protokoll ist nicht 
sehr schwierig und ziemlich schnell auf Fehler überprüft.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Testbench ist dabei, allerdings hätte ich wenigstens Fehlerhafte Zeichen 
erwartet es passiert aber garnix, und bebork hat es ja angeblich 
shconmal erfolgreich eigesezt. Naja werddie Tage nochmal gucken.

von Dete K. (dete)


Lesenswert?

hallo,

ich habe mir dir die datei auch mal geladen und auf meinen FPGA 
gespielt.
leider tut sich bei mir auch nichts.

ich bekomme den fehler leider nicht raus.

ist jemand schon schlauer?

gruß dete

von Iulius (Gast)


Lesenswert?

>> ich habe mir dir die datei auch mal geladen und auf meinen FPGA
>> gespielt.
>> leider tut sich bei mir auch nichts.

nur die Datei ?

Dann kann sich ja auch nichts tun. Man muss schon etwas drumherum bauen.


Falls du das getan hast : hochladen, dann kann man es prüfen.

Das rs232 Modul von hier funktioniert jedenfalls(gerade getestet), auch 
wenn die Beschreibung extrem umständlich ist, aber das ist wohl 
Geschmackssache.

von Dete K. (dete)


Lesenswert?

ja ich habe nur die datei geladen und in mein projekt mit eingefügt.

die datei funktioniert in der simulation mit modelsim genauso wie sie 
soll.
da geb ich dir recht.

mir ist klar das ich da "schon etwas drumherum bauen muss". das ist bei 
mir aber hardwareseitig gelöst.

bei mir tut sich aber ebenfalls nichts, so wie es  Läubi (weiter oben) 
gepostet hatte, auch noch nicht einmal fehlerahfte zeichen

von Iulius (Gast)


Lesenswert?

Das drumherum ist hardwareseitig gelöst ?

Klar musst du tx und rx auf die tatsächlichen pins geben.

Nötig ist aber auch ein enable in das rs232 modul zu geben, sonst 
startet da erstmal gar nichts.


Leider kann man aus deinen Infos nicht schließen was du verkehrt gemacht 
hast.

von devotschka (Gast)


Lesenswert?

Tach.
Hab das ganze mal auf einem CPLD probiert. Empfangen funktioniert nach 
viel Rumprobieren endlich. Ich hab das ganze mit 8 LEDs verknüpft und 
die per minicom eingegebenen Zeichen werden sogar korrekt angezeigt. 
Feine Sache find ich :) Aber wie sende ich denn jetzt Bytes in Richtung 
PC? Byte auf rs232_dat_in legen is klar, aber wie weiter?
MfG

von Harald D (Gast)


Lesenswert?

Ht jemand sowas3akw mit CRC / automatischer Korrektur?

von Josef (Gast)


Lesenswert?

Hallo,
ich habe eine Frage, und zwar wie ihr das Signal rs232_tra_en antriggert
Dazu muss ja das Signal auf 1 und anschließend wieder zurückgenommen 
werden
Nun habe ich aber einen Prozess welcher von einem AdcLese-Entity (siehe 
hier :http://www.codeforge.com/read/21280/ADC_TLC549.vhd__html) 
angetrigggert wird. Dabei setze ich das Signal auf '1', wie kann ich es 
aber wieder heruntergbekommen bevor der nächste ADC-Wert ankommt?

von Pelz (Gast)


Lesenswert?

Tach auch

Danke für den code läuft einwandfrei

von Anfäng (Gast)


Lesenswert?

Pelz schrieb:
> Tach auch
>
> Danke für den code läuft einwandfrei

Hi,
hast du den bereitgestellten Code verwendet?
Was hast du zusätzlich eingefügt, damit es lauffähig wurde?

Gruss

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.