2017-12-05 3 views
-1

私は大きなスタンプの一部を書いています。私はVerilogに慣れていないので、助言をいただければ幸いです。Verilogはケースステートメントでオプションをデフォルトに設定しているようです

4つのボタンのうちの1つを押すと、4つの7セグメントディスプレイの最初に数字(1-4)が書き込まれます。

module final(CLK,button1,button2,button3,button4,a0,b0,c0,d0,e0,f0,g0,a1,b1,c1,d1,e1,f1,g1,a2,b2,c2,d2,e2,f2,g2,a3,b3,c3,d3,e3,f3,g3); 
    input CLK,button1,button2,button3,button4; 
    output a0,b0,c0,d0,e0,f0,g0,a1,b1,c1,d1,e1,f1,g1,a2,b2,c2,d2,e2,f2,g2,a3,b3,c3,d3,e3,f3,g3; //What a mess 

    integer i = 0; 

    reg [6:0] temp; 
    reg [6:0] sevenDisp0; 
    reg [6:0] sevenDisp1; 
    reg [6:0] sevenDisp2; 
    reg [6:0] sevenDisp3; 
    reg [2:0] place; 

    initial begin 
    temp = 7'b1110111; 
    sevenDisp0 = 7'b1110111; 
    sevenDisp1 = 7'b1110111; 
    sevenDisp2 = 7'b1110111; 
    sevenDisp3 = 7'b1110111; 
    i = 0; 

    end 
    always @(button1 or button2 or button3 or button4)// or sevenDisp0 or sevenDisp1 or sevenDisp2 or sevenDisp3)//bit1 or bit2) 
    begin 
     case({button1,button2,button3,button4}) 
      4'b0111: sevenDisp0 = 7'b1001111; //Have tried 4'b1111 to troubleshoot 
      4'b1011: sevenDisp0 = 7'b0010010; 
      4'b1101: sevenDisp0 = 7'b0000110; 
      4'b1110: sevenDisp0 = 7'b1001100; 
      //default: sevenDisp0 = 7'b1110111; 
     endcase 
    end 


    assign {a0,b0,c0,d0,e0,f0,g0} = sevenDisp0; 
    assign {a1,b1,c1,d1,e1,f1,g1} = sevenDisp1; 
    assign {a2,b2,c2,d2,e2,f2,g2} = sevenDisp2; 
    assign {a3,b3,c3,d3,e3,f3,g3} = sevenDisp3; 

endmodule 

私、非常に限られ、理解し、私の4つのボタンの一つが押されるたびに、それは常に文を実行しますから。どのボタンが押されても、sevenDisp0レジスタに書き込まれます。

ボタンの1つが押されたときにボタンが0になり、オンのときに7つのセグメントが0になります。

最初の7セグメントに数字が表示されます。他のボタンを押すと、ボタンを押している間に対応する番号が表示され、番号1に戻ります。

私はこれを今6時間解決しようとしています。どんな助けも素晴らしいだろう。

+0

シミュレーションを実行しましたか?シミュレーションの結果はあなたの期待と一致しましたか? – toolic

+0

私にはシミュレーションがありません。 –

+1

誰かがこれを将来的にgooglesする場合: 実際に正しく機能するためには、レジスタを非ブロッキング表記に切り替える必要がありました。 –

答えて

0

sevenDisp0推測ラッチ(レベルセンシティブ)では、すべての可能なパスに値が割り当てられていないためです。予期しない動作の原因となる可能性があるため、ラッチを回避するようにしてください。ほとんどのFPGAは、ラッチのサポートが制限されているか、サポートされていません。あなたのデザインでは、純粋なcombiantロジックとフロップ(クロックエッジトリガ)を使用する必要があります。

あなたはsevenDisp0がその値を格納したい、その後、組み合わせ論理(=割り当てをブロック使用)を使用しない場合:あなたはsevenDisp0がその値を格納したいならば

always @* // auto-sensitivity 
    begin 
    case({button1,button2,button3,button4}) 
     4'b0111: sevenDisp0 = 7'b1001111; //Have tried 4'b1111 to troubleshoot 
     4'b1011: sevenDisp0 = 7'b0010010; 
     4'b1101: sevenDisp0 = 7'b0000110; 
     4'b1110: sevenDisp0 = 7'b1001100; 
     default: sevenDisp0 = 7'b1110111; //Needed or will be a latch 
    endcase 
    end 

を、その後、トリガすることによって、それはシーケンシャルmakeを使用FYI

always @(posedge CLK) 
    begin 
    case({button1,button2,button3,button4}) 
     4'b0111: sevenDisp0 <= 7'b1001111; //Have tried 4'b1111 to troubleshoot 
     4'b1011: sevenDisp0 <= 7'b0010010; 
     4'b1101: sevenDisp0 <= 7'b0000110; 
     4'b1110: sevenDisp0 <= 7'b1001100; 
     //default: //Retain previous value of sevenDisp0 
    endcase 
    end 

:組み合わせについて(Aクロックエッジで(<=割り当てを非ブロック使用)意図的なラッチ)ロジックの場合、自動感度@*または同義語@(*)を使用する必要があります。感度リストのハードコーディング信号は、Verilog-1995規格に準拠する必要がある場合にのみ必要です。 Verilog-2001 @*は、RTLシミュレーションとゲート/ FPGA /などの動作の不一致につながるシグナルの欠落のリスクを回避するため、推奨されています。さらに、タイピングも大幅に少なくなりました。

もう1つの提案は、ANSIスタイルのヘッダー(Verilog-2001で追加された別の機能)を使用することです。これにより、ポートの方向を宣言し、ポートリストの順序で入力することができます。また、タイピングも少なくなっています。例:

module final(
    input CLK, 
    input button1,button2,button3,button4, 
    output a0,b0,c0,d0,e0,f0,g0, // much 
    output a1,b1,c1,d1,e1,f1,g1, // easier 
    output a2,b2,c2,d2,e2,f2,g2, // to 
    output a3,b3,c3,d3,e3,f3,g3); // read 

reg [6:0] sevenDisp0; 
// ... 
関連する問題