Hallo ich habe eine Aufgabe im Studium und finde meinen Fehler nicht.
Ich sollte den Code ergänzen, aber verstehe meinen Fehler nicht so ganz.
Die Klasse die wir bearbeiten sollten:
------------------------------------------------------------------------
----
------------------------------------------------------------------------
--------
library ieee;
use ieee.std_logic_1164.all;
entity ModuloCounter is
generic (
N : integer; -- Wortbreite des
Zaehlers
MAX : integer -- Maximaler
Zaehlerstand
);
port (
Clk : in std_logic;
En : in std_logic;
Q : out std_logic_vector(N-1 downto 0); -- Zaehlerstand
TC : out std_logic -- Zaehlende
);
end entity;
library ieee;
use ieee.numeric_std.all;
architecture rtl of ModuloCounter is
begin
p: process(Clk)
variable cnt : unsigned(N-1 downto 0) := to_unsigned(0, N);
begin
if rising_edge(Clk) then
//Von Hier://
if En='1' then
cnt := cnt + 1;
end if;
Q <= std_logic_vector(cnt);
if cnt=2**n-1 then
TC <= '1';
else
TC <= '0';
end if;
//Bis Hier ist mein Code//
end if;
end process;
end architecture;
Und die Klasse Mit den Tests:
------------------------------------------------------------------------
----
------------------------------------------------------------------------
--------
entity ModuloCounter_tb is
end entity;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
architecture tb of ModuloCounter_tb is
constant CLK_PERIOD : time := 10 ns;
constant N : integer := 3;
constant MAX : integer := 5;
signal Clk : std_logic;
signal En : std_logic := '0';
signal Q : std_logic_vector(N-1 downto 0);
signal TC : std_logic;
begin
uut: entity work.ModuloCounter
generic map(
N => N,
MAX => MAX
)
port map(
Clk => Clk,
En => En,
Q => Q,
TC => TC
);
clk_proc: process
begin
Clk <= '0';
wait for CLK_PERIOD / 2;
Clk <= '1';
wait for CLK_PERIOD / 2;
end process;
suv_proc: process
begin
wait until falling_edge(Clk);
report "Aufwaerts zaehlen ..." severity note;
En <= '1';
for i in 1 to 3 loop
wait until falling_edge(Clk);
assert unsigned(Q) = i report "Falscher Wert fuer Q"
severity failure;
assert TC = '0' report "Falscher Wert fuer TC" severity
failure;
end loop;
report "Warten ..." severity note;
En <= '0';
wait until falling_edge(Clk);
assert unsigned(Q) = 3 report "Falscher Wert fuer Q" severity
failure;
assert TC = '0' report "Falscher Wert fuer TC" severity failure;
report "Weiterzaehlen ..." severity note;
En <= '1';
wait until falling_edge(Clk);
assert unsigned(Q) = 4 report "Falscher Wert fuer Q" severity
failure;
assert TC = '0' report "Falscher Wert fuer TC" severity failure;
wait until falling_edge(Clk);
assert unsigned(Q) = 5 report "Falscher Wert fuer Q" severity
failure;
assert TC = '1' report "Falscher Wert fuer TC" severity failure;
report "Warten ..." severity note;
En <= '0';
wait until falling_edge(Clk);
assert unsigned(Q) = 5 report "Falscher Wert fuer Q" severity
failure;
assert TC = '1' report "Falscher Wert fuer TC" severity failure;
report "Weiterzaehlen ..." severity note;
En <= '1';
wait until falling_edge(Clk);
assert unsigned(Q) = 0 report "Falscher Wert fuer Q" severity
failure;
assert TC = '0' report "Falscher Wert fuer TC" severity failure;
En <= '0';
report "Alle Tests abgeschlossen";
wait;
end process;
end architecture;
Hallo, und was ist dein Fehler? Was genau geht nicht? Das müsstest du noch genauer beschreiben. Was mir aufgefallen ist: Du definierst eine Variable innerhalb eines Prozesses (variable cnt : unsigned(N-1 downto 0) := to_unsigned(0, N);). Das habe ich bisher noch nicht so gesehen. Die werden normalerweise weiter oben in der architecture definiert. Grüße, Jens
Jens schrieb: > Du definierst eine Variable innerhalb eines Prozesses (variable cnt : > unsigned(N-1 downto 0) := to_unsigned(0, N);). Das habe ich bisher noch > nicht so gesehen. ist aber so nicht unüblich. Jens schrieb: > Die werden normalerweise weiter oben in der architecture definiert. wenn ich eine "einfache" Variable im Deklarationsteil der architecture deklarieren will, kreidet das die ISE mit "Only SHARED variables can be declared here." als Fehler an. Jens schrieb: > und was ist dein Fehler? Was genau geht nicht? > Das müsstest du noch genauer beschreiben. stimmt, das fehlt im Eröffnungsbeitrag. In welcher Richtung das Problem vielleicht liegen könnte: der Modulocounter ist mit einem generic "MAX : integer -- Maximaler Zaehlerstand" versehen. Das wird in der Komponente des TO nicht berücksichtigt.
Hallo Achim, dann hab ich wieder was dazu gelernt. Danke dir! Ich verwende eigentlich keine Variablen, sondern nur Signale. Bei meinen Designs bin ich bisher damit ausgekommen. Grüße, Jens
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.