mikrocontroller.net

Forum: FPGA, VHDL & Co. SISO schieberegister


Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.
Ich hab aus einem Beispiel einen Sieberegister implementieren wollen, 
nur habe ich nicht das erwartete Ergebnis. Beispielsweise statt die 
bitfolge 1000000 zu bekommen habe ich 0000001. Die ausgabe ist sozusagen 
gespiegelt. Kann bitte jemand meine Code anschauen ?
Danke

library ieee;
use std.textio.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_textio.all;

entity siso_sreg is
   generic( n : natural := 7 );
      port( clock :  in std_logic;
            reset :  in std_logic;
            SerIn :  in std_logic;
           bstrig : out std_logic;
           SerOut : out std_logic
           );
end entity;

architecture siso_sreg_arch of siso_sreg is

     file log_file : text  open write_mode is "siso.log" ;
     signal s_tmp: std_logic_vector(n-1 downto 0);

     begin
     reg_proc:  process (clock,reset)
       variable my_line : line;
       begin
       if reset = '1' then
          s_tmp <= (others => '0');
       else
          if rising_edge(clock) then
                s_tmp(0) <= SerIn;
                for i in 0 to n-2 loop
                     s_tmp(i+1) <= s_tmp(i);
                end loop;
                SerOut <= s_tmp(n-1);
                if s_tmp = "1111111" then
                    bstrig <= '1';
                else
                    bstrig <= '0';
                end if;
                write(my_line, s_tmp);
                writeline(log_file,my_line);
          end if;
      end if;
     end process;
 end architecture;

Autor: Stefan Hanke (stefanhanke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist da genau welches Problem?
SISO = "Serial In Serial Out"?
 -- stefan

SCNR Liefert das Sieberegister Primzahlen? ;-)

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Rudi,

wenn du 1110000 an den Eingang gibst, siehst du dann am Ausgang den 
"gespiegelten" Wert 0000111 oder auch wieder 0000001 ? Dein Code sieht 
eigentlich ok aus. Vielleicht hast du nicht berücksichtigt, dass das 
Ausgangssignal erst mit 7 Takten Verzögerung dem Eingangssignal 
entspricht. Die ersten 6 Nullen aus deinem Beispiel ergeben sich dann 
aus dem Reset-Wert von s_tmp, erst wenn du weiter taktest siehst du die 
Bitfolge des Eigangssignals. Diese Verzögerung um n Takte ist ja grade 
die Funktion deines siso_sreg.

schöne Grüße
Achim

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal sorry für die langen pause, war 'ne weile weg.
Zum zweiten Beitrag, wenn ich 1110000 an den Eingang gebe, sehe ich dann 
am Ausgang den "gespiegelten" Wert 0000111. Das Problem ist eigenlich 
das ich zwei bitfolgen generieren und vergleichen möchte. Einmal in 
einem Sender benutze ich einen pngenerator und im Empfänger einen 
schiebe register mit dem ich nur schieben aber auch autark die gleiche 
bitfolge wie im Sender generiere. ich bekomme zwar die richtige Folge, 
aber gepsiegelt.
Und ich verstehe nicht so ganz was alles sonst im hitergrund passiert.

MfG

Rudi

Autor: Achim (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich glaub nicht, dass das Problem in dem gezeigten Code steckt. Er sieht 
auch auf den zweiten Blick richtig aus, und wenn man ihn mal auf die 
Schnelle simuliert liefert er genau das, was er soll. Im angehängten 
Beispiel liegt 11010000 an serin und kommt in der selben Reihenfolge 
(mit 7 Takten Verzögerung) auch an serout wieder raus.

Wobei siehst du denn die gespiegelte Reihenfolge? Im Logfile oder in der 
Auswertlogik deines Empfängers? Wo auch immer, wahrscheinlich steckt 
genau dort der Dreher, in siso_reg finde ich ihn nicht.

schöne Grüße

Achim

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleich leigt mein Fehler in einem anderen Modul. ich schau noch 
genauer hin.

Besten Dank.

Rudi

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Schieberegister kann man einfacher auch noch so implementieren:
s_tmp <= s_tmp(n-2 downto 0) & SerIn;

Gerade wenn man viele Schieberegister braucht, z.B. wenn man ein Haufen 
Signale einsynchronisieren muss, verwende ich die zweite Variante 
lieber.

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.