RS232-Interface in VHDL

Gast #744778
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...
Angehängte Dateien:
Persönliche Seite #1185471
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?
Gast #1493329
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.
#1493882
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
Gast #1806594
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
Gast #2926529
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?

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