我是 VHDL、Quartus II 和 ModelSim 的新手。现在我正在做一个实验室,我们正在构建一个闪烁的 LED。施工时间较长时,应如何处理模拟。闪烁 LED 的频率为 1 Hz,我正在使用的开发板上的时钟(Terasic DE2-115)为 50 MHz。在代码中,我正在计算时钟脉冲并相应地打开 LED。然而,当我想用 ModelSim 验证我的代码时,我遇到了处理时间长达几秒钟的麻烦。所以我通过将代码中的周期更改为几个时钟周期来解决它,以查看波的行为是否符合预期。对于最终编译,我只需更改对应于 1 秒的计数值。
但应该有更好的方法。我真的不想在模拟后触摸 VHDL 代码。在处理接近 1 ms 或更高的时间段时,我是否应该使用两个 rtl,一个用于合成,一个用于模拟?
VHDL 代码
library ieee;
use ieee.std_logic_1164.all;
entity lab4 is
port( CLOCK_50 : in std_logic; -- DE2-115 internal clock
KEY : in std_logic_vector(0 downto 0); -- Push-buttons, active 0
-- KEY(0) as reset
LEDG : out std_logic_vector(7 downto 0)); -- Green LEDs
end entity lab4;
architecture lab4_rtl of lab4 is
signal RESET_N : std_logic;
begin
-- Parallel VHDL
constant CLK_FRQ : integer := 50000000;
RESET_N <= KEY(0); -- Here we connect reset to a push-button
-- synch process with asynch reset, i.e. reset as soon as reset is active
p1 : process(CLOCK_50, RESET_N)
variable counter : integer := 0;
variable led_num : integer := 0;
begin
-- reset part
if RESET_N = '0' then --KEY is active 0
counter := 0; --reset counter
LEDG(0) <= '0'; --turn OFF leds
-- synch part, updates depending on clock
elsif rising_edge(CLOCK_50) then
counter := counter + 1;
if counter < 50000000 then;
LEDG(0) <= '1';
elsif counter >= 50000000 AND counter < 100000000 then
LEDG(0) <= '0';
else
counter := 0;
end if;
end if;
end process p1;
end architecture lab4_rtl;