Ich habe einen Knotem im Kopf und hoffe ihr könnt mir beim entwirren
helfen. Nachdem ich einige Zeit damit verbracht habe einen Uart von Null
allein zu designen, hat sich mein Plan jetzt dahingehend geändert, das
Beispiel auf L.Millers Homepage vollständig zu verstehen. Dann gewöhnt
man sich nicht irgendwelchen Mist an denke ich mir.
Ich hänge aber leider:
Damit man sieht worum es geht, nur der relevante Empfangsteil.
1 | -- Empfangen
|
2 | process begin
|
3 | wait until rising_edge(CLK);
|
4 | prescaler <= prescaler+1;
|
5 | rxd_sr <= rxd_sr(2 downto 0) & RXD;
|
6 | if (rxd_sr = "1000" and rxbitcnt=9) then -- fallende Flanke = Startbit
|
7 | start <= '1'; -- 1 FF nötig wegen evtl. Glitches auf Kombinatorik
|
8 | end if;
|
9 | if (rxbitcnt<9) then -- Empfang läuft
|
10 | if (prescaler="100") then -- In der Bitmitte abtasten
|
11 | rxdat(rxbitcnt) <= rxd_sr(3); -- Jedes Bit wird sofort nach Empfang ausgegeben --> kein Schieberegister nötig, MUX spart FFs
|
12 | rxbitcnt <= rxbitcnt+1;
|
13 | end if;
|
14 | else -- warten auf Startbit
|
15 | if (start = '1') then -- fallende Flanke Startbit erkannt
|
16 | prescaler <= "001"; -- erst mal nur halbe Bitzeit abwarten
|
17 | rxbitcnt <= 0;
|
18 | start <= '0';
|
19 | end if;
|
20 | end if;
|
21 | end process;
|
22 | dout <= rxdat(8 downto 1);
|
Meine Frage ist, warum wird rxdat gerade so benutzt. Am Ende sollte in
rxdat(0) das Startbit, also 0 stehen und in rxdat(8 downto 1) das Wort,
stopbit wird nicht beharkt. Auf rxdat wird per "Array-Schreibweise"
(Multiplexer?)zugegriffen, es ist kein Schieberegister. Habe ich das a)
richtig interpretiert und b) hat das Vorteile gegenüber einem
Schieberegister.
Außer ggf. der Bitreihenfolge, denn bei einem Schieberegister wäre das
Ergebnis verdreht?