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的变化一个时钟周期:
- 第一个时钟上升沿(100ns处):顶层RST为1,MVM_RST被赋值为1;
- 顶层RST在200ns处变为0,但MVM_RST要等到第二个时钟上升沿(300ns处)才会被赋值为0;
- 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
相关产品推荐
相关产品推荐

