mikrocontroller.net

Forum: FPGA, VHDL & Co. Schiebregister in VHDL


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe hier ein code für schieberegister geschrieben.Der soll von 
"00000001" bis "11111111" schieben und wieder von "11111111" bis 
"00000001" quasi rechts und links schieben.kann mir bitte jemand sagen 
wo ich falsch denken.Ich weiss es nicht mir weiter!!!!
Danke euch.

architecture VERHALTEN of reg2 is
signal clk_new     : std_logic;
signal r_l          : std_logic;
signal shift    : std_logic_vector (7 downto 0);
begin

  links:process (clk, reset_n)
  variable temp        : std_logic;
  begin
    if reset_n = '0' then
      shift <= "00000001";
      temp  := '1';
    elsif clk ='1' and clk'event then
      clk_new <=clk_in;
      if clk_in = '0'and clk_new ='1' then
        if r_l = '0' then
          shift(7 downto 1) <= shift(6   downto 0) ;
        else
          shift(6 downto 0) <= shift(7 downto 1);
        end if;
        if shift = "11111111" then
          r_l <='1';
          shift(7)<= '0';
            shift(7 downto 1) <= shift(6 downto 0) ;

        elsif shift="00000000" then
          shift(0)<= '1';
        end if;
      end if;
      LED <= shift;
    end if;
  end process links;
end VERHALTEN;

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>        if r_l = '0' then
>          shift(7 downto 1) <= shift(6   downto 0) ;
>        else
>          shift(6 downto 0) <= shift(7 downto 1);
>        end if;

Was passiert mit shift(0) im ersten und shift(7) im zweiten Fall? Das 
musst du auch noch zuweisen.


Und hier weisst du shift(7) zweimal einen Wert zu, dafuer vergisst du 
aber shift(0) zu aendern:

>           shift(7)<= '0';
>            shift(7 downto 1) <= shift(6 downto 0) ;

Autor: ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich verstehe die frage nicht richtig, aber ich kann nur dazu sagen 
das shift(0) bleibt immmer 1 bis alles bits auf '1' sind.und da setze 
ich dann shift(7) auf '0' damit das züruch schiebt und dabei soll 
schift(0) auf '1' bleiblen bis alle auf`'0' sind.Nacher soll das 
programme wieder von vorne anfangen.
deswegen setze ich zum schluss shift(0) = '1'.
Mein grosse problem liet an zurückzählen das programm soll bis 7 
schieben und dann von 7 züruck auf 0.Da ist mein gros problem

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

Bewertung
0 lesenswert
nicht lesenswert
Dein clk_new müsste eigentlich clk_old heißen.
Probiers mal so:
:
signal clk_new  : std_logic;
signal r        : std_logic := '0'; -- nach rechts schieben 
signal sr       : std_logic_vector (7 downto 0) := x"01";
:
begin
  process begin  -- reset ist unnötig, Defaultwerte werden bereits bei der Definition angegeben
    wait until rising_edge(clk);
    clk_old<=clk_in;                     -- besser wäre hier ein Clock-Enable von aussen
    if (clk_old='1' and clk_in='0') then -- aber was solls, machen wirs lokal: fallende Flanke
      if (r='1') then -- rechts
        if (sr = x"03") then -- 1 Takt Latency
           r<='0'; 
        end if;
        sr <= '0' & sr(7 downto 1); -- so z.B. sieht in VHDL ein Schieberegister nach rechts aus ;-)
      else            -- links
        if (sr = x"7F") then -- 1 Takt Latency
           r<='1'; 
        end if;
        sr <= sr(6 downto 0) & '1'; -- ein Schieberegister nach links
      end if;
    end if;
  end process;
  LED <= sr;
end VERHALTEN;

EDIT:
Den mittleren Teil könntest du auch so schreiben, es ist lesbarer, 
allerdings weniger eiffizient in der Implementierung:
      if (r='1') then -- rechts
        if (sr = x"01") then
           r  <= '0'; 
           sr <= x"03";
        else
           sr <= '0' & sr(7 downto 1); -- Schieberegister nach rechts
        end if;
      else            -- links
        if (sr = x"FF") then
           r  <= '1'; 
           sr <= x"7F";
        else
           sr <= sr(6 downto 0) & '1'; -- Schieberegister nach links
        end if;
      end if;

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnell antwort das hat mir sehr geholfen und funktioniert 
jetzt.

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.