我正在为一项任务开发一个10点移动平均滤波器 . 我正在采取一些小步骤,以便我可以确保我的代码的每个阶段都正常工作 . 我的第一步是获取一个标准逻辑向量(5位)的输入,并将其转换为整数类型的信号进行处理,然后再转换回标准逻辑向量进行输出 . 我的第一个代码块是:
library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
entity AveFilter is
port( CLK : in STD_LOGIC;
RST : in STD_LOGIC;
ADC_In : in STD_LOGIC_VECTOR ( 4 downto 0);
AveOut : out STD_LOGIC_VECTOR ( 4 downto 0)
);
end AveFilter;
architecture Behavioral of AveFilter is
signal adc_sum : integer := 0;
type Circ_Buf is array (0 to 9) of STD_LOGIC_VECTOR (4 downto 0);
signal ave_buf : Circ_Buf;
begin
process (CLK, RST, ADC_In)
variable idx : integer := 5;
begin
ave_buf(0) <= ADC_In;
adc_sum <= to_integer(unsigned(ave_buf(0)));
AveOut <= std_LOGIC_VECTOR(to_unsigned(adc_sum, AveOut'length));
end process;
end architecture;
上面的代码只是取输入值并分配给输出;我用modelsim对它进行了测试,它按预期工作 . 我还可以将各种硬编码值分配给 adc_sum
,并且它们也按预期在输出上显示 .
我遇到的问题是当我修改代码以便将当前的adc输入添加到 adc_sum
的先前值然后存储在_2585702中时,即通过执行以下操作:
adc_sum <= adc_sum + to_integer(unsigned(ave_buf(0)));
当我在模型sim中查看 AveOut
时,值始终为XXXX . 我已经看了一些VHDL示例,它看起来像我相信我应该能够执行上述操作 . 有人可以告诉我这里我缺少的是什么吗?
谢谢
安德鲁
1 回答
ave_buf
可能在开头未定义 . 尝试初始化它 . 如果这样可行,您还应该对其执行重置 . 此外,您应该在时钟的上升沿采取行动 . 并且ADC_In
在灵敏度列表中是不必要的 .