Ik heb de volgende VHDL testbench code (zie hieronder) en ik probeer een eenvoudig FOR loop te maken waarbij
L_ADDRESS : std_logic_vector(4 downto 0);
wordt doorlopen:
Heeft iemand enig idee hoe ik dit kan implementeren??
Ik las iets over GENERATE / FOR, en heb een poging gewaagd zie hieronder.
Ergens doe ik iets verkeerd, maar waar?
----------------------------------------------------------
--VHDL Test Bench--
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.numeric_std.ALL;
ENTITY testbench IS
END testbench;
ARCHITECTURE behavior OF testbench IS
COMPONENT SDPRAM
PORT(
L_CLK : IN std_logic;
L_ADDRESS : IN std_logic_vector(4 downto 0);
L_CS : IN std_logic;
L_WE : IN std_logic;
L_OE : IN std_logic;
);
END COMPONENT;
SIGNAL L_CLK : std_logic;
SIGNAL L_ADDRESS : std_logic_vector(4 downto 0);
SIGNAL L_DATA : std_logic_vector(15 downto 0);
SIGNAL L_CS : std_logic;
SIGNAL L_WE : std_logic;
SIGNAL L_OE : std_logic;
BEGIN
uut: SDPRAM PORT MAP(
L_CLK => L_CLK,
L_ADDRESS => L_ADDRESS,
L_DATA => L_DATA,
L_CS => L_CS,
L_WE => L_WE,
L_OE => L_OE
);
--Clock generator L_CLK:24MHz --> periode time T = 1/F =>42ns
CLOCK_GENERATOR : PROCESS
BEGIN
L_CLK <= '1';
wait for 21 ns;
L_CLK <= '0';
wait for 21 ns;
END PROCESS;
--GENERATE / FOR statement--
G1: FOR i IN L_ADDRESS'RANGE GENERATE
L_ADDRESS(i) <= L_ADDRESS(i);
END GENERATE;
tb : PROCESS
BEGIN
L_ADDRESS <= i; --elke 50 ns laat die andere waarde zien
wait for 50 ns;
END PROCESS;
END;
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Generate heb je niet nodig. Het kan gewoon zo:
process begin
for i in 7 downto 0 loop
p <= i;
wait for 1ms;
end loop;
end process;
Die wait heb ik even in pseudocode opgeschreven. Ben de syntax zo even kwijt. De wait is nodig omdat anders alle iteraties van de loop in één keer wordt uitgevoerd en alleen de laatste p<=i blijft dan over. Hier heb ik een delay van 1ms gebruikt zodat p telkens een hogere waarde krijgt na 1ms.
Je moet er ook nog wel even een proces omheen zetten.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Zie code update. Had je ook zelf op kunnen zoeken. Probeer anders als eerste je simulatie aan de gang te krijgen, dan kun je in de waveforms zien wat je instructies doen. En zoek een VHDL cookbook oid op internet.
[Bericht gewijzigd door flipflop op (62%)]
tb : PROCESS
BEGIN
for i in 5 downto 0 loop
L_ADDRESS <= CONV_STD_LOGIC_VECTOR ((i+1),8);
wait for 100 ns;
end loop;
Om even terug te komen op mijn forum post een aantal weken geleden.
Ben ik er nog niet helemaal uit.
Ik heb de volgende process in mijn testbench (Zie hieronder)
-----------------------------------
tb : PROCESS
BEGIN
for i in 31 downto 0 loop
L_ADDRESS <= CONV_STD_LOGIC_VECTOR ((i+1),8);
wait for 100 ns;
end loop;
wait for 100 ns;
L_ADDRESS <= "00000";
L_DATA_UB <= "11111111";
L_DATA_LB <= "11111111";
L_CS <= '0';
L_WE <= '0';
L_UBE <= '0';
L_LBE <= '0';
wait for 100 ns;
C_ADDRESS <= "11111";
C_CS <= '0';
C_OE <= '0';
wait for 200 ns;
END PROCESS;
---------------------------------------------
Mijn bedoeling is om alle combinaties van L_ADDRESS door te lopen.
Het compileren van de code gaat goed.
Alleen bij de simulatie in Modelsim krijg ik de volgende melding:
"# Fatal error in ForLoop loop"
Kan iemand mij vertellen wat er mis gaat?
Om even terug te komen op mijn forum post een aantal weken geleden.
Ben ik er nog niet helemaal uit.
Ik heb de volgende process in mijn testbench (Zie hieronder)
-----------------------------------
tb : PROCESS
BEGIN
for i in 31 downto 0 loop
L_ADDRESS <= CONV_STD_LOGIC_VECTOR ((i+1),8);
wait for 100 ns;
end loop;
wait for 100 ns;
L_ADDRESS <= "00000";
L_DATA_UB <= "11111111";
L_DATA_LB <= "11111111";
L_CS <= '0';
L_WE <= '0';
L_UBE <= '0';
L_LBE <= '0';
wait for 100 ns;
C_ADDRESS <= "11111";
C_CS <= '0';
C_OE <= '0';
wait for 200 ns;
END PROCESS;
---------------------------------------------
Mijn bedoeling is om alle combinaties van L_ADDRESS door te lopen.
Het compileren van de code gaat goed.
Alleen bij de simulatie in Modelsim krijg ik de volgende melding:
"# Fatal error in ForLoop loop"
Kan iemand mij vertellen wat er mis gaat?
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Hoe heb je L_ADDRESS gedeclareerd? Hoeveel bits? Bij de ene assignment staat "00000", dus 5 bits, terwijl je in de loop uitgaat van 8 bits.
Ik ben er inmiddels uit.
Ik had mijn address lijnen verward met data lijnen.
Het werkt nu goed en heb ik inmiddels nog een FOR loop met de datalijnen, zodat je een geneste FOR loop krijgt die alle address en data combinatie doorloopt.
Bedankt.
tb : PROCESS
BEGIN
for x in 0 to 256 loop
L_DATA_UB <= CONV_STD_LOGIC_VECTOR (x,8);
L_DATA_LB <= CONV_STD_LOGIC_VECTOR (x,8);
for i in 0 to 31 loop
L_ADDRESS <= CONV_STD_LOGIC_VECTOR (i,5);
C_ADDRESS <= CONV_STD_LOGIC_VECTOR (i,5);
wait for 20 ns;
L_CS <= '0';
L_UBE <= '0';
L_LBE <= '0';
L_WE <= '0';
wait for 50 ns;
L_CS <= '1';
L_UBE <= '1';
L_LBE <= '1';
L_WE <= '1';
wait for 20 ns;
C_CS <= '0';
C_OE <= '0';
wait for 50 ns;
end loop;
end loop;