2016-05-26 20 views
1

私は実際に自分のコードを作るのに3日間努力しています。私は多重化された7セグディスプレイを備えた開発ボードを持っています。問題は、変数をインクリメントしようとするときです。私は以下のコードを書いています:Verilog - ボタンを使って変数をインクリメントする

assign buttons = debouncedL | debouncedR; 

always @(posedge buttons or negedge RES) begin 
    if(~RES) number <= 0; 
    else if(debouncedL) number <= (number + 10); 
    else if(debouncedR) number <= (number + 1); 
end 

そして、うまくいきません。 Rボタンを押すと、変数は1だけインクリメントされますが、Lを押すと何も起こりません。 else ifの位置を変更した後でも、Lボタンを押してもLボタンは機能せず、表示番号は0000〜0001の間で切り替わります。それは初心者の質問かもしれませんが、私は本やインターネット上で解決策を見つけることができません。手伝って頂けますか?前もって感謝します。

+0

'number'が定義されている方法は? – wilcroft

+0

これは: 'reg [13:0] number;' – Kma

+0

あなたのFPGAツールキットは実際にこれをどのように実装していますか?私はあなたの奇妙なトリガーロジックが同期設計よりも合成を難しくしていると思うように描かれています。 – hexafraction

答えて

0

あなたのデザインは非同期で、あなたはmetastability on buttonsシグナルを持っています。

同期デザインでは(すべてのFPGAデザインは同期する必要があります)は常にというプロセスでクロックを使用できます。あなたの設計では、ボタン信号を時計として使用しています。あなたはボタン信号の古い状態を保存して、このように現在の状態にそれを比較する必要がボタンの上にエッジを上げ検出するため

always @(posedge clock or posedge rst) begin 
    // detect rising edge 
    if (button_old != button && button == 1'b1) 
      button_raise <= 1'b1 
    button_old <= button; 
    // increment number 
    if(button_raise == 1b'1) 
    begin 
     if(~RES) number <= 0; 
     else if(debouncedL) number <= (number + 10); 
     else if(debouncedR) number <= (number + 1); 
    end 
end 
+0

ありがとうございます!今、私はなぜ新しいコードが動作するのか知っています。古いものはありません。 – Kma

+0

ようこそ。 あなたの問題が解決された場合、解決したとして応答を確認することを忘れないでください;) – FabienM

+0

私はそれを確認したいと思います。私はstackoverflowの仕組みを学んでいます。あなたはコードの残りについて何を言うことができますか?私は上記のコメントにそれを掲載しました。経験豊富なコーダーからのヒントは、私にとっては非常に便利です(私はすでにBCD変換に2進法の "Shift and add 3"アルゴリズムについて知っています)。 – Kma

関連する問題