如何在VHDL中合成流程中的循环?

时间:2013-04-09 21:48:11

标签: vhdl fpga

我正在研究在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;

2 个答案:

答案 0 :(得分:3)

它将是平行的。它基本上必须是因为整个循环(过程中的所有内容,实际上)必须在硬件中以单个时钟周期运行。

但是,我很好奇。既然你已经努力写出整个过程,为什么不把它与你最喜欢的合成器合成呢?这就是我做的,检查我的答案。

答案 1 :(得分:2)

一旦一个进程开始执行(由于其敏感性列表中某个信号发生了变化),它必须运行直到它挂起,或者到达结尾,或者到达wait语句。

由于这个定义的行为,循环将“执行”它们的所有代码,直到它们退出,然后才允许在模拟器中移动时间。因此,合成器将通过展开所有循环并确保“一次全部发生”(或者至少在时钟周期内为像您这样的定时进程)创建相同的行为。