vhdl - 简单 VHDL 电路的意外行为

标签 vhdl delay behavior

模拟器中信号Q_VLD1和Q_VLD2延迟不同的原因是什么?
Result of simulation.是否是模拟器的预期行为?

我使用赛灵思 Isim。
有它的代码和测试平台:

entity assign_test is
    port(CLK   : in  STD_LOGIC;
         D_VLD : in  STD_LOGIC;
         Q_VLD1 : out STD_LOGIC;
         Q_VLD2 : out STD_LOGIC
    );
end assign_test;

architecture Behavioral of assign_test is
    signal D_VLD_i : std_logic;
    signal d_vld_dly1 : std_logic;
    signal d_vld_dly2 : std_logic;
begin
    D_VLD_i <= D_VLD;

    process (clk) is
    begin
        if rising_edge(clk) then
            d_vld_dly1 <= D_VLD;
            d_vld_dly2 <= D_VLD_i;
        end if;
    end process ;

    Q_VLD1 <= d_vld_dly1;
    Q_VLD2 <= d_vld_dly2;
end Behavioral;


ENTITY tb_assign_test IS
END tb_assign_test;
ARCHITECTURE behavior OF tb_assign_test IS 

    COMPONENT assign_test
    PORT(
         CLK : IN  std_logic;
         D_VLD : IN  std_logic;
         Q_VLD1 : OUT  std_logic;
         Q_VLD2 : OUT  std_logic
        );
    END COMPONENT;

   --Inputs
   signal CLK : std_logic := '0';
   signal D_VLD : std_logic := '0';
    --Outputs
   signal Q_VLD1 : std_logic;
   signal Q_VLD2 : std_logic;
   constant CLK_period : time := 10 ns;

BEGIN 
   uut: assign_test PORT MAP (
          CLK => CLK,
          D_VLD => D_VLD,
          Q_VLD1 => Q_VLD1,
          Q_VLD2 => Q_VLD2
        );

   CLK_process :process
   begin
        CLK <= '0';
        wait for CLK_period/2;
        CLK <= '1';
        wait for CLK_period/2;
   end process;

   stim_proc: process
   begin        
      wait for 100 ns;  
      wait for 5 ns;    
      wait for CLK_period*10;
      D_VLD <= '1';
      wait for CLK_period*3;
      D_VLD <= '0';
      wait;
   end process;
END;

最佳答案

因此,如果您查看 assign_test 中的内部信号模块,仅基于仿真时间,可能如下图所示(d_vld_dly* 在分配给 Q_VLD* 之前)。

enter image description here

但该数字具有误导性,因为该数字未显示 VHDL concept of delta delay .如果扩展波形以显示增量延迟(在本例中使用 ModelSim),则如下所示。

enter image description here

所以这表明 D_VLD_i <= D_VLD;assign_test实际上延迟了D_VLD_i一个增量延迟,因此直到下一个时钟上升沿才能在时钟上看到新值。

出现这个问题的原因是测试台没有将输入数据生成为。原因 时钟,这将使数据在时钟后延迟一个增量,但独立且在同一仿真时间与时钟相同的增量延迟。

可以更新测试台以将数据生成为 原因 时钟,如果等待时钟从:

wait for CLK_period*10;

到:
for i in 1 to 10 loop
  wait until rising_edge(CLK);
end loop;

然后将给出一个波形:

enter image description here

所以基于此,良好的测试台设计的一个规则是生成刺激的方式与在合成模块中生成数据的方式相同,因此来自测试台的刺激通常就像模块之间的数据一样,以获得预期和可靠的测试板凳行为。

关于vhdl - 简单 VHDL 电路的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36126690/

相关文章:

vhdl - 和 VHDL 中 n 位数组的所有元素

jquery - 向 jquery 下拉菜单添加延迟

android - 使用 CollapsingToolbarLayout 时更改 FloatingButton 的行为

C# - foreach 表现出奇怪的行为/工作没有问题

wcf - 在 WCF REST 4.0 中使用 StandardEndpoints 时如何配置 MessageInspector

vhdl - "if" block 是否有可能超出 vhdl 中的给定选择?

vhdl - vivado block 设计器在修改 verilog 或 vhdl RTL 文件后不更新 block 设计中的 RTL 接口(interface)

VHDL:按钮去抖动(或不去抖动,视情况而定)

javascript - Jquery 和 CSS3 旋转

javascript - 用jquery延迟一个对象的方法