算术平均值vhdl

算术平均值vhdl,vhdl,Vhdl,我试图创建一个元素,使算术平均值。我有一个输入向量,所有的数据都应该写。和一个时钟输入来改变我们的输入值。我在网上查了一下,但找不到帮助我解决问题的结果。这是我的代码,它的效果非常好——它只适用于最初的一些结果,我无法理解结果。我在Quartus 9.1工作。请帮忙 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.numeric_std.all; entity serArifmet is generic ( r: integer :=8;

我试图创建一个元素,使算术平均值。我有一个输入向量,所有的数据都应该写。和一个时钟输入来改变我们的输入值。我在网上查了一下,但找不到帮助我解决问题的结果。这是我的代码,它的效果非常好——它只适用于最初的一些结果,我无法理解结果。我在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;

您应该从灵敏度列表中删除“w”,并将accum代码放入if clk语句中

由于“w”和“clk”在灵敏度列表中,每次w或clk发生变化时,都会对accum代码进行评估。所以它可能被评估了两次


如果你真的想合成这个,要意识到这个循环将展开成一个潜在的深度和巨大的加法器。至于分裂,这是一个昂贵的操作,理想情况下应该避免,甚至可能不会合成。如果必须除法,则应将其限制为2的幂,或者预先计算-计算1/N,然后将其实现为乘法。也就是说,x/4=.25*x。如果你有一堆N,预先计算它们,然后选择一个你需要的。

它不起作用的例子是什么?当我使用矢量波形文件检查时,它会给出错误的结果。好的,具体的例子是什么?i、 e.{输入,预期输出,实际输出}。hear是我结果的屏幕截图。实际上我不理解它们,但我认为它们是错误的。为什么你认为它们是错误的?向我们显示波形上您认为错误的确切位置以及您希望出现的情况。期望读者自己去解读、解释并弄明白这一切是一个得不到太多答案的诀窍,因为当有其他问题的实际问题更清楚时,我们中很少有人有时间致力于这一点。。。