我是VHDL的新手,我正在尝试写一个左移位器,它需要一个32位值和一个5位值。左移位器然后试图通过移出左边的5位数字指定的位数并将右边的多个零移出来来执行32位值的逻辑左移。我不明白为什么数组表示法不起作用。 1 < < 1的结果产生20000000而不是00000002.有人可以解释我要去哪里出错吗?下面的代码:为什么VHDL不能移动工作?
SIGNAL lshiftOutput : STD_LOGIC_VECTOR(31 downto 0);
COMPONENT Lshift32
Port(a : in STD_LOGIC_VECTOR(31 downto 0);
b : in STD_LOGIC_VECTOR(4 downto 0);
lshiftOutput : out STD_LOGIC_VECTOR(31 downto 0));
END COMPONENT;
PROCESS( a, b, opcode, adderOutput, subtractOutput, xorOutput, lshiftOutput, rshiftOutput)
BEGIN
IF opcode = "0000" THEN
result <= x"00000000";
ELSIF opcode = "0001" THEN
result <= adderOutput;
ELSIF opcode = "0010" THEN
result <= subtractOutput;
ELSIF opcode = "0011" THEN
result <= NOT a;
ELSIF opcode = "0100" THEN
result <= a AND b;
ELSIF opcode = "0101" THEN
result <= a OR b;
ELSIF opcode = "0110" THEN
result <= xorOutput;
ELSIF opcode = "0111" THEN
result <= lshiftOutput;
ELSIF opcode = "1000" THEN
result <= rshiftOutput;
END IF;
END PROCESS;
LIBRARY ieee;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY Lshift32 IS
Port(a : in STD_LOGIC_VECTOR (31 downto 0);
b : in STD_LOGIC_VECTOR (4 downto 0);
lshiftOutput : out STD_LOGIC_VECTOR (31 downto 0));
END Lshift32;
ARCHITECTURE Lshift32Architecture of Lshift32 IS
BEGIN
PROCESS(a, b)
VARIABLE shiftAmount : INTEGER := 0;
BEGIN
shiftAmount := to_integer(b(4 downto 0));
-- Shift left
lshiftOutput <= a(31-shiftAmount downto 0) & (shiftAmount-1 downto 0 => '0');
END PROCESS;
END Lshift32Architecture;
该试验台是这样的:
-- Shift Left -------------------------------------------------------
WAIT FOR 9 ns;
op <= "0111";
-- 1 << 1
input_a <= x"00000001";
input_b <= x"00000001";
WAIT FOR 1 ns;
IF (output /= x"00000002") THEN
ASSERT false REPORT "1 << 1 has incorrect result" severity error;
END IF;
包括其余的代码,包括库/使用条款和据称给你这个结果的测试台。由于错误的移位距离可能会产生这种结果,因此您可能需要添加显示“shiftAmount”的“报告”语句。 –
“测试平台”(a)不完整,(b)测试与“Lshift32”实体完全不同的内容。发布你正在抱怨的实体的单元测试 - 而不是其他的东西。 –