2017-04-16 15 views
0

이것은 내가 물었던 별도의 질문에서 벗어났습니다. 나는 내가하고 싶은 일과 좋아하지 않는 것에 대해 더 깊이 설명 할 것이다. 이것은 학교 프로젝트이므로 표준을 따를 필요가 없습니다.편집 - 동작이 지원되는 레지스터 모델과 일치하지 않으므로 등록을 유추 할 수 없습니다. VHDL

나는 SIMON 게임을 만들려고합니다. 바로 지금, 내가하려고하는 것은 레벨을위한 스위치 케이스를 사용하고 각 레벨은 더 빠름 (따라서 다른 주파수 디바이더)으로되어있다. 첫 번째 레벨은 첫 번째 주파수로 가정되고 LED의 패턴은 밝아지고 사라지게됩니다. 스위치 케이스에 넣기 전에, 첫 번째 레벨은 그 자체로 (두 번째 수준의 물건이 없었습니다) 켜져 있어야하고 사라져야하는 것처럼 사라졌습니다. 또한 출력을 입력과 비교하기 위해 compare = 0을 사용했습니다. (사용자는 그들이 본 조명 패턴으로 스위치를 뒤집어 놓기로되어있다.) 이것은 첫 번째 레벨이 그 자체 일 때 작동했지만 스위치가 된 지금은 compare을 좋아하지 않습니다. 나는 출력을 입력과 비교하기 위해 그것을 어떻게 극복해야할지 모르겠습니다.

가 오류 (10821) : FP.vhd에서 HDL 오류가 (75) : 추론 할 수없는 것은 그 행동이 일치하지 않기 때문에 "비교"에 등록 어떤 지원 내가 얻고

오류는 이전과 비슷합니다 모델 등록

오류 (10821) : FP.vhd에서 HDL 오류 (75) : 추론 할 수없는 것은 "계산 [0]"그 동작이 지원되는 모든 레지스터 모델과 일치하지 않기 때문에

오류에 등록 (10821) : FP.vhd (75)의 HDL 오류 : 해당 동작이 지원되는 레지스터 모델과 일치하지 않기 때문에 "count [1]"에 대한 레지스터를 추론 할 수 없습니다.

,451,515,

오류 (10821) : FP.vhd에서 HDL 오류 (75) : HDL : 추론 할 수없는 것은 "계산은 [2]"그 동작이 지원되는 모든 레지스터 모델과 일치하지 않기 때문에

오류 (10822)에 등록 FP.vhd (80)에서 오류가 발생했습니다 :이 클럭 에지에서 할당을위한 레지스터를 구현할 수 없습니다.

오류 (10822) : FP.vhd (102)에서의 HDL 오류 :이 클럭 에지에서 할당을위한 레지스터를 구현할 수 없습니다.

는 (12153)는

오류를 : 최상위 사용자 계층에게

정교한 수 없습니다 나는 또한 d를 이해 oesn't는 rising_edge(toggle)를 좋아한다. 그러나 나는 그것이 LED 패턴을 밝게하고 사라지게하기 위해 그것을 필요로한다.

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

entity FP is 
    port(
    clk, reset : in std_logic; 
    QF : out std_logic_vector (3 downto 0); 
    checkbtn : in std_logic; 
    Switch : in std_logic_vector(3 downto 0); 
    sel : in std_logic_vector (1 downto 0); 
    score : out std_logic_vector (6 downto 0) 

    ); 
end FP; 

architecture behavior of FP is 

signal time_count: integer:=0; 
signal toggle : std_logic; 
signal toggle1 : std_logic; 
signal count : std_logic_vector (2 downto 0); 
signal seg : std_logic_vector (3 downto 0); 
signal compare : integer range 0 to 1:=0; 
type STATE_TYPE is (level1, level2); 
signal level : STATE_TYPE;  
--signal input : std_logic_vector (3 downto 0); 
--signal sev : std_logic_vector (6 downto 0); 
begin 

process (clk, reset, sel) 
    begin 
     if (reset = '0') then 
      time_count <= 0; 
      toggle <= '0'; 
     elsif rising_edge (clk) then 
      case sel is 
      when "00" => 
       if (time_count = 1249999) then 
         toggle <= not toggle; 
         time_count <= 0; 
        else 
         time_count <= time_count+1; 
        end if;    
      when "01" => 
       if (time_count = 2499999) then 
        toggle1 <= not toggle1; 
        time_count <= 0; 
       else 
        time_count <= time_count+1; 
        end if; 
      when "10" => 
       if (time_count = 4999999) then 
        toggle <= not toggle; 
        time_count <= 0; 
       else 
        time_count <= time_count+1; 
        end if; 
      when "11" => 
       if (time_count = 12499999) then 
        toggle <= not toggle; 
        time_count <= 0; 
       else 
        time_count <= time_count+1; 
       end if; 
      end case; 
     end if; 
    end process; 



Process (toggle, compare, switch) 
    begin     

    case level is 
    when level1 => 
     if sel = "00" then 
      count <= "001"; 
      seg <= "1000"; 
     elsif (rising_edge (toggle)) then 
      count <= "001"; 
      compare <= 0; 
      if (count = "001") then 
       count <= "000"; 
      else 
      count <= "000"; 
      end if; 
     end if; 

     if (switch = "1000") and (compare = 0) and (checkbtn <= '0') then 
      score <= "1111001"; 
      level <= level2; 
     else 
      score <= "1000000"; 
      level <= level1; 
     end if; 

    when level2 => 
     if sel = "01" then 
      count <= "010"; 
      seg <= "0100"; 
     elsif (rising_edge (toggle1)) then 
      count <= "010"; 
      compare <= 1; 
      if (count = "010") then 
       count <= "000"; 
      else 
      count <= "000"; 
      end if; 
     end if; 

     if (switch = "0100") and (compare = 1) and (checkbtn <= '0') then 
      score <= "0100100"; 
     else 
      score <= "1000000"; 
      level <= level1; 
     end if; 
    end case; 


    case count is 
     when "000"=>seg<="0000"; 
     when "001"=>seg<="1000"; 
     when "010"=>seg<="0100"; 
     when "011"=>seg<="0110"; 
     when "100"=>seg<="0011"; 
     when others=>seg<="0000"; 
    end case;  
end process; 


QF <= seg; 
end behavior; 

다시 한번 감사드립니다.

+0

이전 편집에서 레이아웃을 수정했지만 되돌릴 수는 있습니다 ... 왜 그런 짓을했는지 모르겠지만, 이것은 내 시간 낭비입니다 ... – JHBonarius

+0

이전에 약간 다르기 때문에 제 질문을 편집했습니다. . 나는 또 다른 질문을 썼다. 그러나 나는 그렇게 했으므로 나의 오래된 것을 편집하도록 요청 받았다. 죄송합니다 – KC1

+0

아, 그냥 코멘트 할 수있는 능력을 얻으 십시요 :) 그래서 나는 너의 포스트를 편집했다. 적절하게 의도 된 코드를 갖는 것이 매우 중요합니다. 조만간 내 대답을 편집 할 것입니다. – Staszek

답변

0

음 ...이 상태 기계가 잘못된 방식으로 작성 되었기 때문에 잘못된 것이 무엇인지 알기가 어렵습니다. VHDL에서 FSM의 적절한 모델링에 대한 참고 자료를 찾아야합니다. 하나의 좋은 예가 here입니다. Quartus를 사용한다면 컴파일러를 위해 FSM을 모델링하는 방법에 대한 Altera의 설명을 찾아 볼 수도 있습니다.

이제 두 가지 조언을 드리겠습니다. 먼저 당신이하지 (또는 mabye 심지어 당신은 할 수 없음) 사용이 하나 개의 프로세스에서 두

if rising_edge (clk) 

검사입니다해야한다는 것입니다. 프로세스가 클럭 에지에서 민감한 것으로 생각되면 처음에 한 번 씁니다.

두 번째로 동기식 재설정이있는 프로세스 하나에서 FSM을 모델링하려면 민감도 목록에 clk 만 넣으십시오.질문 코드 편집 후

편집 :

좋아, 훨씬 더 지금. 하지만 또 다른 몇 가지 :

  1. FSM은 여전히 ​​좋지 않습니다. 위의 예제에서 다시 살펴보고 거기에 맞게 편집하거나이 예제의 FSM을 하나의 프로세스로 만듭니다 (link).
  2. 의도! 매우 중요. 내가 코드에서 적절한 의도를 갖기 전에 명백한 오류를 발견 할 수 없었습니다. 이것은 나를 이끌어 ...
  3. 거기에, 당신은 카운트, 특히 if 진술 값을 지정합니다. 너는 "000"이라는 동일한 값을 할당한다.
  4. 다른 신호와 유사한 이야기 ​​- 예. 프로세스의 일부 값을이 프로세스에 할당 한 다음이 프로세스가 끝나면 이전의 할당을 무의미하게 만드는 다른 값을 할당하는 사례 문이 있습니다.
  5. rising_edge를 프로세스에서 한 번만 사용하고 프로세스의 시작 부분 또는 시작 프로세스에서 비동기 재설정이있는 시계에서만 시계를 사용하십시오. 두 번째 과정에서이 세 가지를 모두했습니다.
  6. rising_edge를 사용하는 순차적 인 프로세스에서는 첫 번째 것과 마찬가지로 시계보다 중요한 것을 감별력 목록에 넣지 않아도되며, 비동기 인 경우 재설정 할 수도 있습니다.
  7. 두 번째 프로세스의 감도 목록입니다. 병렬 프로세스이므로 신호를 넣고 프로세스를 체크인하고 외부에서 변경할 수 있습니다. 비교를위한 경우는 아닙니다. 하지만 신호가 있어야합니다 : 레벨, 셀 및 토글 1.

아직 달성하려는 내용이 확실하지 않으므로 정확히 무엇을해야하는지 알려주지는 않습니다. 위의 요점에 따라 코드를 수정하십시오. 그러면 아마도 작동 할 것입니다.

+0

고마워요! 내가 2 클럭을 가지고있는 유일한 이유는 각 레벨에서 카운터의 속도를 변경하려고했기 때문입니다. 나는 시계를 FSM 외부로 옮겼지만 아직도 그것을 좋아하지 않았다. 그러나 나는 상태 기계를 고치려고 노력할 것이다. 다시 한 번 감사드립니다 – KC1

+0

이 답변으로 만족 스러울 경우 동의하십시오. 고마워 :) 컴퓨터를 수정 한 후에도 여전히 문제가 발생하면 새 코드로 질문을 수정하면됩니다. – Staszek

+0

기본 FSM을 만드는 방법을 알고 있지만 "SIMON"측면에서 작동하려면 각기 다른 레벨의 시계가 필요하며 어떻게 접근해야하는지 잘 모르겠습니다. 나는 다음 단계의 새로운 LED 패턴이 있기를 원하기 때문에 다른 경우를 원한다. 또한 조명을 켜고 끄는 방법이 필요합니다. 그게 토글 이었기 때문에 자동으로 켜고 끄는 방법을 모르겠습니다. 이것이 어떤 의미인지 모르지만 나에게 알려주세요! – KC1