2016-11-27 9 views
0

저는 VHDL을 사용하여 FPGA 보드의 스파르탄 3E를 구성하는 프로젝트에서 작업하고 있습니다. 내가해야 할 일은 천재 퍼즐이다. 메인 코드에는 논리를 제어하는 ​​상태 기계가있다.VHDL 코드가 보드에서 작동하지 않지만 시뮬레이션에서 작동합니다.

자일링스 시뮬레이터를 사용하여 코드를 시뮬레이트 할 때 모든 것이 잘 작동하지만 FPGA 보드에서 .bit 파일을 실행할 때 시퀀스의 첫 번째 LED가 켜지고 꺼지는 것이므로 오른쪽 버튼을 클릭하면 작동이 멈추고 다음 순서는 표시되지 않습니다. 물론 버튼을 deboucing하는 문제가 있습니다. 그 이유는 제가 카운터를 사용하여 시스템에 버그를 일으키는 것을 방지하기 위해서입니다.

이 코드는 작동하기 위해 열심히 노력하고 있지만이 문제는 해결되지 않습니다. 어쩌면 내가 잘못된 것을하고 있습니다. 잘 모르거나 내가해야 할 일을하지 않습니다.

여기 내 주 코드는 카운터와 함께 상태 시스템과 시계 프로세스입니다.


architecture Behavioral of Algoritmo is 

    subtype state_type is integer range 5 downto 0; 
    signal state, nextstate: state_type:=0; 
    signal Inicio, nclk: std_logic:= '0'; 
    --variable posicaoAtual: integer :=0; 
    type mem1 is array (0 to 13) of std_logic_vector (3 downto 0);  
    constant vetorSequencia: mem1 := ("0001", "0010", "0100", "1000", "0001", "0010", "0100", "1000", "0001", "0010", "0100", "1000", "0001", "0010"); 

    constant generic1hz: integer:= 12_500_000; 
    signal t3count:integer:=0; 
    signal posA, posB, signalScore, Flag_conte, 

Flag_conte = starts ou blocks the counter 
Flag_estou_contando = 1=counting, 0= not counting, 3= just finished count. 
BCD = board buttons IN 
LEDs = corresponds to 4 leds that will show the sequence in the game 

entity Algoritmo is 
    port(
     clk: in std_logic; 
     BCD: in std_logic_vector (3 downto 0); 
      botaoStart: in std_logic;  
     botaoReset: in std_logic;   
      seven_seg: out std_logic_vector(6 downto 0); 
      anode: out std_logic_vector(3 downto 0); 
      LEDS: out std_logic_vector(3 downto 0) 
     ); 
END Algoritmo; 
Flag_estou_contando : 정수 = 0;

signal valor: integer :=12_500_000; 
Begin 
------------- 
process (state,BCD,botaoStart,Flag_estou_contando) 
variable Pos: integer :=0; 
variable score: integer:=0; 
variable posicaoAtual: integer:=0; 
variable tentativa: std_logic_vector (3 downto 0); 
begin 
    case state is 
    when 0 => if (botaoStart = '0') 
    then nextstate <= 0;-- estado idle, esperando entrada do tclado,led1=1; 
        else nextstate <= 1; 
        end if; 

     when 1 =>-- if(Flag_estou_contando =0)then 
         if(nextstate=2)then 
          Flag_conte <=0; 
          nextstate <= 2; 
         else if (nextstate/=2)then 
          if (posicaoAtual < score)then 
            if(Flag_estou_contando=0)then 
          LEDS <= vetorSequencia(posicaoAtual); 
             posA <= posicaoAtual; 
             Flag_conte<=1; 
             valor<=10_000_000; 
            else if(Flag_estou_contando=1)then 
             LEDS <=vetorSequencia(posicaoAtual); 
            else if (Flag_estou_contando=3)then 
             --posicaoAtual:=0; 
             posicaoAtual := posicaoAtual + 1; 
             posA <= posicaoAtual; 
             nextstate <=1; 
             Flag_conte<=0; 
            end if;end if;end if; 

          else if(posicaoAtual = score)then 
            if(Flag_estou_contando=0)then 
             Flag_conte<=1; 
             valor<=10_000_000; 
             -- posicaoAtual :=0; 
             posA <= posicaoAtual; 
            else if(Flag_estou_contando=1)then 
             LEDS <=vetorSequencia(posicaoAtual); 
             nextstate<=1; 
            else if(Flag_estou_contando=3)then 
             posicaoAtual:=0; 
             posA <= posicaoAtual; 
             Flag_conte<=0; 
             nextstate <= 2; 
            end if;end if;end if; 
          end if;end if; 
          Flag_conte <=1; 
         end if;end if; 


     when 2 => --if(Flag_estou_contando=0)then 
        if (BCD = "0000")then 
         if(Flag_estou_contando=0)then 
         LEDS <= "0000"; --nextstate <= 2; 
         else if (Flag_estou_contando=1)then 
          nextstate<=2; 
            else if (Flag_estou_contando=3)then 
             Flag_conte <= 0; 
             nextstate<=3; 
            end if;end if;end if; 
          else if(BCD /= "0000")then 
            if(Flag_estou_contando=0)then 
             Flag_conte<=1; 
             valor<=200_000_000; 
             tentativa := BCD; 
             LEDS <= tentativa; 
            else if(Flag_estou_contando=3)then 
             nextstate <= 3; 
            else if(Flag_estou_contando=1)then 
             LEDS <= tentativa; 
             nextstate <=2; 
            end if;end if;end if; 
          end if;end if; 

       when 3 => if (vetorSequencia(Pos) = tentativa)then 
           if (Pos < score)then 
             nextstate <= 2; 
             Pos := Pos + 1; 
             posB <= Pos; 
           else if(Pos = score)then 
             score := score + 1; 
             signalScore <= score; 
             nextstate <= 1; 
             Pos := 0; 
           if (score = 15)-- if score =15 finish game 
              then nextstate <= 5;  
             end if;--end if 
           end if;end if; 
         else -- se estiver errado, perde o jogo 
          nextstate <= 4; -- goes to game over 
        end if;     

     when 4 => if (botaoReset = '1') -- game over 
           then nextstate <= 4;-- "U LOST nOOB" 
       elsif (botaoReset = '0') 
          then nextstate <= 0; -- 
       end if; 
     when 5 => if (botaoReset = '1') -- jogo ganho 
           then nextstate <= 5; -- "GG" 
         elsif (botaoReset = '0') 
           then nextstate <= 0; 
        end if;  
     end case; 


end process; 

    process (clk, Flag_conte) 

    variable sum, count :integer:=0; 
    begin 



if rising_edge(clk) then 
     if(Flag_estou_contando = 0) then 
      if (Flag_conte = 1) then 
       count :=0; 
       Flag_estou_contando <=1; 
      end if; 
     end if; 
    if(Flag_estou_contando=3) then  
     if(Flag_conte =0)then 
      Flag_estou_contando <= 0; 
     else 
      Flag_estou_contando <=3; 
     end if; 
    end if; 

    if (Flag_estou_contando =1)then 
     if(count < valor)then 
      count := count + 1; 
     else 
      count:=0; 
      Flag_estou_contando <=3;   
     end if; 
    end if; 

    sum := sum +1;    
    if(sum = generic1hz)then -- 1hz generate 
     state <= nextstate; 
     nclk <= not nclk; 
     sum := 0;--restart count for 1hz generate 

    end if; 
end if; 

end process; 
end Behavioral; 

if i wasnt clear, please let me know i will try to explain better, if anyone could help i would be very greatful, thank you for your time. 

답변