获取VHDL shift_left操作的错误

获取VHDL shift_left操作的错误,vhdl,bit-shift,alu,Vhdl,Bit Shift,Alu,我已经搜索了一段时间了,还没有能够在网上复制任何发布的解决方案,所以我希望你们中一些优秀的人能够帮助我。 我正在创建一个ALU。我有两个32位输入和一个32位输出,以及一个5位SHMT和一个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(A

我已经搜索了一段时间了,还没有能够在网上复制任何发布的解决方案,所以我希望你们中一些优秀的人能够帮助我。 我正在创建一个ALU。我有两个32位输入和一个32位输出,以及一个5位SHMT和一个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;
ieee库;
使用ieee.std_logic_1164.all;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
使用ieee.numeric_std.all;
实体mips_alu为
端口(ALUControl:标准逻辑向量(3到0);
inputA,inputB:标准逻辑向量(31向下到0);
shamt:标准逻辑向量(4到0);
零:输出标准逻辑;
ALU结果:输出标准逻辑向量(31到0)
);
结束mips_alu;
mips_alu的体系结构行为是
开始
过程(控制)
开始
病例对照是
当“0000”=>
ALU_结果
ALU_结果
ALU_结果
ALU_结果
如果(输入<输入b),则
ALU_结果
ALU_结果
ALU_结果
ALU_结果
ALU_结果
ALU_结果
ALU_结果
ALU结果在文档中可以找到函数
shift\u left
shift\u right
。在这两个描述中,您可以看到
函数SHIFT_LEFT(ARG:UNSIGNED;COUNT:NATURAL)返回UNSIGNED。因此,您需要将
std\u逻辑\u向量
转换为
无符号

在您的情况下,它看起来像:

ALU_Result <= std_logic_vector(shift_left(unsigned(inputB), to_integer(unsigned(shamt))));

ALU_Result我通常做的就是:

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

ALU_Result@user1155120抱歉,我错过了错误代码的第一部分。我正在编辑以添加它。而且我也不知道你说的混音是什么意思。ieee.numeric\u std\u unsigned.all无法识别。请使用std\u logic\u arith(conv\u integer)或疯狂地使用数字\u std和类型转换,或使mips\u alu端口类型无符号,或在与无符号进行类型转换的过程中使用中间无符号变量。Quartus II/Prime不支持ieee软件包数字\u std\u unsigned,可取代2016年3月未签署的STD_LOGIC_。(问题是您不能使用std_logic_arith中的无符号声明,该声明由std_logic_unsigned引用,而numeric_std中的函数由其无符号声明生成。VHDL中的每个声明都是唯一的,这意味着两个无符号声明引用的不是同一类型/子类型)。是的,这就是我一直在寻找的,谢谢你的链接,以数字_标准以及。这也解释了我的错误代码。它总是比我想象的要简单。这是一个有趣的方法,而且很有意义,多亏了Roman Matveev,我才使另一种方法起作用。谢谢你的意见!所以我认为-,这并不意味着一个合乎逻辑的,它意味着增加到的结尾?即-1010&0=>10100或11&1010=>111010?
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);