2014-05-19 2 views
1

다음 코드는 Mips CPU

LIBRARY ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 

ENTITY instructionMemory IS 
    generic (delay :time :=10 ns); 
    PORT(a : INOUT STD_LOGIC_VECTOR (31 downto 0); 
     output: OUT STD_LOGIC_VECTOR(31 downto 0) 
    ); 
END ENTITY; 
ARCHITECTURE instructionMemory OF instructionMemory IS 
    type MemMatrix is array (0 to 7) of std_logic_vector(31 downto 0); -- instruction from memory 
    signal Mem:MemMatrix := (x"00000000",x"00000001",x"00000000",x"00000001",x"00000001",x"00000001",x"00000001",x"00000001"); 

    BEGIN 
    output <= Mem(conv_integer(a(6 downto 2)));    
END instructionMemory; 

에서 간단한 명령 Memory입니다 형 std.standard.integer로 슬라이스 이름을 확인할 수 있습니까의 Mem이 Memory 가정 및 일부 값을 initilized. 이 데이터를 읽고 출력에 할당하고 싶습니다.

그러나 그것은 나에게 다음과 같은 오류를주는 것 :

Mem(a(6 downto 2)); 

그러나 다시는 나에게 또 다른 오류가 있습니다 :

no feasible entries for subprogram conv_integer 

나는이에 오류 줄을 변경

cannot resolve slice name to type std.standard.integer 

내가 어떤이를 이 문제를 해결하는 방법, 어떤 몸도 나를 도울 수 있습니까?

+0

두 경우 모두 괄호가 맞지 않습니다. – fru1tbat

+0

흠, 고마워,하지만 문제가 아냐 :) – Amir

+1

conv_integer 신호에 대한 임시 신호 할당을 만들어보십시오. 그런 다음이 새로운 신호로 메모리에 액세스하십시오. 나는 때때로 이러한 함수가 배열에 문제가 있음을 발견했다. – Russell

답변

2

다음 분석 및 정성 들여 : 무슨 다른 점하는 출력 타겟팅 동시 신호 할당 문에 일치하는 폐쇄 괄호의 첨가가

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 

entity instructionmemory is 
    generic (delay :time :=10 ns); 
    port(a : inout std_logic_vector (31 downto 0); 
     output: out std_logic_vector(31 downto 0) 
    ); 
end entity; 
architecture instructionmemory of instructionmemory is 
    type memmatrix is array (0 to 7) of std_logic_vector(31 downto 0); -- instruction from memory 
    signal mem:memmatrix := ( 
     x"00000000",x"00000001",x"00000000",x"00000001", 
     x"00000001",x"00000001",x"00000001",x"00000001" 
    ); 

    begin 
    output <= mem(conv_integer(a(6 downto 2))); -- closing paren for mem(); 
end instructionmemory; 

.

ghdl은 실제로 도움이되지 않는 메시지가있는 문제의 문자 위치를 가리 킵니다.

instructionMemory.vhdl:20:47: ',' is expected instead of ';'

닫는 괄호가없는 가정은 추가적인 인수가 예상됩니다. 오류 메시지는 비 터미널에서 오류 메시지를 제공 할 수없는 YACC/Bison 기반 파서를 나타냅니다.

부록

당신이 6 downto 0의 변환 및 memmatrix (0 to 7) 사이의 정수 범위의 불일치가 러셀의 의견을 참고한다면. 변환은 2 ** 5의 이진 범위를 갖지만 mem은 0 ~ 7의 범위를 갖습니다. a(6 downto 2)이 모두 0에서 7 범위를 벗어나면 런타임 오류가 발생합니다. 정수형을 사용하면 mem 값에 대한 정수 값을 검사하여 범위를 벗어난 필드를 수정하거나 처리 할 수 ​​있습니다.

memmatrix 크기를 늘려 a (6 downto 2)의 전체 범위를 조정할 수도 있습니다.

출력 할당을 위해 다른 색인을 mem에 할당하는 방법에 대한 추가 질문은 조금 더 많은 컨텍스트가 필요합니다. 어디에서 색인을 가져오고 싶습니까?

+0

출력 할 Mem의 다른 인덱스를 어떻게 할당 할 수 있습니까? – Amir

+0

내 코드를 다음과 같이 변경합니다 : ** Mem (to_integer (a (6 downto 2))); ** 및 numeric_std를 사용했습니다.모든 arith 라이브러리 대신 컴파일하고 컴파일합니다. 당신의 도움을 주셔서 감사합니다. – Amir