2015-02-04 5 views
1

저는 5,10,25 센트를 입력으로 받아서 소다 또는 다이어트를 출력하고 적절한 변경 사항을 출력하는 자동 판매기의 경우 Verilog로 유한 상태 시스템을 구축하려고합니다.). 현재 오류 : HDLCompiler : 806 - "D :/Xilinx Stuff/FSM/FSM.v"오류 메시지가 나타납니다. 줄 128 : "endmodule"근처에 구문 오류가 있습니다. 저는 Verilog에 상당히 익숙하며 세미콜론이나 무언가를 잊어 버리는 것과 같은 어리석은 오류 일뿐입니다. 나는 그것을 발견 할 수 없습니다. 내 코드는 다음과 같습니다 :Verilog 자동 판매기 FSM

always @(current_state or quarter or nickel or dime) 

을의 Verilog 2001 또는 시스템으로 :

always @(current_state | ((quarter^nickel)^dime)) 

표준 코딩 스타일을 사용하는 것입니다 :

module FSM(quarter, nickel, dime, soda, diet,clk, reset, change_count, give_soda,give_diet); 
    input quarter, nickel, dime, soda, diet,clk, reset,give_soda,give_diet; 
    output change_count; 
    reg[3:0] current_state, next_state; 
    parameter cent0 = 0, cent5= 1, cent10 = 2, cent15=3, cent20 =4, cent25 =5, cent30=6,cent35=7,cent40=8; 

    always @(posedge clock or posedge reset) 
     begin 
      if(reset) 
      begin 
       current_state = cent0; 
      end 
      else 
       current_state = next_state; 
     end 

    always @(current_state | ((quarter^nickel)^dime)) 
     begin 
     case(current_state) 
      cent0: begin 
       if(nickel) 
         next_state = cent5; 
       else if(dime) 
         next_state = cent10; 
       else if(quarter) 
         next_state = cent25; 
       end 
      cent5: begin 
       if(nickel) 
         next_state = cent10; 
       else if(dime) 
         next_state = cent15; 
       else if(quarter) 
         next_state = cent30; 
       end 
      cent10: begin 
       if(nickel) 
         next_state = cent15; 
       else if(dime) 
         next_state = cent20; 
       else if(quarter) 
         next_state = cent35; 
       end 
      cent15: begin 
       if(nickel) 
         next_state = cent20; 
       else if(dime) 
         next_state = cent25; 
       else if(quarter) 
         next_state = cent40; 
       end 
      cent20: begin 
       if(nickel) 
         next_state = cent25; 
       else if(dime) 
         next_state = cent30; 
       else if(quarter) 
         next_state = cent0; 
         if(soda)  
           give_soda = 1; 
         else if(diet) 
           give_diet = 1; 
       end 
       cent25: begin 
        if(nickel) 
          next_state = cent30; 
        else if(dime) 
          next_state = cent35; 
        else if(quarter) 
          next_state = cent0; 
          change_count = 1; 
          if(soda)  
            give_soda = 1; 
          else if(diet) 
            give_diet = 1; 
        end 
       cent30: begin 
        if(nickel) 
          next_state = cent35; 
        else if(dime) 
          next_state = cent40; 
        else if(quarter) 
          next_state = cent0; 
          change_count = 2; 
          if(soda)  
            give_soda = 1; 
          else if(diet) 
            give_diet = 1; 
        end 
       cent35: begin 
        if(nickel) 
          next_state = cent40; 
        else if(dime) 
          next_state = cent40; 
        else if(quarter) 
          next_state = cent0; 
          change_count = 2; 
          if(soda) 
            give_soda = 1; 
          else if(diet) 
            give_diet = 1; 
        end 
       cent40: begin 
        if(nickel) 
          next_state = cent0; 
          if(soda) 
            give_soda = 1; 
          else if(diet) 
            give_diet = 1; 
        else if(dime) 
          next_state = cent0; 
          change_count = 1; 
          if(soda) 
            give_soda = 1; 
          else if(diet) 
            give_diet = 1; 
        else if(quarter) 
          next_state = cent0; 
          change_count = 4; 
          if(soda) 
            give_soda = 1; 
          else if(diet) 
            give_diet = 1; 
        end 
       default: next_state = current_state; 
       endcase 


endmodule 
+1

그것의'begin'에 대한 일치하는'end'이없는 항상 두 번째 것 같습니다. – BlamKiwi

+0

감사합니다. 문제가 해결되었습니다. – Antoninus

+0

다른 조언은 출력 논리와 다음 상태 논리를 분리해야한다는 것입니다. Xilinix (일부 HDL 컴파일러는주의를 기울임)가 도움이되지는 않지만 읽기 쉽도록 톤을 돕습니다. – BlamKiwi

답변

2

내가 사용하는 이유를 모르겠어요 Verilog에서는 다음과 같이 쉼표로 구분 된 감도 목록을 사용할 수 있습니다.

always @(current_state, quarter, nickel, dime) 
당신이 당신의 입력 진동을 소거하거나 한 번에 주장 된 동전 신호보다 더 있는지 확인해야하는 경우

always @(*) 

:

마지막으로 Verilog에 2001 년 이후, 당신은 조합 논리 항상 블록에 대한 와일드 카드를 사용할 수 있습니다 , 아마 상태 기계 밖에서해야합니다.

+0

예, 상태 머신이 FPGA의 여러 버튼 누르기를 무시할 수는 있었지만 디버거가 무엇인지 알기도 전에였습니다. 감사! – Antoninus

+0

조합 논리의 와일드 카드와 관련하여 "*"가 나타내는 것을 실제로 어떻게 선택 했습니까? 나는 실제로 * 실제로 무엇을 의미하는지 조금 혼란스러워합니다. – Antoninus

+0

*는 always 블록의 방정식의 오른쪽에서 참조 된 모든 신호가 민감도 목록에 포함되어 있음을 나타냅니다. –

-1
//this is the correct verilog code, 

module FSM(quarter, nickel, dime, soda, diet,clk, reset, current_state, next_state, change_count, give_soda, give_diet); 
input quarter, nickel, dime, soda, diet,clk, reset; 
output [3:0] current_state; 
output next_state, change_count, give_soda, give_diet; 
reg current_state, change_count, next_state, give_soda, give_diet; 
parameter cent0 = 0, cent5= 1, cent10 = 2, cent15=3, cent20 =4, cent25 =5, cent30=6,cent35=7,cent40=8; 

always @(posedge clk or posedge reset) 
    begin 
     if(reset) 
      current_state = cent0; 
     else 
      current_state = next_state; 
    end 

always @(nickel or dime or quarter) 
    begin 
    case(current_state) 
     cent0: begin 
      if(nickel) 
        next_state = cent5; 
      else if(dime) 
        next_state = cent10; 
      else if(quarter) 
        next_state = cent25; 
      end 
     cent5: begin 
      if(nickel) 
        next_state = cent10; 
      else if(dime) 
        next_state = cent15; 
      else if(quarter) 
        next_state = cent30; 
      end 
     cent10: begin 
      if(nickel) 
        next_state = cent15; 
      else if(dime) 
        next_state = cent20; 
      else if(quarter) 
        next_state = cent35; 
      end 
     cent15: begin 
      if(nickel) 
        next_state = cent20; 
      else if(dime) 
        next_state = cent25; 
      else if(quarter) 
        next_state = cent40; 
      end 
     cent20: begin 
      if(nickel) 
        next_state = cent25; 
      else if(dime) 
        next_state = cent30; 
      else if(quarter) 
        next_state = cent0; 
        if(soda)  
          give_soda = 1; 
        else if(diet) 
          give_diet = 1; 
      end 
      cent25: begin 
       if(nickel) 
         next_state = cent30; 
       else if(dime) 
         next_state = cent35; 
       else if(quarter) 
         next_state = cent0; 
         change_count = 1; 
         if(soda)  
           give_soda = 1; 
         else if(diet) 
           give_diet = 1; 
       end 
      cent30: begin 
       if(nickel) 
         next_state = cent35; 
       else if(dime) 
         next_state = cent40; 
       else if(quarter) 
         next_state = cent0; 
         change_count = 2; 
         if(soda)  
           give_soda = 1; 
         else if(diet) 
           give_diet = 1; 
       end 
      cent35: begin 
       if(nickel) 
         next_state = cent40; 
       else if(dime) 
         next_state = cent40; 
       else if(quarter) 
         next_state = cent0; 
         change_count = 2; 
         if(soda) 
           give_soda = 1; 
         else if(diet) 
           give_diet = 1; 
       end 
      cent40: begin 
       if(nickel) 
         next_state = cent0; 
         if(soda) 
           give_soda = 1; 
         else if(diet) 
           give_diet = 1; 
       else if(dime) 
         next_state = cent0; 
         change_count = 1; 
         if(soda) 
           give_soda = 1; 
         else if(diet) 
           give_diet = 1; 
       else if(quarter) 
         next_state = cent0; 
         change_count = 4; 
         if(soda) 
           give_soda = 1; 
         else if(diet) 
           give_diet = 1; 
       end 
      default: next_state = current_state; 
      endcase 

endmodule는

+0

코드 블록을 편집하십시오. –