我正在为作业开发一个10点移动平均滤镜。我正在采取一些小步骤,以便我可以确保我的代码的每个阶段都正常工作。我的第一步是获取一个标准逻辑向量(5位)的输入,并将其转换为整数类型的信号进行处理,然后再转换回标准逻辑向量进行输出。我的第一个代码块是:
main
上面的代码只是取输入值并分配给输出;我用modelsim对它进行了测试,它按预期工作。我还可以将各种硬编码值分配给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;
,并且它们也按照预期在输出上显示。
我遇到的问题是当我修改代码以便将当前的adc输入添加到先前的adc_sum
值然后存储在adc_sum
中时,即通过这样做:
adc_sum
当我在模型sim中查看adc_sum <= adc_sum + to_integer(unsigned(ave_buf(0)));
时,值始终为XXXX。我已经看了一些VHDL示例,它看起来像我相信我应该能够执行上述操作。有人可以告诉我一下我在这里缺少什么吗?
由于
安德鲁
答案 0 :(得分:1)
ave_buf
可能在开头未定义。尝试初始化它。如果这样可行,您还应该对其执行重置。此外,您应该在时钟的上升沿采取行动。并且在敏感度列表中不需要ADC_In
。