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;
> 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) ;
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
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; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.