Forum: FPGA, VHDL & Co. Schiebregister in VHDL


von ingo (Gast)


Angehängte Dateien:

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;

von Jan M. (mueschel)


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) ;

von ingo (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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;

von Ingo (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.