获取VHDL shift_left操作的错误

时间:2017-03-29 18:40:15

标签: vhdl bit-shift alu

我已经搜索了一段时间,并且无法在网上复制任何发布的解决方案,所以我希望你们中的一些人可以帮助我。      我正在创建一个ALU。我有两个32位输入和一个32位输出以及一个5位shamt和一个4位控制信号。我的代码如下,错误位置已注释。

library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;

Entity mips_alu IS
    PORT(ALUControl : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    inputA, inputB      : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    shamt                   : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
    Zero                    : OUT STD_LOGIC;
    ALU_Result          : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
    );
END mips_alu;

ARCHITECTURE behavior of mips_alu IS
BEGIN
    PROCESS(ALUControl)
    BEGIN
        CASE ALUControl is
        WHEN "0000" =>
            ALU_Result <= inputA AND inputB;
        WHEN "0001" =>
            ALU_Result <= inputA OR inputB;
        WHEN "0010" =>
            ALU_Result <= inputA + inputB;
        WHEN "0110" =>
            ALU_Result <= inputA - inputB;
        WHEN "0111" =>
            IF (inputA < inputB) THEN
                ALU_Result <= inputA;
            END IF;
        WHEN "1000" =>
            ALU_Result <= shift_left(inputB, to_integer(unsigned(shamt)));
            -- The line above is where i get my first error, The following lines will have the same issue
        WHEN "1001" =>
            ALU_Result <= shift_right(inputB, shamt);
        WHEN "1010" =>
            ALU_Result <= shift_left(inputB, inputA);
        WHEN "1011" =>
            ALU_Result <= shift_right(inputB, inputA);
        WHEN "1100" =>
            ALU_Result <= inputA NOR inputB;
        WHEN "1101" =>
            ALU_Result <= inputB(31 DOWNTO 16);
        WHEN OTHERS =>
            ALU_Result <= inputA;
        END CASE;
    END PROCESS;
END behavior;

我得到的错误说:

  

10511 mips_alu.vhd(33)处的VHDL限定表达式错误:限定表达式中指定的shift_left类型必须与上下文隐含表达的std_logic_vector类型相匹配

我已经尝试了几种变体,所以如果我遗漏了什么请告诉我,所有帮助都表示赞赏,因为我对vhdl有点新手

2 个答案:

答案 0 :(得分:2)

numeric_std文档中,您可以找到函数shift_leftshift_right。在这两个描述中,您都可以看到function SHIFT_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;。因此,您需要使用std_logic_vector转换为unsigned 在你的情况下,它看起来像:

ALU_Result <= std_logic_vector(shift_left(unsigned(inputB), to_integer(unsigned(shamt))));
对于您使用shift_leftshift_right功能的其他行,

结束等。

答案 1 :(得分:0)

我通常做的就是:

ALU_Result <= inputB(30 downto 0) & '0';

这个存储是ALU_Result一个等于InputB移位一次的向量。 如果您想要更换次数,可以使用循环。

while (i<to_integer(unsigned(shamt))) loop
ALU_Result <= inputB(30 downto 0) & '0';
i:=i+1;
end loop;

它不是一个优雅的解决方案,但可能会有效。

向右移动:

ALU_Result <= '0' & inputB(31 downto 1);