在 VHDL 中添加和分配信号
Add and assign to a signal in VHDL
我正在为一项作业开发一个 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
的先前值然后存储在 adc_sum
中,即通过这样做:
adc_sum <= adc_sum + to_integer(unsigned(ave_buf(0)));
当我在模拟模型中查看 AveOut
时,值始终为 XXXX。我看过一些 VHDL 示例,看起来像而且我相信我应该能够执行上述操作。有人可以告诉我我在这里遗漏了什么吗?
谢谢
安德鲁
ave_buf
开头可能是未定义的。尝试初始化它。如果这有效,您还应该对其实施重置。此外,您应该在时钟的上升沿采取行动。 ADC_In
在敏感列表中是不必要的。
我正在为一项作业开发一个 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
的先前值然后存储在 adc_sum
中,即通过这样做:
adc_sum <= adc_sum + to_integer(unsigned(ave_buf(0)));
当我在模拟模型中查看 AveOut
时,值始终为 XXXX。我看过一些 VHDL 示例,看起来像而且我相信我应该能够执行上述操作。有人可以告诉我我在这里遗漏了什么吗?
谢谢
安德鲁
ave_buf
开头可能是未定义的。尝试初始化它。如果这有效,您还应该对其实施重置。此外,您应该在时钟的上升沿采取行动。 ADC_In
在敏感列表中是不必要的。