我一直在尋找這一段時間,並沒有能夠在網上覆制任何發佈的解決方案,所以我希望你們中有些人能幫助我。 我正在創建一個ALU。我有兩個32位輸入和一個32位輸出以及一個5位shamt和一個4位控制信號。我的代碼如下,錯誤位置評論。VHDL shift_left操作出現錯誤
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;
我正的誤差表示:在合格表達式指定必須由上下文暗示用於表達std_logic_vector類型相匹配shift_left類型:在mips_alu.vhd(33)
10511 VHDL合格表達錯誤
我已經試過這幾個變化,從而,如果我失去了一些東西,請讓我知道,因爲我是一個有點新手到VHDL所有幫助表示讚賞
@ user1155120道歉,我錯過了錯誤代碼的第一部分。我正在編輯添加它。另外我不確定你對混音Synopsys的意義。 ieee.numeric_std_unsigned.all無法識別。 –
使用std_logic_arith(conv_integer)或使用numeric_std並類似瘋狂轉換類型,或者使您的mips_alu端口類型無符號,或者在進程中使用中間無符號變量,並將類型轉換爲unsigned。 – user1155120
Quartus II/Prime不支持IEEE package numeric_std_unsigned,它可能在2016年3月之前取代STD_LOGIC_UNSIGNED。(問題是你不能使用std_logic_arith引用的std_logic_arith中的無符號聲明,並使用numeric_std中的函數進行無符號聲明。 VHDL中的每個聲明都是唯一的,這意味着兩個無符號聲明不引用相同的類型/子類型)。 – user1155120