2012-02-09 3 views
5

저는 Altera DE1 보드에서 구현중인 간단한 16 비트 프로세서 용 VHDL 코드로 유한 상태 기계를 작성하려고했습니다. Finite State Machine에서는 16 비트 STD_LOGIC_VECTOR에 의해 FSM으로 가져 오는 다른 16 비트 명령어를 처리하는 CASE 문이 있습니다. 그러나 Finite State Machine이 명령을 디코딩하는 디코드 상태에서 약간 문제가 있습니다. 명령 중 하나는 두 레지스터를 피연산자로 사용하고 세 번째를 대상 레지스터로 사용하는 ADD입니다. 그러나, 나는 또한 레지스터와 5 비트 즉치 값을 피연산자로 취하고 두 번째 레지스터를 대상으로하는 ADD 명령을 가지고있다. 내 문제는 CASE 문에서 두 가지 다른 ADD 명령을 구별 할 수 있어야합니다. 그래서 나는 "-"또는 "X"와 같은 와일드 카드 값을 CASE 문에 사용하면 가능한 모든 레지스터/즉치 값 조합을 나열하는 대신 두 가지 경우로 구별 할 수있을 것이라고 생각했습니다. 예를 들어 :VHDL STD_LOGIC_VECTOR 와일드 카드 값

CASE IR IS --(IR stands for "Instruction Register") 
     WHEN "0001------0-----" => (Go to 3-register add); 
     WHEN "0001------1-----" => (Go to 2-register/immediate value add); 
     WHEN OTHERS => (Do whatever); 
    END CASE; 

이 내가 가지고있는 유일한 두 가지 지침을하지, 난 그냥이 게시물은 조금 짧게하는이 두 가지를 넣어. 이 코드를 컴파일하고 실행할 때 프로세서는 "디코드"상태가되면 실행을 멈 춥니 다. 또한 Quartus는 "LC3FSM.vhd (37)에서의 VHDL 선택 경고 : 메타 값을 포함하는 선택 사항 무시" "0001 ------ 0 -----" ""많은 것을 경고합니다. 이것을 달성하는 방법에 관해서는 손실. 정말 모든 단일 16 비트 조합을 정의 할 필요가 없으며 아마 정의 할 필요가 없습니다. STD_LOGIC_VECTOR에서 와일드 카드를 사용하여 정의해야 할 조합의 수를 최소화하는 방법이 있기를 바랍니다.

아무도 이것을 수행하는 방법을 알고 있습니까?

고마워요.

답변

1

명령어의 다른 비트가 필요 없다고 가정하면 사전 점검 프로세스로 다른 비트를 마스킹하여이 문제를 해결할 수 있습니다. (아니면 명령을 쓸 때 다른 비트가 재설정되는지 확인하십시오.)

이것은 실제로 해킹 비트입니다.

가정 IR이 저장되는 변수

if IR(15 downto 12) == "0001" then 
    IR := IR_in(15 downto 12) & "0000000" & IR_in(5) & "00000"; 
else 
    IR := IR_in 
end if; 

CASE IR IS --(IR stands for "Instruction Register") 
    WHEN "0001000000000000" => (Go to 3-register add); 
    WHEN "0001000000100000" => (Go to 2-register/immediate value add); 
    WHEN OTHERS => (Do whatever); 
END CASE; 

또는 당신의 명령 세라 (첫 번째 4 비트에게 그 라인을 따라 명령 단어 나 뭔가를 있습니까?) 당신이 중첩 된 경우 문을하고 할 수있는 밖으로 생각됩니다 가정 그 서브 블록들에서 필요에 따라 차별화.

+0

아하, Paul Seeb에게 감사드립니다. 어제 질문을 한 후에 각 연산 코드에 대해 CASE 문을 사용한 다음 IF 문을 사용하여 다른 필요한 비교를 수행 할 것을 고려했습니다. 첫 번째 방법은 코드를 조금 더 짧게 만들었으므로 그 코드를 사용했습니다. Mark Thompson에게도 감사드립니다. –

5

그건 유감스럽게도 할 수 없습니다. 오히려 예기치 않게 대부분의 사용자의 경우 비교 연산자 =case 비교는 문자 비교를 수행합니다. 이것은 std_logic 유형이 다른 기능 (예 : andor)이 정의 된 방식으로 인해 논리 값처럼 수행되는 문자 세트이기 때문입니다.

VHDL-2008은 예상대로 수행되는 새로운 케이스 문 case?을 소개합니다. VHDL 2008 모드에서 작동하도록 컴파일러에 지시해야합니다. 또한 -을 고려하여 두 값을 비교하는 VHDL 2008에 ?= 연산자가 있습니다.

여전히이 VHDL 2008을 지원하지 않는 컴파일러로 엉망인 경우 공급자에게 불만을 제기하십시오. 또한 std_match 함수를 사용하면 이전 VHDL 개정판에서 비교를 수행 할 수 있지만 case 문을 그런 식으로 작동시키는 것을 인식하지 못합니다.

+1

+1 "complain to supplier"! – Philippe

+0

자일링스 ISE와 동일한 문제에 직면 한 나에게도 마찬가지다. 새로운 '사례'? 성명서 (대부분의 VHDL-2008 기능과 마찬가지로)는 v14.4 (이 글을 쓰고있는 현재의 현재 버전)에 존재하지 않으며 향후에 언제 나타날지 확실하지 않습니다. – MartyMacGyver

+0

VHDL2008의 'case?'에 대한 베타 지원은 Vivado2014.3에 있습니다. [AR # 62005] (http://www.xilinx.com/support/answers/62005.html)를 참조하십시오. 베타 버전과 같이 작동한다고 가정하고 싶지는 않습니다. –