Schiebregister in VHDL

Gast #1179644
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;
Angehängte Dateien:
#1179687
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) ;
Gast #1179892
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
Moderator (Firma: Titel) Persönliche Seite #1180016
Lesenswert?
• ▲
▼
Dein clk_new müsste eigentlich clk_old heißen.
Probiers mal so:
1
:
2
signal clk_new  : std_logic;
3
signal r        : std_logic := '0'; -- nach rechts schieben 
4
signal sr       : std_logic_vector (7 downto 0) := x"01";
5
:
6
begin
7
  process begin  -- reset ist unnötig, Defaultwerte werden bereits bei der Definition angegeben
8
    wait until rising_edge(clk);
9
    clk_old<=clk_in;                     -- besser wäre hier ein Clock-Enable von aussen
10
    if (clk_old='1' and clk_in='0') then -- aber was solls, machen wirs lokal: fallende Flanke
11
      if (r='1') then -- rechts
12
        if (sr = x"03") then -- 1 Takt Latency
13
           r<='0'; 
14
        end if;
15
        sr <= '0' & sr(7 downto 1); -- so z.B. sieht in VHDL ein Schieberegister nach rechts aus ;-)
16
      else            -- links
17
        if (sr = x"7F") then -- 1 Takt Latency
18
           r<='1'; 
19
        end if;
20
        sr <= sr(6 downto 0) & '1'; -- ein Schieberegister nach links
21
      end if;
22
    end if;
23
  end process;
24
  LED <= sr;
25
end VERHALTEN;

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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.