Forum: FPGA, VHDL & Co. serielle daten in ein schieberegister einlesen


von Fragender (Gast)


Lesenswert?

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.

von Daniel R. (Gast)


Lesenswert?

shiftregister <= shiftregister(breite-2 downto 0) & dateneingang;

von Mark K. (-jmk)


Lesenswert?

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

von Morin (Gast)


Lesenswert?

> 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 ;)

von Jan M. (mueschel)


Lesenswert?

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.

von Mark K. (-jmk)


Lesenswert?

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:-)

von Volker (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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 ;-)

von Volker (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.