www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Schieberegister - ich blicke nicht mehr durch


Autor: Andreas B. (loopy83)
Datum:
Angehängte Dateien:
  • preview image for SR.png
    SR.png
    8,21 KB, 189 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein hoffentlich triviales Problem, aber ich durchblicke es 
einfach nicht. Wie sagt man so schön, ich sehe den Wald vor lauter 
Nullen und Einsen nicht mehr :)

Es geht um ein einfaches 4bit Schieberegister, in das serielle Daten 
geladen werden. Wenn 4bit neue Daten geladen wurden, wird ein Signal 
"full" auf 1 gesetzt und die 4bit neuen Daten werden an den Ausgang 
gelegt.

Hier ist der Code dazu:
SR_4bit: process (CLOCK_SR)
begin
 if rising_edge(CLOCK_SR) then  
  if (RESET_SR = '1')
  then   AUSGANG <= (others => '0');
  COUNT_INT <= 0;
  else
  AUSGANG(0) <= DATA_IN_SR;
  AUSGANG(1) <= AUSGANG(0);
  AUSGANG(2) <= AUSGANG(1);
  AUSGANG(3) <= AUSGANG(2);
  if (COUNT_INT < 3)
  then   COUNT_INT <= COUNT_INT + 1;
    FULL_INT <= '0';
    DATA_OUT_SR <= "0000";
  elsif (COUNT_INT = 3) then
    COUNT_INT <= 0;
    FULL_INT <= '1';
    DATA_OUT_SR <= AUSGANG;
  end if;
 end if;
end if;  
end process SR_4bit;

Im Anhang habe ich die Simulation dazu angehängt.

Ich verstehe nicht, wieso nach dem vierten Takt am Ausgang (data_out_sr) 
quasi der vorletzte Schritt anliegt und nicht die 4 neuen bits.

Ich schifte doch alles noch einmal um ein Bit nach links. Da wird dann 
ebenfalls der Counter auf 3 abgefragt und die Ausgangsdaten an den 
Ausgang gelegt. Wieso braucht es einen Takt mehr, um die Daten an den 
Ausgang zu legen?

Wie könnte ich das Problem lösen?
Ich möchte quasi 4 neue Bits laden und diese dann ausgaben. Das Full 
Signal dient als Schreibtakt eines Fifos, in das natürlich nur neue 
Daten geschrieben werden sollen.

Ich hoffe es gibt eine Lösung für das Problemchen.

Den Counter einfach von 3 auf 4 setzen und abfragen geht leider nicht, 
da im 5. Takt schon wieder neue Daten anliegen, die gespeichert werden 
sollen... ich habe also wirklich nur 4 Takte zum parallelisieren und 
ausgeben.

DANKE!!

MfG Andi

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

Bewertung
0 lesenswert
nicht lesenswert
Dein Stichwort heißt Latency...

Das SR AUSGANG wird zwar weitergeschoben, aber erst am Ende des 
Prozesses aktualisiert. Du könntest also genauso gut schreiben:
SR_4bit: process (CLOCK_SR)
begin
  if rising_edge(CLOCK_SR) then  
    if (RESET_SR = '1')then  
      AUSGANG <= (others => '0');
      COUNT_INT <= 0;
    else
      if (COUNT_INT < 3) then   
        COUNT_INT <= COUNT_INT + 1;
        FULL_INT <= '0';
        DATA_OUT_SR <= "0000";
      elsif (COUNT_INT = 3) then
        COUNT_INT <= 0;
        FULL_INT <= '1';
        DATA_OUT_SR <= AUSGANG;
      end if;
      AUSGANG(0) <= DATA_IN_SR;  --> BTW: das hier geht kürzer so: AUSGANG <= AUSGANG(2 downto 0) & DATA_IN_SR;
      AUSGANG(1) <= AUSGANG(0);  --
      AUSGANG(2) <= AUSGANG(1);  --
      AUSGANG(3) <= AUSGANG(2);  --
    end if;
  end if;  
end process SR_4bit;
Ist dir dieser Sachverhalt bekannt?
Das ist der Unterschied zwischen Variablen und Signalen...

So ginge es:
SR_4bit: process (CLOCK_SR)
variable ausgsr : std_logic_vector(3 downto 0);
begin
  ausgsr := AUSGANG;  -- Defaultzuweisung, sonst gibts ein Latch   :-o
  if rising_edge(CLOCK_SR) then  
    if (RESET_SR = '1')then  
      AUSGANG <= (others => '0');
      COUNT_INT <= 0;
    else
      ausgsr := ausgsr(2 downto 0) & DATA_IN_SR; -- wird sofort zugewiesen
      if (COUNT_INT < 3) then   
        COUNT_INT <= COUNT_INT + 1;
        FULL_INT <= '0';
        DATA_OUT_SR <= "0000";
      elsif (COUNT_INT = 3) then
        COUNT_INT <= 0;
        FULL_INT <= '1';
        DATA_OUT_SR <= ausgsr;   -- den aktuellen Wert zuweisen
      end if;
      AUSGANG <= ausgsr;         -- Wert in Signal merken
    end if;
  end if;  
end process SR_4bit;

Autor: mki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaub du vergisst das du mit a<=b eine nichtblockierende Zzuweisung 
hast. Das Ergebnis wird erst am Ende des Taktes zugewiesen und liegt den 
ganzen nächsten Takt an. Aber Wichtig ist doch nur dass das ready Signal 
dann anliegt wenn gültige Daten da sind - und das tut es ja wohl. So 
würde ich mir um diesen einen Takt Phasenverschiebung keine großen 
Gedanken machen.

Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe es jetzt ein wenig anders gelöst.
Aber vorweg, der Unterschied zwischen signal und variable war mir nicht 
bekannt. Habe bisher immer nur mit signalen gearbeitet... wieder etwas 
dazu gelernt.

Hier meine Lösung:

Ich nehme quasi nur ein 3bit Schieberegister und hänge dann im 4. Takt 
einfach den aktuellen Wert von Data-in als 4bit hinten an.
Laut Simulation funktioniert es wunderbar.
SR_4bit: process (CLOCK_SR)
begin
if rising_edge(CLOCK_SR) then  
  if (RESET_SR = '1')
  then   AUSGANG <= (others => '0');
        COUNT_INT <= 0;
  else
  AUSGANG(0) <= DATA_IN_SR;
  AUSGANG(1) <= AUSGANG(0);
  AUSGANG(2) <= AUSGANG(1);
  if (COUNT_INT < 3)
  then   COUNT_INT <= COUNT_INT + 1;
    FULL_INT <= '0';
    DATA_OUT_SR <= "0000";
  elsif (COUNT_INT = 3) then
    COUNT_INT <= 0;
    FULL_INT <= '1';
    DATA_OUT_SR <= AUSGANG & DATA_IN_SR;
  end if;
  end if;
end if;  
end process SR_4bit;

DANKE für Eure Hilfe!

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.