You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VHDL模块复位延迟优化:如何将延迟控制在1个时钟周期内

解决VHDL顶层模块中子模块复位延迟超预期问题

问题背景

我设计了包含MVM子模块的顶层Layer模块,需求是多个子模块在初始阶段按不同时序复位。但仿真显示MVM模块要等到第3个时钟周期才能接收数据,产生了2个周期的延迟,而我预期最多仅1个周期延迟,且不能直接将顶层RST端口与子模块RST端口相连。

相关代码

顶层Layer模块代码

entity Layer is
port (
CLK: IN std_logic; -- Clock
DIN: IN std_logic;
RST: IN std_logic -- Reset
); -- Data 
end Layer;

architecture Behavioral of Layer is -- 修正语法错误:原代码漏写of

component MVM
port (
CLK: IN std_logic; -- Clock
DIN: IN std_logic; -- Data 
RST: IN std_logic -- Reset
);
end component;

signal MVM_RST: std_logic;
-- 修正语法错误:添加实例化标签
u_mvm: MVM port MAP( DIN => DIN, CLK  => CLK, RST => MVM_RST);

process(CLK) is
begin 
 if rising_edge(CLK) then
    IF RST='1' then
        MVM_RST   <= '1';            
    ELSE
        MVM_RST   <= '0';
    END IF;
END IF;
END PROCESS;   
end Behavioral;

MVM模块核心逻辑

-- 注:该逻辑应位于时钟触发的进程内(同步复位)
IF RST='1' THEN
    MVM_RESULT <= '0'; 
ELSE 
    MVM_RESULT <= DIN;
END IF;

测试平台代码

entity tb_Layer is
end tb_Layer;

architecture TEST of tb_Layer is

    component Layer is
        port(
          CLK,DIN, RST: IN std_logic; 
        );
    end component;
    signal CLK, DIN, RST: std_logic; 
BEGIN          
 uut: Layer PORT MAP(
     CLK=> CLK, DIN => DIN, RST=> RST); 
    tb: process
        BEGIN
            CLK <= '0';
            RST <= '1';
            DIN <= '0';
            wait for 100ns;
            CLK <= '1';
            wait for 100ns;
            RST <= '0';
            CLK <= '0';
            DIN <= '1';
            wait for 100ns;
            CLK <= '1';
            wait for 100ns;
            CLK <= '0';
            DIN <= '0';
            wait for 100ns;
            CLK <= '1';
            wait for 100ns;
        END PROCESS;   
end TEST;

延迟原因分析

当前MVM_RST是通过时钟上升沿触发的同步进程赋值的,导致复位信号的变化滞后于顶层RST的变化一个时钟周期:

  1. 第一个时钟上升沿(100ns处):顶层RST为1,MVM_RST被赋值为1;
  2. 顶层RST在200ns处变为0,但MVM_RST要等到第二个时钟上升沿(300ns处)才会被赋值为0;
  3. MVM在第二个时钟上升沿才退出复位,只能在第三个时钟上升沿(500ns处)捕获DIN数据,最终产生2个周期的延迟。

解决方案

将MVM_RST的生成逻辑改为组合逻辑进程,让MVM_RST随顶层RST的变化立即更新,无需等待时钟沿。这样既满足“不同子模块不同时序复位”的需求,又能把延迟控制在1个周期内。

修改后的顶层模块代码(关键部分)

signal MVM_RST: std_logic;
u_mvm: MVM port MAP( DIN => DIN, CLK  => CLK, RST => MVM_RST);

-- 替换原同步进程为组合逻辑进程
process(RST) is
begin 
    IF RST='1' then
        MVM_RST <= '1';            
    ELSE
        MVM_RST <= '0';
    END IF;
END PROCESS;

效果说明

修改后:

  • 当顶层RST在200ns处变为0时,MVM_RST会立即同步变为0;
  • 第二个时钟上升沿(300ns处),MVM退出复位并捕获此时的DIN(值为1);
  • 仅产生1个周期的延迟,符合预期。

额外说明

如果顶层RST是异步信号(可能存在亚稳态风险),可以采用异步复位同步释放的方式优化,但针对当前测试场景中RST为同步释放的情况,组合逻辑方案已足够简洁有效。

内容的提问来源于stack exchange,提问作者hajo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:31:14