算术平均值vhdl

时间:2013-12-29 15:48:18

标签: vhdl

我试图创建一个算术平均值的元素。我应该写入所有数据中的一个输入向量。和一个时钟输入来改变我们的输入值。我看着互联网,但无法找到结果,以帮助我解决我的问题。这是我的代码它非常有效 - 它只适用于第一个“一些”结果,我无法理解结果。我在Quartus 9.1中工作。请帮助))

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.all;
entity serArifmet is
generic ( r: integer :=8;
b: integer :=4);

port ( w: in signed (b-1 downto 0);
clk: in STD_LOGIC;
res: out signed (2*b-1 downto 0);
qqq: out signed(4*b-1 downto 0);
a: out signed (2*b-1 downto 0) );

end serArifmet;
architecture Arch_neuron_one of serArifmet is
type weights is array (1 to r) of signed (b-1 downto 0);
begin
process (clk, w)
variable weight: weights;
variable ost:signed(4*b-1 downto 0);
variable prod, acc, zzz: signed (2*b-1 downto 0);
variable prod2: signed (b-1 downto 0);
variable k:signed(7 downto 0);
variable eee: signed (3 downto 0);

begin
k:="00000001";
if (clk'event and clk='1') then
weight :=w & weight (1 to r-1);
end if;

acc := (others => '0');
for j in 1 to r loop
acc := acc + weight(j);
zzz:= (acc)/ k;
ost:=acc-zzz*k;
k:=k+1;

end loop;
a <= acc;

res<= zzz;
qqq<= ost;

end process;
end Arch_neuron_one;

enter image description here

1 个答案:

答案 0 :(得分:0)

您应该从敏感列表中删除'w',并将accum代码放在if(clk)语句中。

由于'w'和'clk'在灵敏度列表中,因此每次w或clk改变时都会评估累积代码。所以它可能被评估两次。

如果您实际上正在尝试综合这个,请意识到循环将展开为一个潜在的深度和巨大的加法器。至于鸿沟,这是一项昂贵的操作,理想情况下应该避免,甚至可能无法合成。如果必须除以,则应限制为2的幂,或者预先计算 - 计算1 / N然后将其实现为乘法。也就是说,x / 4 = .25 * x。如果您有一堆N,请对它们进行预先计算,然后选择您需要的那个。