Gute morgen, Ich hab ein kleines Problem mit meinem Program... und zwar soll mein Zähler bis 16 Zählen und dann aufhören bis wieder ein Eingangsimpuls kommt.. Aber der zähler führt ne schleife aus und wiederholt sich ständig... if(clk 'event and clk = '1') then if(start='1') then count<="0000"; else CASE count IS WHEN "0000" => preset <= '1'; WHEN "0001" => preset <= '0'; WHEN "0010" => preset <= '0'; WHEN "0011" => preset <= '0'; WHEN "0100" => preset <= '0'; WHEN "0101" => preset <= '0'; WHEN "0110" => preset <= '0'; WHEN "0111" => preset <= '0'; WHEN "1000" => preset <= '0'; WHEN "1001" => reset <= '1'; WHEN "1010" => reset <= '1'; WHEN "1011" => reset <= '1'; WHEN "1100" => reset <= '1'; WHEN "1101" => reset <= '1'; WHEN "1110" => reset <= '1'; WHEN others => reset <= '0'; END CASE ; count <= count + "0001"; end if; Das 2 Prob ist, ich wenn ich statt "When others", "when "1111" schreibe bekomme ich eine Fehlermeldung, dass nicht alle Zählerzustände des zählers (3 downto 0) angegeben wurden ...
Ist dann "when others" = "1111" ? Weil wenn ich When others ne '1' zuweißse bekomm ich ständig nen reset und keinen Ausgang. Hier das ganze Prog. vll. wirds dann verständlicher: entity PRNG is Port ( clk : in STD_LOGIC; start : in STD_LOGIC; q_prng : out STD_LOGIC); end PRNG; architecture Behavioral of PRNG is signal qi : std_logic_vector(2 downto 0); signal reset : std_logic; signal preset : std_logic; signal count : std_logic_vector (3 downto 0); begin process (clk) begin if(clk 'event and clk = '1') then if(start='1') then count<="0000"; else CASE count IS WHEN "0000" => preset <= '1'; WHEN "0001" => preset <= '0'; WHEN "0010" => preset <= '0'; WHEN "0011" => preset <= '0'; WHEN "0100" => preset <= '0'; WHEN "0101" => preset <= '0'; WHEN "0110" => preset <= '0'; WHEN "0111" => preset <= '0'; WHEN "1000" => preset <= '0'; WHEN "1001" => reset <= '1'; WHEN "1010" => reset <= '1'; WHEN "1011" => reset <= '1'; WHEN "1100" => reset <= '1'; WHEN "1101" => reset <= '1'; WHEN "1110" => reset <= '1'; WHEN others => reset <= '0'; END CASE ; count <= count + "0001"; end if; qi(2) <= qi(0) xor qi(1); qi(1) <= qi(2); qi(0) <= qi(1); if reset = '1' then qi <= "000"; end if; if preset = '1' then qi <= "101"; end if; end if; end process; q_prng <= qi(1); end Behavioral;
Hier eine Antwort zu deinem ersten Posting: Zu Problem 2: Wenn du z.B. std_logic_vector verwendest, dann gibt es 9 verschiedene Zustände pro Bit. Wenn du z.B. 0 downto 0 für count angibst, dann kommt für folgenden Code kein Fehler mehr:
1 | WHEN "U" => preset <= '1'; |
2 | WHEN "X" => preset <= '1'; |
3 | WHEN "0" => preset <= '1'; |
4 | WHEN "1" => preset <= '1'; |
5 | WHEN "Z" => preset <= '1'; |
6 | WHEN "W" => preset <= '1'; |
7 | WHEN "L" => preset <= '1'; |
8 | WHEN "H" => preset <= '1'; |
9 | WHEN "-" => preset <= '1'; |
Zu deinem Hauptproblem: "count" zählt jeden Takt, solange start = 0 ist. In manchen Simulationsprogrammen führt das zu einem Fehler, wenn "count" überläuft, in Hardware schaltet es meist wieder auf 0 zurück, sodaß der Zähler also immer weiterläuft. Ich würde "natural" als Typ für "count" verwenden und das dann so schreiben:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | entity main is |
6 | port( |
7 | clk: in std_logic; |
8 | start: in std_logic; |
9 | preset: out std_logic; |
10 | reset: out std_logic |
11 | );
|
12 | end main; |
13 | |
14 | architecture rtl of main is |
15 | signal count: natural range 0 to 15; |
16 | begin
|
17 | process(clk) |
18 | begin
|
19 | if rising_edge(clk) then |
20 | if start = '1' then |
21 | count <= 0; |
22 | else
|
23 | case count is |
24 | when 0 => preset <= '1'; |
25 | when 1 to 8 => preset <= '0'; |
26 | when 9 to 14 => reset <= '1'; |
27 | when 15 => reset <= '0'; |
28 | end case; |
29 | if count < 15 then |
30 | count <= count + 1; |
31 | end if; |
32 | end if; |
33 | end if; |
34 | end process; |
35 | end architecture rtl; |
So wie du deinen Code ursprünglich formuliert hast, ist dir aber schon klar, daß "reset" erst nach einigen Zählschritten wieder auf 1 zurückgesetzt wird, wenn das nächste start-Signal kommt?
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.