我正在研究在VHDL中实现FIR滤波器,并且需要一些关于何时使用和不使用流程语句的建议。部分代码如下所示。具体来说,我正在研究resetCoeffs
循环将如何合成。它会是一个顺序复位,所以我认为速度和面积都非常低,或者它会并行完成吗?如果是前者,我将如何编写它以便可以并行重置。
process (clk) is begin
if rising_edge(clk) then
if rst = '1' then
-- Reset pointer
ptr <= (others => '0');
-- Reset coefficients
resetCoeffs: for i in 0 to ORDER - 1 loop
coeffs(i) <= (others => '0');
end loop;
else
-- Increment pointer
ptr <= ptr + 1;
-- Fetch input value
vals( to_integer(ptr) ) <= ival;
-- Write coefficient
if coeff_wen = '1' then
coeffs( to_integer(ptr) ) <= ival;
end if;
end if;
end if;
end process;
答案 0 :(得分:3)
它将是平行的。它基本上必须是因为整个循环(过程中的所有内容,实际上)必须在硬件中以单个时钟周期运行。
但是,我很好奇。既然你已经努力写出整个过程,为什么不把它与你最喜欢的合成器合成呢?这就是我做的,检查我的答案。答案 1 :(得分:2)
一旦一个进程开始执行(由于其敏感性列表中某个信号发生了变化),它必须运行直到它挂起,或者到达结尾,或者到达wait
语句。
由于这个定义的行为,循环将“执行”它们的所有代码,直到它们退出,然后才允许在模拟器中移动时间。因此,合成器将通过展开所有循环并确保“一次全部发生”(或者至少在时钟周期内为像您这样的定时进程)创建相同的行为。