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;
Wo ist da genau welches Problem? SISO = "Serial In Serial Out"? -- stefan SCNR Liefert das Sieberegister Primzahlen? ;-)
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
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
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
Vielleich leigt mein Fehler in einem anderen Modul. ich schau noch genauer hin. Besten Dank. Rudi
Ein Schieberegister kann man einfacher auch noch so implementieren:
1 | 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.
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.