VHDL:for循环,索引算法不起作用

时间:2016-10-03 05:22:46

标签: vhdl fpga modelsim quartus

我试图用我的DE0 Nano Altera FPGA板设置一个简单的强力卷积处理器。 这是我的代码的样子:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_bit.all;

ENTITY Convolution IS
    PORT(   clock : IN std_logic;
            audio_in : IN unsigned(15 downto 0);
            audio_out : OUT unsigned(31 downto 0) );    
END Convolution;

ARCHITECTURE Convolution_Core OF Convolution IS

    constant impulse_length : integer := 10;

    type array16 is array(0 to impulse_length-1) of unsigned(15 downto 0);
    type array32 is array(0 to impulse_length-1) of unsigned(31 downto 0);

    constant impulse : array16 :=   (x"FFFF", x"FFFE", x"FFFD", x"FFFC", 
                                                 x"FFFB", x"FFFA", x"FFF9", x"FFF8",
                                                 x"FFF7", x"FFF6");

    signal audio_buffer : array16 := (others=> (others=>'0'));

    signal seq_buffer : unsigned(31 downto 0);

BEGIN
    process(clock)
    begin
        if rising_edge(clock) then
            -- buffer the audio input in audio_buffer
            for i in 0 to (impulse_length-2) loop
                audio_buffer(i) <= audio_buffer(i+1);
            end loop;
            audio_buffer(impulse_length-1) <= audio_in;

            for i in 0 to (impulse_length-1) loop
                if i = 0 then
                    seq_buffer <= audio_buffer(i) * impulse(impulse_length-1-i);
                else
                    seq_buffer <= seq_buffer + audio_buffer(i) * impulse(impulse_length-1-i);
                end if;
            end loop;
        end if;
    end process;

    audio_out <= seq_buffer;

END Convolution_Core;

我的问题是:在连续的for循环期间,脉冲索引(impulse_length-1-i)不会减少,但audio_buffer(i)的索引会起作用。这就是我喜欢模拟代码并弄清楚为什么我的结果是错误的。

我试图将(impulse_length-1-i)置于一个信号中,以便能够在ModelSim中观察它,它以最大/最小32位有符号范围(+/- 2 147 483 647)开始,并在下一个周期跳到零,并保持为零。

我还尝试在进程内部使用变量j,以便能够在进程开始时将其作为零启动,并将其用作我的数组的索引而不是i,并在之后增加它实际计算,但这使得ModelSim报告致命错误,无法找出原因。

有人可以解释一下我做错了吗?

提前完成。

2 个答案:

答案 0 :(得分:2)

主要问题是,当您描述硬件而不是编写软件时,您不了解信号和for循环的工作原理。

第二个for循环的每次迭代都为同一个信号赋值。在一个过程中,只有指定信号的最后一个信号分配很重要,信号的所有读取都使用它在过程开始之前保存的值。这意味着只有第二个for循环的(impulse_length-1)次迭代可以做任何事情。

几年前我写了一个关于信号和变量如何在VHDL过程中工作的答案,它可以为您提供更多细节:https://stackoverflow.com/a/19234859/1360002

如果你这样写,那么所有10个加法/乘法运算都在同一个周期内发生(例如使用变量代替seq_buffer来计算实际分配给seq_buffer信号的值) ,您将描述具有非常长的逻辑路径的硬件,如果您的时钟频率甚至适中,则无法工作。对于您的情况,这可能不是问题。

此外,你可能会遇到乘法运算符出来的结果宽度问题,但我不能确定,因为我并不意味着乘法单位,所以我不熟悉相关运算符函数的细节。 / p>

答案 1 :(得分:0)

Thanx很多回答我的问题!

因此,如果我理解正确,在进程中使用带有变量的for循环会导致与使用某些&#34; generate&#34;相同类型的逻辑实现。声明。也许这就是为什么当我为我的卷积算法尝试类似的东西时,需要花费很长时间来编译;)

所以我想在Java或C中做类似于for循环的唯一方法是&#34;手动&#34;每次迭代计时,切换输入信号并缓冲成功结果,对吧?

但是我必须说我不明白为什么&#34;音频缓冲&#34;我写的过程工作正常,即使是时序模拟......

祝你好运