2016-07-10 7 views
0

すべての変更を見つけることはありません。FSMの実装(タイムティックでエラー)

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ミリ秒

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ソリューションは、フロップを割り当てる常時ブロックにリセット条件(同期または非同期)を追加することです。 ASICソリューションはFPGAで動作しますが、FPGAは一般的に非同期リセット/セットのフロップの数が限られています

+0

(@ Greg)リセットソリューションはASICにとって好ましい方法ですが、カウンタは(最初の数クロックサイクル後にmaxで)ランダムな値に落ち着き、最初のロールオーバー開始後通常のm_ticksを生成します。デバウンシングの主な懸念事項は、正規のm_tickを取得することです。最初のm_tickは無視されます。 –

+0

@ RahulMenonこのデザインの場合、通常のm_tickを待つ最大10msの無駄が許容されるかもしれませんが、ASICデザインの全体的なベストプラクティスではわずかです。ほとんどのASIC設計では、10msは無駄な時間を要します。さらに、典型的なASICには数百または数千、場合によっては何百万ものフロップがあり、そのほとんどが制御ロジックに使用されています。制御されていない状態では、予測できない有害な動作が発生する可能性があります。非同期リセットなしの意図的なフロップを見たASICの唯一の場所は、制御ロジックに影響を与えないことが保証されている高速データパイプラインです。 – Greg

関連する問題