2017-03-29 14 views
1

잠시 동안이 기능을 검색 했으므로 온라인에 게시 된 솔루션을 복제 할 수 없기 때문에 멋진 사람들이 나를 도울 수 있기를 바랍니다. ALU를 만들고 있습니다. 나는 2 개의 32 비트 입력과 1 개의 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)에

10,511 VHDL 자격을 갖춘 표현 오류

는 내가 초보자의 비트 VHDL에 나는 모든 도움은 감사, 내가 뭔가를 놓친 거지 그래서 만약 알려 주시기 바랍니다이 여러 가지 변화를 시도

+0

user1155120 @ 사과, 난 오류 코드의 첫 번째 부분을 놓쳤다. 나는 그것을 추가하기 위해 편집 중이다. 또한 Synopsys 믹싱에 대해 어떤 의미인지 확신 할 수 없습니다. ieee.numeric_std_unsigned.all이 인식되지 않습니다. –

+1

std_logic_arith (conv_integer)를 사용하거나 numeric_std를 사용하고 crazy와 같은 유형 변환을 사용하거나 mips_alu 포트 유형을 부호가 없거나 프로세스에서 unsigned unsigned 변수를 사용합니다. – user1155120

+0

Quartus II/Prime은 2016 년 3 월부터 STD_LOGIC_UNSIGNED를 대체 할 수있는 IEEE 패키지 numeric_std_unsigned를 지원하지 않았습니다. (서명되지 않은 선언으로 만든 numeric_std의 함수로 std_logic_unsigned에서 참조하는 std_logic_arith에서 서명되지 않은 선언을 사용할 수 없다는 문제가 있습니다. VHDL의 각 선언은 고유하지 않으므로 두 서명되지 않은 선언이 동일한 유형/부속 유형을 참조하지 않습니다. – user1155120

답변

1

문서에는 shift_left 또는 shift_right이라는 기능이 있습니다. 위의 두 설명 모두에서 function SHIFT_LEFT (ARG: UNSIGNED; COUNT: NATURAL) return UNSIGNED;을 볼 수 있습니다. 따라서 std_logic_vector ~ unsigned의 전송 도구를 사용해야합니다. 당신이 shift_left 또는 shift_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'; 

이 저장 InputB에 해당하는 벡터 ALU_Result이다 한 번 바뀌었다. 더 많은 시간을 이동하려는 경우 루프를 사용할 수 있습니다.

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

재미있는 방법, 그리고 그것을 이해, 나는 다른 방법을 로마 Matveev 덕분에 일할 수있게 만들었습니다. 귀하의 의견을 주셔서 감사합니다! –

+0

그래서 나는 그것을 & 논리적으로 의미하지는 않는다. I.E.- 1010 & 0 => 10100 또는 11 & 1010 => 111010? –