我在VHDL中有一个X Integer值数组,声明为进程内的变量。 我想计算for循环中所有值的平均值。 如果我手动写出3个值,一切正常(在硬件上测试):
entity MyEntity is
Port(
Enable : IN STD_LOGIC ;
CLK : IN STD_LOGIC;
SpeedOut : Out INTEGER
);
end MyEntity;
Average : process
type SampleArray is Array (2 downto 0) of INTEGER;
variable SpeedSamples : SampleArray;
variable tempVar : Integer;
begin
wait until rising_edge(CLK);
if ENABLE = '1' then
for i in 0 to 2 loop
tempVar := tempVar + SpeedSamples(i);
end loop;
SpeedOut <= tempVar / 3;
end if;
end process Average;
如果我使用for循环来做同样的SpeedOut是常数0:
create table disks (
id int not null,
size varchar(20) not null,
mult_id varchar(2)
)
go
我知道如果数组更大,这将需要大量资源,但我认为我的代码存在根本性的错误。
有没有一种可靠的方法来计算VHDL中的移动平均值?
答案 0 :(得分:2)
在每个时钟周期内添加大量样本并不是那么有效;当 n 开始增加时,带有 n 输入的加法器将消耗大量逻辑资源。
我的建议是为样本实现一个内存缓冲区,它将在您的滚动平均值中包含您想要的样本数量的位置。这将在每个时钟周期写入一个新样本;您还将在下一个时钟边缘将相同的样本添加到总数中。
使用双端口存储器,您可以同时从同一位置读出存储器中的“最旧”样本(前提是您具有读前写入模式下的存储器)。从总数中减去这个,然后执行除法。我希望到目前为止,效率最高的除数将是2的幂,因此你的除法不会消耗任何逻辑资源。其他类型的分频器使用相对多的逻辑。
因此,设计将归结为内存缓冲区,3输入加法器,用作指向样本缓冲区的指针的计数器以及线移位分频器。如果性能是一个问题,您可以管理加/减阶段,以便您只需要2输入加法器。
关于使用循环创建多输入加法器的实际编码问题,除了评论中提出的建议之外,我想说你的综合工具是否能够将其识别为多输入加法器。您是否在综合报告中查看了与此段代码相关的任何消息?