2017-10-07 7 views
0

Imは4階建ての建物で動作2台のエレベータの をシミュレートするために、PS2キーボードとbasys2での作業のVerilog PS2キーボードからのコードワードとのステートメント(サブ1、2及び3)ラッチ警告によるケース

にこのコードは、各エレベータの内部要求を保存、定義されたCWはPS2キーボードからのコードワードである

paremetersは ps2 keyboard codes

module reg_in2(
    input [7:0] cw, 
    output reg[3:0] reqin_a1, 
    output reg[3:0] reqin_a2 
    ); 
parameter a1_sub = 8'h6b; 
parameter a1_1 = 8'h6c; 
parameter a1_2 = 8'h75; 
parameter a1_3 = 8'h7d; 
parameter a2_sub = 8'h70 ; 
parameter a2_1 = 8'h69 ; 
parameter a2_2 = 8'h72 ; 
parameter a2_3 = 8'h7A ; 

initial 
begin 
reqin_a1 = 4'b0; 
reqin_a2 = 4'b0; 
end 

[email protected](cw) 
begin 
    case(cw) 
    a1_sub: reqin_a1[0] = 1; 
    a1_1: reqin_a1[1] = 1; 
    a1_2: reqin_a1[2] = 1; 
    a1_3: reqin_a1[3] = 1; 
    a2_sub: reqin_a2[0] = 1; 
    a2_1: reqin_a2[1] = 1; 
    a2_2: reqin_a2[2] = 1; 
    a2_3: reqin_a2[3] = 1; 
    default: begin 
       reqin_a1 = reqin_a1; 
       reqin_a2 = reqin_a2; 
       end 
    endcase 
end 

endmodule 
シミュレーションに使用されるキー(PS2キーボードのキー)のための符号語であります私が手の

唯一の警告は

Found 1-bit latch for signal <reqin_a1_0>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems. 

The value init of the FF/Latch 0 hinder the constant cleaning in the block reqin_a1_3. 
    You should achieve better results by setting this init to 1. 

Gated clock. Clock net 
    req_in1/reqin_a2_1_cmp_eq0000 is sourced by a combinatorial pin. This is not 
    good design practice. Use the CE pin to control the loading of data into the 
    flip-flop. 

私の問題は、エラーが、Basys2の予期しない動作ではありません(reqin_a1とreqin_a2のビット毎に)、私はLEDのがreqin_a1とreqin_a2の値をチェックするために使用しています。 ps2キーボードの設計されたキーのいくつかを押すと、複数のLEDが点灯します。 例:私はPS2キーボード(パラメータa2_2)とreqin_a2で2を押して[0]とreqin_a2 [2] 1 に変更されているが、私は本当に多くのことを試してみたので、私は実際にいくつかの助けに

+0

私はあなたが動作を引き起こす 'cw'シグナルにいくつかの不具合があると思います。あなたの入力方法やFPGAの電気的特性によって引き起こされる可能性があります。そのような問題を避けるために、通常、そのようなすべてのデザインが捨てられます。だから、 'clock'を作り、フロップしてモデルクロックをfpgaクロックにつなぎます。 – Serge

+0

と、btwは値を '1'に設定しますが、決してそれらをクリーニングしないでください。それらを '0'にする方法を提供する必要があります。 – Serge

+0

私は実際に、他の鍵の聴取を止めるためにデバウンサ(またはむしろロック)を使ってパッチ解決策を見つけました。私は時間が足りないので、とにかくあなたのアドバイスをスキップします。 (これはテストコードであり、reqsを1に設定するだけです) –

答えて

0

レベルをいただければ幸いです非敏感なラッチは、regがno-sequential alwaysブロックで定義され、すべての可能なブランチの確定値に割り当てられていない場合に発生します。例えば、は、enが低いときにqに値が割り当てられていないため、ラッチです。 else q = q;を追加すると、まだラッチが推測されます。

ボタンを押して複数のライトが点灯する理由は、イネーブルロジックがきれいでないことです。 cwのビットはおそらく数ナノ秒/ピコ秒間隔で到着する。 cwを各状態に一致させるプロロゲーション遅延もあります。どちらの場合も、不具合の犯人である可能性が高い。

最も簡単な解決策は、時計を追加することによってデザインを同期させることです。

always @(posedge clock) 
begin 
    case(cw) 
    a1_sub: reqin_a1[0] <= 1; 
    a1_1: reqin_a1[1] <= 1; 
    // ... 
    a2_2: reqin_a2[2] <= 1; 
    a2_3: reqin_a2[3] <= 1; 
    // Note default is not required 
    endcase 
end 

意図的にラッチを作成する場合は、イネーブルロジックをきれいにしておいてください。好ましくはクロック源からのものである。ノンブロッキング割り当て<=を使用してください。ラッチロジックをできるだけシンプルに保つようにしてください。私は各ラッチイネーブル信号に対して別々の常時ブロックを持つことを推奨しました。ラッチはしばしば意図的ではない。あなたのコードとシンセサイザーを読んでいる誰もが意図的なラッチを識別しやすいようにしてください。コメント(人間のみ)、プラグマ(ツール固有)を使用するか、SystemVerilogを有効にしてalways_latch(ユニバーサル)を使用してください。

+0

実際、警告は消えました。しかし、今は全く動かず、キーを押しても何も起こりません。低周波クロックを試しました(周波数が1Mhzから50kHzまで) –

+0

クロック周波数を下げると、サンプリングレートが低下します。 1MHzは1us、50kHzは20usです。 'cw'が押されたままで同じ値を保持していると仮定すると、両方ともキープレスに十分なはずです。'cw'が' reg_in2'の立ち上がりクロックの左側で待機する値を持っていることを確認する必要があります。 FPGAの代わりにVerilogシミュレーションを実行すると、その動作を波形でデバッグできます。あなたのコードがps2プロトコルから 'cw'をどのように決定するのか見ることなく、私は助けることができます。 – Greg

+0

私はついにそれを解決しました。 Verilogは何とか私の課題を無視していた(私は常に1を割り当てたので推測する)。もはや有効でなくなった要件を排除した最終的なソリューションを統合したとき、それは機能しました。 –