如何在VHDL时钟进程内实现中间信号的单周期运算?
单周期实现方案(全逻辑保留在进程内)
可以在进程内部使用变量替代信号作为中间计算量,实现单周期内完成从A到B的计算,所有逻辑都能封装在同一个时钟进程里。
原理说明
VHDL中,进程内的信号赋值是延迟更新的——同一时钟沿下,信号的新值要等进程执行完毕后才会生效。这就导致原来的写法里,B在当前时钟沿只能取到A_rounded的旧值,必须等到下一个时钟沿A_rounded更新后,B才能得到基于A新值的结果,因此需要两个周期。
而变量是即时赋值的,在进程内完成计算后就能立即用于后续运算,因此可以在同一个时钟沿内完成全部逻辑,只需要一个周期就能让B反映A的新值。
代码实现
process(clk) -- 定义与A同类型同位宽的中间变量,根据实际需求调整位宽 variable A_rounded_var : signed(31 downto 0); begin if rising_edge(clk) then -- 先计算中间变量(即时赋值) A_rounded_var := A + shift_left(to_signed(1, 32), 28-InputFracPart); -- 直接用变量计算B,同一时钟沿完成赋值 B <= shift_right(A_rounded_var, 29-InputFracPart); -- 如果需要对外暴露中间计算结果,可同时赋值给信号 -- A_rounded <= A_rounded_var; end if; end process;
补充说明
- 如果中间计算结果
A_rounded不需要在该进程外使用,只用变量即可,完全满足“全逻辑在进程内”的需求; - 如果需要将
A_rounded作为外部可用信号,只需在进程内增加一行信号赋值(如上注释行),依然能保持单周期的逻辑延迟。
内容的提问来源于stack exchange,提问作者SaltTuk
相关产品推荐
相关产品推荐

