2017-03-29 68 views
1

我一直在尋找這一段時間,並沒有能夠在網上覆制任何發佈的解決方案,所以我希望你們中有些人能幫助我。 我正在創建一個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所有幫助表示讚賞

+0

@ user1155120道歉,我錯過了錯誤代碼的第一部分。我正在編輯添加它。另外我不確定你對混音Synopsys的意義。 ieee.numeric_std_unsigned.all無法識別。 –

+1

使用std_logic_arith(conv_integer)或使用numeric_std並類似瘋狂轉換類型,或者使您的mips_alu端口類型無符號,或者在進程中使用中間無符號變量,並將類型轉換爲unsigned。 – user1155120

+0

Quartus II/Prime不支持IEEE package numeric_std_unsigned,它可能在2016年3月之前取代STD_LOGIC_UNSIGNED。(問題是你不能使用std_logic_arith引用的std_logic_arith中的無符號聲明,並使用numeric_std中的函數進行無符號聲明。 VHDL中的每個聲明都是唯一的,這意味着兩個無符號聲明不引用相同的類型/子類型)。 – user1155120

回答

1

numeric_std文檔中,您可以找到函數shift_leftshift_right。在這兩個描述中,您可以看到function SHIFT_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;。所以你需要使用你的std_logic_vector來鑄造unsigned
在你的情況下,它會是這樣的:對於您使用shift_leftshift_right功能的其他線路

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

末等等。

+0

是的,這是我一直在尋找的,謝謝你的指向numeric_std的鏈接。這實際上也解釋了我的錯誤代碼。它總是比我想象的簡單。 –

+0

歡迎您 – Roman

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); 
+0

有趣的做法,它是有道理的,我可以讓其他方法工作,這要歸功於Roman Matveev。儘管感謝您的輸入! –

+0

所以我認爲&並不意味着一個邏輯與,它意味着添加到結束? I.E.- 1010&0 => 10100或11&1010 => 111010? –