ModelSim模拟器中实体没有输出-VHDL

ModelSim模拟器中实体没有输出-VHDL,vhdl,modelsim,Vhdl,Modelsim,我已经用VHDL编写了一个简单的实体来闪烁LED,并试图在ModelSim中模拟它,但在输出上没有得到转换 这是我的LED闪烁实体的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 :

我已经用VHDL编写了一个简单的实体来闪烁LED,并试图在ModelSim中模拟它,但在输出上没有得到转换

这是我的
LED闪烁
实体的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;
IEEE库;
使用IEEE.Std_logic_1164.all;
实体LED_闪烁为
一般的(
g_系统时钟周期:时间:=10 ns;--100 MHz时钟周期
g_LED_开启时间:及时:=1秒
);
港口(
系统时钟:标准逻辑;
复位fpga:标准逻辑中;
led输出:输出标准逻辑
);
结束实体LED_闪烁;
LED闪烁的体系结构RTL为
信号led_状态:标准_逻辑;
常量计数器\u重新加载\u值:自然:=g\u LED\u开启时间/g\u系统\u时钟\u周期;
开始
过程(重置fpga、系统时钟)
变量计数器:自然范围0到计数器重新加载值:=计数器重新加载值;
开始
如果reset\u fpga\u L='0',则
计数器:=计数器重新加载值;

led_状态可以使用第二种形式的测试台,使led_闪烁输入的生成取决于作为泛型提供的值:

library ieee;
use ieee.std_logic_1164.all;

entity led_blink_tb is
end entity;

architecture foo of led_blink_tb is
    constant CLK_PERIOD:    time := 100 ms;
    constant LED_ON:        time := 500 ms;
    signal clk:             std_logic := '0';
    signal reset_n:         std_logic;
    signal led:             std_logic;
begin
DUT:
    entity work.led_blink
        generic map ( CLK_PERIOD, LED_ON)
        port map (
            system_clock => clk,
            reset_fpga_l => reset_n,
            led_out => led
        );
CLOCK:
    process
    begin
        wait for CLK_PERIOD/2;
        clk <= not clk;
        if now > 2.5 sec then
            wait;
        end if;
    end process;
STIMULI:
    process
    begin
        reset_n <= '0';
        wait for CLK_PERIOD * 2;
        reset_n <= '1';
        wait;
    end process;
end architecture;
我们可以看到,与正式系统时钟的第一个位置关联与实际复位fpga时钟相关联,而表示正式复位fpga时钟的第二个位置关联与实际系统时钟相关联


这两个实际关联的顺序是相反的。

我能看到的唯一问题是,1秒是一个非常大的模拟时间。。。在测试台的实体实例化中,我在泛型映射中将LED_ON_TIME设置为1ms甚至10us。只是尝试了一下,结果相同,与泛型设置为100ms时钟周期和500ms LED_的结果略有不同,你明白了。模拟的工作量取决于转换的次数。您还将注意到led_out上的半时钟延迟,因为它位于对时钟敏感的进程中,而不是在并发信号分配中,或者位于单独的进程中。@user1155120:您的测试台提醒我测试台中的一个问题,其中我的端口映射有
系统时钟
reset\u fpga\u L
交换。请提交一份这样的答复,以便我可以奖励您发现此问题的功劳。证明魔鬼确实存在于细节中。非常感谢。
library ieee;
use ieee.std_logic_1164.all;

entity led_blink_tb is
end entity;

architecture foo of led_blink_tb is
    constant CLK_PERIOD:    time := 100 ms;
    constant LED_ON:        time := 500 ms;
    signal clk:             std_logic := '0';
    signal reset_n:         std_logic;
    signal led:             std_logic;
begin
DUT:
    entity work.led_blink
        generic map ( CLK_PERIOD, LED_ON)
        port map (
            system_clock => clk,
            reset_fpga_l => reset_n,
            led_out => led
        );
CLOCK:
    process
    begin
        wait for CLK_PERIOD/2;
        clk <= not clk;
        if now > 2.5 sec then
            wait;
        end if;
    end process;
STIMULI:
    process
    begin
        reset_n <= '0';
        wait for CLK_PERIOD * 2;
        reset_n <= '1';
        wait;
    end process;
end architecture;
G1: entity work.LED_Blink(RTL) port map(reset_fpga_L, system_clock, led_out);