【发布时间】:2017-03-17 22:47:20
【问题描述】:
我在 VHDL 中编写了一个简单的实体来闪烁 LED,并尝试在 ModelSim 中对其进行仿真,但在输出上没有任何转换。
这是我的 LED_Blink 实体的 HDL 文件:
Library IEEE;
use IEEE.Std_logic_1164.all;
entity LED_Blink is
generic (
g_SYSTEM_CLOCK_PERIOD : in time := 10 ns; -- 100 MHz clock period
g_LED_ON_TIME : in time := 1 sec
);
port(
system_clock : in Std_logic;
reset_fpga_L : in Std_logic;
led_out : out Std_logic
);
end entity LED_Blink;
architecture RTL of LED_Blink is
signal led_state : Std_logic;
constant COUNTER_RELOAD_VAL : natural := g_LED_ON_TIME/g_SYSTEM_CLOCK_PERIOD;
begin
process(reset_fpga_L, system_clock)
variable counter : natural range 0 to COUNTER_RELOAD_VAL := COUNTER_RELOAD_VAL;
begin
if reset_fpga_L = '0' then
counter := COUNTER_RELOAD_VAL;
led_state <= '0';
elsif rising_edge(system_clock) then
if counter = 0 then
led_state <= not led_state;
counter := COUNTER_RELOAD_VAL;
else
counter := counter - 1;
end if;
end if;
led_out <= led_state;
end process;
end architecture RTL;
这是我的测试台:
Library IEEE;
use IEEE.Std_logic_1164.all;
entity LED_Blink_TB is
end entity LED_Blink_TB;
architecture RTL of LED_Blink_TB is
signal reset_fpga_L : Std_logic := '0';
signal system_clock : Std_logic := '0';
signal led_out : Std_logic := '0';
begin
G1: entity work.LED_Blink(RTL) port map(reset_fpga_L, system_clock, led_out);
CLK: process
begin
while now <= 5 sec loop
system_clock <= not system_clock;
wait for 5 ns;
end loop;
wait;
end process CLK;
STIM: process
begin
reset_fpga_L <= '0';
wait for 100 ns;
reset_fpga_L <= '1';
wait for 4 sec;
reset_fpga_L <= '0';
wait for 50 ns;
reset_fpga_L <= '1';
wait;
end process STIM;
end architecture RTL;
当我在模拟器中运行我的测试台时,我无法弄清楚为什么在 led_out 上没有看到任何转换。我注意将system_clock、reset_fpga_L 和led_out 的波形添加到跟踪视图中。您在我的代码中看到任何可能存在问题的内容吗?感谢您的帮助。
【问题讨论】:
-
我能看到的唯一问题是 1 秒是一个非常多的模拟时间......我将 LED_ON_TIME 设置为 1 ms 甚至 10 us 在通用映射中的实体实例化测试台。
-
刚刚试了一下,结果一样
-
您还会注意到 led_out 上的半时钟延迟,因为它位于对时钟敏感的进程中,而不是并发信号分配或单独进程中。
-
@user1155120:你的测试台提醒我我的测试台中有一个问题,我的端口映射有
system_clock和reset_fpga_L交换。请提交对此的答复,以便我奖励您发现此问题的功劳。证明魔鬼确实在细节中。谢谢。