wie kann ich mit vhdl am besten serielle daten in ein fpga register einlesen? die daten sollen nach einem freigabesignal mit einem bestimmten takt eingelesen werden.
shiftregister <= shiftregister(breite-2 downto 0) & dateneingang;
So dann hole ich jetzt mal den Thread hier aus der Versenkung: Daniel R. wrote:
1 | shiftregister <= shiftregister(breite-2 downto 0) & dateneingang; |
Wie funktioniert diese Anweisung von der Logik her? Also was hier mit dem Signal geschieht ist mir klar und das er funktioniert hab ich auch schon getestet, aber ich kann mir nicht Vorstellen wie der "Ablauf" ist -wie das Signal durch den Block läuft, vorallem wie sich der "Zähler eins weiter stellt-. Vom Verständnis her müsste der Code doch ähnlich funktionieren wie folgendes:
1 | signal q : std_logic_vector (3 downto 0) |
2 | signal reset : std_logic; |
3 | |
4 | begin
|
5 | |
6 | process (clk, reset) |
7 | |
8 | if reset = '1' then q <= "0000"; |
9 | elseif (rising_edge) then |
10 | q(0) <= daten; |
11 | q(1) <= q(0); |
12 | q(2) <= q(1); |
13 | q(3) <= q(2); |
14 | end if; |
15 | |
16 | end process; |
Gruß Mark
> aber ich kann mir nicht Vorstellen wie der "Ablauf" ist > -wie das Signal durch den Block läuft, vorallem wie sich der "Zähler > eins weiter stellt-. Da gibt es keinen Zähler. Der Code beschreibt eine Kette von Registern, und bei der Taktflanke holt sich jedes den Wert vom Nachbarn mit der Nummer eins kleiner. Weil das alles gleichzeitig passiert geht auch kein Wert verloren. > Vom Verständnis her müsste der Code doch ähnlich funktionieren wie > folgendes: Ja, das macht genau das selbe und ist nur in lang ausgeschrieben. Und syntaktisch nicht ganz einwandfrei ;)
Daniels eine Codezeile ist natürlich nicht vollständig: Die muss in einen getakteten Prozess. Dann ist sie nichts anderes als deine vier Zeilen q()... in einer zusammengefasst.
Morin wrote: > Da gibt es keinen Zähler. Der Code beschreibt eine Kette von Registern, > und bei der Taktflanke holt sich jedes den Wert vom Nachbarn mit der > Nummer eins kleiner. Weil das alles gleichzeitig passiert geht auch kein > Wert verloren. Ja ok das ist ja wenigstens schon ein wenig einsichtlicher. Aber warum soll die breite dann breite -2 sein ? > Ja, das macht genau das selbe und ist nur in lang ausgeschrieben. Und > syntaktisch nicht ganz einwandfrei ;) Ging ja nur ums Prinzip O:-)
Ja ok das ist ja wenigstens schon ein wenig einsichtlicher. Aber warum soll die breite dann breite -2 sein ? breite ist zb. bei einem 8-Bit register 7 (ergibt Bit 7,6,5,4,3,2,1,0), also 8-Bit. Nun willst ja etwas an dein Register ranhängen, aber hinterher müssen es immer noch 8 Bit sein. Deshalb shiftregister <= shiftregister(breite-2 downto 0) & dateneingang; oder auch shiftregister <= shiftregister(breite-1 downto 1) & dateneingang; den Unterschied müsstest du selbst erkennen. Tip: LSB, MSB Volker
Wobei
1 | shiftregister <= shiftregister(breite-1 downto 1) & dateneingang; |
recht sinnfrei ist, denn das könnte ich auch so schreiben:
1 | shiftregister(0) <= dateneingang; |
Evtl. war sowas gemeint:
1 | shiftregister <= dateneingang & shiftregister(breite-1 downto 1); |
Damit hat "shiftregister" dann auch wieder seinen Namen verdient ;-)
@Lothar, klar hab ich das so gemeint, danke! hab mal wieder zu schnell gepostet. Volker
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.