【问题标题】:No Output From Entity in ModelSim Simulator - VHDLModelSim 模拟器中的实体没有输出 - VHDL
【发布时间】: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_clockreset_fpga_Lled_out 的波形添加到跟踪视图中。您在我的代码中看到任何可能存在问题的内容吗?感谢您的帮助。

【问题讨论】:

  • 我能看到的唯一问题是 1 秒是一个非常多的模拟时间......我将 LED_ON_TIME 设置为 1 ms 甚至 10 us 在通用映射中的实体实例化测试台。
  • 刚刚试了一下,结果一样
  • testbench 稍有不同,泛型设置为 100 毫秒时钟周期和 500 毫秒 led_on,你会得到这个 waveform。模拟的工作量取决于转换的次数。
  • 您还会注意到 led_out 上的半时钟延迟,因为它位于对时钟敏感的进程中,而不是并发信号分配或单独进程中。
  • @user1155120:你的测试台提醒我我的测试台中有一个问题,我的端口映射有system_clockreset_fpga_L 交换。请提交对此的答复,以便我奖励您发现此问题的功劳。证明魔鬼确实在细节中。谢谢。

标签: vhdl modelsim


【解决方案1】:

测试台的第二种形式可用于生成 LED_Blink 的输入取决于作为泛型提供的值:

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);

我们看到与正式的 system_clock 的第一个位置关联与实际的 reset_fpga_L 相关联,而表示正式的 reset_fpga_L 的第二个位置关联与实际的 system_clock 相关联。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多