2

我正在用 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;
4

2 回答 2

3

这将是并行的。它基本上必须是因为整个循环(过程中的一切,真的)必须在硬件的单个时钟周期内运行。

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

于 2013-04-09T23:14:39.960 回答
2

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

由于这种定义的行为,循环将“执行”它们的所有代码,直到它们在允许时间在模拟器中继续前进之前退出。因此,合成器将通过展开所有循环并确保它“全部同时发生”(或至少在像您这样的时钟进程的时钟滴答内)来创建相同的行为。

于 2013-04-10T09:22:07.347 回答