我正在尝试用 VHDL 设计一个具有 4 位和 3 位无符号输入的 ALU。但我调整输入大小的尝试失败了,因此加法操作将“X”作为输出。
这是我的代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity alu_bv is
Port ( a : in unsigned (3 downto 0);
b : in unsigned (2 downto 0);
ch : in STD_LOGIC_VECTOR (2 downto 0);
y : out unsigned (3 downto 0));
end alu_bv;
architecture Behavioral of alu_bv is
signal c : unsigned (3 downto 0);
begin
process(a,b,ch)
begin
c <= unsigned('0' & b);
case ch is
when "000" => y <= a + c;
when "001" => y <= a - c;
when "010" => y <= a + 1;
when "011" => y <= a - 1;
when "100" => y <= a and c;
when "101" => y <= a or c;
when "110" => y <= not a;
when "111" => y <= a xor c;
when others => NULL;
end case;
end process;
end Behavioral;
我在分配给 c 时尝试过不进行类型转换
c <= ('0' & b);
我已经尝试了调整大小功能
c <= resize(b, a'length);
这是我运行行为模拟时的输出波形:
十六进制基数:
二进制基数:
您能建议解决这个问题吗?
X
仅在开始时出现,后续事件都可以。这是因为 c
更新得太晚,无法被 y <= a + c
的第一次执行所拾取,如here所述。
尝试将
c
添加到敏感度列表中,它将触发需要使用 y
的最新值更新 c
的事件。