Guten Tag,
ich habe ein Uart für das Arty A7 100t geschrieben.
Mit dem Tool HTerm kann ich Daten problemlos empfangen allerdings werden
die Daten Falsch ans Arty gesendet.
Ich habe über den PMOD ausgang ein Externes LEDPMOD mit 8 LED's aber es
Leuchtet immer nur die achte LED.
Der Baudgenerator erzeugt den Takt von 19200Hz und die Baudrate von
19200 ist auch in HTerm eingestellt.
In der Simulation läuft alles wie es soll.
Anbei der Code:
Uart Main:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
-- Uncomment the following library declaration if instantiating
- "Clock_MGMT" fehlt, aber der ist sowieso hier überflüssig.
- "Uart_TX" fehlt ebenfalls, wird hier aber auch nicht benötigt.
- Testbench fehlt ebenfalls und gerade diese wäre hier schon sehr
interessant gewesen.
- Im Toplevel "Uart" gibt es den Port
reset : in std_logic;
daraus wird nicht ersichtlich, dass das ein active-low Reset ist. Oder
du hast das NOT Gatter bei der Verdrahtung mit "Clock_MGMT" vergessen.
Wobei deine Komponente "Uart_RX" ebenfalls
clk, reset : in std_logic;
hat aber einen active-low Reset erwartet.
- Es heißt UART.
- Da sind viele Leerzeilen ohne Grund.
- Simuliere das doch mal ernsthaft, da sieht man das "received" wild
zappeln und falsche Daten an "dout".
Alles Gute, alles Liebe (-:
Maximilian S. schrieb:> Wo könnte der Fehler liegen?
Du gehst davon aus, dass der Baudrate Generator im Sender und Empfänger
gleich schnell und zur gleichen Zeit schalten (synchron sind). Du
wolltest aber einen UART bauen -> Das A steht für asynchronous.
Wie ich von anderen gelernt habe, macht man üblicherweise Überabtastung
(also z. B. mit vierfacher Baudrate) und eine Flankenerkennung beim
Startbit.
Christoph Z. schrieb:> Wie ich von anderen gelernt habe, macht man üblicherweise Überabtastung> (also z. B. mit vierfacher Baudrate) und eine Flankenerkennung beim> Startbit.
Überabtastung muss nicht sein, die einfachste Variante reicht:
Flankenerkennung auf's Startbit, 1,5 Bitzeiten warten (=Mitte vom ersten
Datenbit), dann 8 mal ein Bit einlesen und jeweils eine volle Bitzeit
warten, fertig.
Anschließend noch eine Bitzeit warten (dann ist man in der Mitte vom
Stoppbit) und dann kann es wieder von vorn losgehen.
Duke
Maximilian S. schrieb:> Anbei der Code:
Wichtige Regeln - erst lesen, dann posten!
...........
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Hi,
ich habe einen funktionierenden 12MBAUD-UART für das ARTY A7.
Bei Interesse kann ich ihn hier rein stellen, er kann auf verschiedene
Baudraten eingestellt werden, sowie auf 1 oder 2 Stop-Bits. Ebenso kann
die Parität aktiviert/deaktiviert werden.
Grüße, Matthias
Sorry dass ich jetzt erst zurückschreibe.
Problem lag daran, dass ich die Flanke abgefragt habe beim empfangen.
Mitte abgefragt und dann lief es. Musste das Arty A7 heute leider wieder
zurück geben. Gehörte der Uni und wurde nur für dieses Modul benötigt.
Danke euch auf jeden Fall für die Antworten.
Duke Scarring schrieb:> Überabtastung muss nicht sein, die einfachste Variante reicht:> Flankenerkennung auf's Startbit, 1,5 Bitzeiten warten (=Mitte vom ersten> Datenbit), dann 8 mal ein Bit einlesen und jeweils eine volle Bitzeit> warten, fertig.[...]
Und wie erkennt man die Flanke ohne Überabtastung? Genau, mit
Überabtastung :)
Maximilian S. schrieb:> und dann lief es.
Wundert mich ein wenig bei dem Baudratengenerator:
1
:
2
elsifrising_edge(clk)then
3
if(count=(divider/2)-1)then
4
tmp<=NOT(tmp);
5
count<=0;
6
else
7
count<=count+1;
8
endif;
9
endif;
10
endprocess;
11
clk_tick<=tmp;
12
:
13
:
14
clk_tick=>rx_clk_tick
15
:
16
:
17
RX_tick=>rx_clk_tick,
18
:
19
:
20
if(RX_tick='1')then
21
:
Denn der gibt ja etliche (genau divider/2) clk-Zyklen lang einen aktiven
Clock-Enable aus. Normalerweise ist ein Clock-Enable immer nur 1
Taktzyklus lang aktiv: