我试图用我的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报告致命错误,无法找出原因。
有人可以解释一下我做错了吗?
提前完成。
答案 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;我写的过程工作正常,即使是时序模拟......
祝你好运