mikrocontroller.net

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


Autor: Fragender (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel R. (Gast)
Datum:

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

Autor: Mark K. (-jmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So dann hole ich jetzt mal den Thread hier aus der Versenkung:

Daniel R. wrote:
 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:

signal q : std_logic_vector (3 downto 0)
signal reset :  std_logic;

begin

process (clk, reset)

   if reset = '1' then q <= "0000";
      elseif (rising_edge) then
        q(0) <= daten;
        q(1) <= q(0);
        q(2) <= q(1);
        q(3) <= q(2);
      end if;

end process;


Gruß Mark

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark K. (-jmk)
Datum:

Bewertung
0 lesenswert
nicht 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:-)

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei
 shiftregister <= shiftregister(breite-1 downto 1) & dateneingang; 
recht sinnfrei ist, denn das könnte ich auch so schreiben:
 shiftregister(0) <= dateneingang;


Evtl. war sowas gemeint:
 shiftregister <= dateneingang & shiftregister(breite-1 downto 1);
Damit hat "shiftregister" dann auch wieder seinen Namen verdient ;-)

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar,

klar hab ich das so gemeint, danke!
hab mal wieder zu schnell gepostet.


Volker

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.