2016-07-10 4 views
0

나는 FPGA 프로토 타이핑으로의 Verilog 예에서 문제를 해결하기 위해 필요 PongFSM 구현

난에 시뮬레이션 할 때의 Autor의 실수 나 내가 잘못 STH 하고 있어요 경우 vivado 나는 어떤 변화도 발견하지 못한다.

q_reg <= q_next; // ? q_next never initialised ??? 
    // next-state logic // How he wants to set time tick ? 
    assign q_next = q_reg + 1; 
    // output tick 

디 바운싱 회로의 상태도. 사진으로 정의된다

10 MS가

enter image description here

module db_fsm 
    (
    input wire clk, reset, 
    input wire sw, 
    output reg db 
    ); 

    // symbolic state declaration 
    localparam [2:0] 
       zero = 3'b000, 
       wait1_1 = 3'b001, 
       wait1_2 = 3'b010, 
       wait1_3 = 3'b011, 
       one  = 3'b100, 
       wait0_1 = 3'b101, 
       wait0_2 = 3'b110, 
       wait0_3 = 3'b111; 

    // number of counter bits (2^N * 20ns = 10ms tick) 
    localparam N =19; 

    // signal declaration 
    reg [N-1:0] q_reg; 
    wire [N-1:0] q_next; 
    wire m_tick; 
    reg [2:0] state_reg, state_next; 

    // body 

    //============================================= 
    // counter to generate 10 ms tick 
    //============================================= 
    always @(posedge clk) 
     q_reg <= q_next; 
    // next-state logic 
    assign q_next = q_reg + 1; 
    // output tick 
    assign m_tick = (q_reg==0) ? 1'b1 : 1'b0; 

    //============================================= 
    // debouncing FSM 
    //============================================= 
    // state register 
    always @(posedge clk, posedge reset) 
     if (reset) 
      state_reg <= zero; 
     else 
      state_reg <= state_next; 

    // next-state logic and output logic 
    always @* 
    begin 
     state_next = state_reg; // default state: the same 
     db = 1'b0;    // default output: 0 
     case (state_reg) 
     zero: 
      if (sw) 
       state_next = wait1_1; 
     wait1_1: 
      if (~sw) 
       state_next = zero; 
      else 
       if (m_tick) 
        state_next = wait1_2; 
     wait1_2: 
      if (~sw) 
       state_next = zero; 
      else 
       if (m_tick) 
        state_next = wait1_3; 
     wait1_3: 
      if (~sw) 
       state_next = zero; 
      else 
       if (m_tick) 
        state_next = one; 
     one: 
      begin 
       db = 1'b1; 
       if (~sw) 
       state_next = wait0_1; 
      end 
     wait0_1: 
      begin 
       db = 1'b1; 
       if (sw) 
        state_next = one; 
       else 
       if (m_tick) 
        state_next = wait0_2; 
      end 
     wait0_2: 
      begin 
       db = 1'b1; 
       if (sw) 
        state_next = one; 
       else 
       if (m_tick) 
        state_next = wait0_3; 
      end 
     wait0_3: 
      begin 
       db = 1'b1; 
       if (sw) 
        state_next = one; 
       else 
       if (m_tick) 
        state_next = zero; 
      end 
     default: state_next = zero; 
     endcase 
    end 

endmodule 
+0

질문을 잘랐을 것 같습니다. "vivado에서 시뮬레이트하면 변경 사항이 없습니다. ". 이 코드를 어떻게 테스트하고 있습니까? 어떤 문제 또는 오류가 발생합니까? – Teajay

+0

@TJ 그렉과 RahulMenon 응답을 따르십시오 – tohidprogram

답변

2

q_next 초기화 할 필요가 없습니다 틱 생성하는 부분
// 카운터를 고려, 그것은 q_reg에서 파생 된 조합 논리입니다. q_reg은 명시 적으로 초기화되지 않으므로 기본값을 사용합니다.

FPGA에서의 플롭의 기본값은 0이지만 시뮬레이터의 경우 기본값은 X입니다. 이러한 불일치의 이유는 Verilog가 집적 회로 (IC) 시뮬레이션에도 사용되기 때문입니다. 누가 등에 의해 타겟이 FGPA, 간단한 솔루션 중 하나를 선 initial q_reg = {N{1'b0}};를 추가하거나 reg [N-1:0] q_reg = {N{1'b0}};reg [N-1:0] q_reg; 변경하는이므로

기술 노드, 제조 공정 변동, 온도, 랜덤 것 초기 값을 가질 수 퍼 q_reg 초기화 방법을 사용하면 Verilog 시뮬레이션 및 FPGA 일치를 얻을 수 있습니다.

BTW : 대상으로 ASIC을 사용하면 FPGA 솔루션이 작동하지 않습니다 (ASIC 신시사이저에서는 이니셜 라이저가 무시됩니다). ASIC 솔루션은 플럽을 할당하는 always 블록에 리셋 조건 (동기식 또는 비동기식)을 추가하는 것입니다. ASIC 솔루션은 FPGA에서 작동하지만 FPGA는 일반적으로 비동기식 리셋/세트가있는 플롭의 수가 제한적입니다.

+0

(@ 그렉) 리셋 솔루션은 ASIC에 선호되는 방법이지만 카운터는 (처음 몇 클럭 사이클 이후 max에서) 무작위 값으로 안정화되고 첫 번째 롤오버 시작 후 정규 m_ticks 생성. 디 바운싱의 주요 관심사는 정규 m_tick을 얻는 것입니다. 첫 번째 m_tick은 무시할 수 있습니다. –

+0

@ RahulMenon이 디자인의 경우 일반 m_tick을 기다리는 데 최대 10ms의 낭비가있을 수 있지만 ASIC 디자인의 전반적인 모범 사례에서는 예외가 될 수 있습니다. 대부분의 ASIC 디자인에서 10ms는 너무 많은 시간을 낭비합니다. 플러스 전형적인 ASIC 수백 또는 수천 및 때로는 수백만 달러의 대부분은 제어 논리에 사용됩니다. 통제 할 수없는 상태로 인해 예측할 수없고 해로운 행동이 발생할 수 있습니다. 비동기 리셋이없는 의도적 인 플립을 본 ASIC의 유일한 장소는 고속 데이터 파이프 라인에서 제어 로직에 영향을주지 않는 것이 보장 된 곳입니다. – Greg