2016-12-08 13 views
0

4つの空の4ビットレジスタを持つレジスタファイルを作成していて、クロックサイクルごとにレジスタに値がプッシュされ、 7セグメントデコーダ。レジスタが空の場合、ディスプレイは存在しないはずですが、値がレジスタにロードされると、ディスプレイが存在するはずです。私は7セグメントデコーダのVerilogコードを書こうとしましたが、En = 1の場合にのみ出力する必要があります。私の問題は、何も表示しない代わりに、7セグメントデコーダがレジスタに値が追加されるまで0を表示することですその場合、デコーダはロードされた値を表示する。ここでは、Verilogコードです。レジスタに値がロードされ有効になっている場合にのみ出力を持つVerilogコードを書く

module seven_seg_decoder(S, Z, Y, X, W,En); 
input Z,Y,X,W,En; 
output [6:0] S; 
reg [6:0] S; 

always @(En) 
    begin 
     case({Z,Y,X,W,En}) 
      5'b00001: S = 'b0000001; 
      5'b00011: S = 'b1001111; 
      5'b00101: S = 'b0010010; 
      5'b00111: S = 'b0000110; 
      5'b01001: S = 'b1001100; 
      5'b01011: S = 'b0100100; 
      5'b01101: S = 'b0100000; 
      5'b01111: S = 'b0001111; 
      5'b10001: S = 'b0000000; 
      5'b10011: S = 'b0000100; 
      5'b10101: S = 'b0001000; 
      5'b10111: S = 'b1100000; 
      5'b11001: S = 'b0110001; 
      5'b11011: S = 'b1000010; 
      5'b11101: S = 'b0110000; 
      5'b11111: S = 'b0111000; 

     endcase 
    end 
endmodule 

、私は出力レジスタは、それがロードされていることを言ってから来ている、そしてそれは、このデコーダ上で

答えて

1

ルックを有効にするための入力として使用されていますあなたが列挙されてきた{Z, Y, X, W, En}の可能エンコーディング:Enの値の

5'b00001: S = 'b0000001; 
5'b00011: S = 'b1001111; 
5'b00101: S = 'b0010010; 
5'b00111: S = 'b0000110; 
5'b01001: S = 'b1001100; 
5'b01011: S = 'b0100100; 
5'b01101: S = 'b0100000; 
5'b01111: S = 'b0001111; 
5'b10001: S = 'b0000000; 
5'b10011: S = 'b0000100; 
5'b10101: S = 'b0001000; 
5'b10111: S = 'b1100000; 
5'b11001: S = 'b0110001; 
5'b11011: S = 'b1000010; 
5'b11101: S = 'b0110000; 
5'b11111: S = 'b0111000; 
// ^Look here 

すべてが1です! En0の場合、モジュールに何をすべきかを決して伝えませんでした。ディスプレイを空白にすることは知られていません。あなたはそれに何かする必要があります。

default: S = 'b0000000; //change to whatever means "turn everything off" 

不コンプレックス:あなたが列挙されていないすべての場合に表示をブランクデフォルト句を追加することができます

シンプルなソリューション

あなたはいくつかのオプションを持っていますソリューション

句として5'bxxxx0を使用し、 casexの文を使用すると、より正確な結果を得ることができます。

casex ({Z,Y,X,W,En}) 
    // all other enumerated cases 
    5'bxxxx0: S = 'b0000000; //change to "everything off" 
    default: S = 'b0000000; //change to "everything off" 

しかし、それは難しく、正しく使用し、驚くべき行動につながることができますcasexにはいくつかの潜在的な落とし穴があることを知っています。また、これは最初の単純な解決策と同じになることに注意してください。私は今それを避けるだろう。

(マイ)プリファードソリューション

これは効果的に最初の二つと同じですが、私は意思がはるかに明確だと思う:

always @(*) 
    begin 
     if (!En) 
      S = 'b0000000; // change to "everything off" 

     else 
      case({Z,Y,X,W,En}) 
       5'b00001: S = 'b0000001; 
       5'b00011: S = 'b1001111; 
       5'b00101: S = 'b0010010; 
       5'b00111: S = 'b0000110; 
       5'b01001: S = 'b1001100; 
       5'b01011: S = 'b0100100; 
       5'b01101: S = 'b0100000; 
       5'b01111: S = 'b0001111; 
       5'b10001: S = 'b0000000; 
       5'b10011: S = 'b0000100; 
       5'b10101: S = 'b0001000; 
       5'b10111: S = 'b1100000; 
       5'b11001: S = 'b0110001; 
       5'b11011: S = 'b1000010; 
       5'b11101: S = 'b0110000; 
       5'b11111: S = 'b0111000; 
       default: S = 'b0000000; // change to some error code 
      endcase  
    end 

このソリューションの利点は、ということですあなたのコードの目標ははるかに明確です。Enが真でない場合、残りのシグナルは問題になりません。我々はディスプレイをクリアする。これは他の解決策でも起こりますが、この構造により、何が起こっているのかがより明確になります。

defaultここでは技術的には必要ありません。列挙されていないEnが真である場合はありません。しかし、それは多くの数字を入力することです。タイプミスをした場合、そのような場合、エラー表示を強制するデフォルト(7segディスプレイの中心線など)を持つと、バグを識別するのに役立ちます。

他のいくつかの注意事項:

  1. あなたは変数名としてXZを使用しないようにしてください。彼らは "気にしない"と "高いインピーダンス"のために混乱するかもしれません。それは、必要以上にコードを追跡するのを困難にします。

  2. 感性リストを変更しました。 Greg correctly pointed out入力がW,X,YおよびZに変更されたときに正しく出力されるようにするには、変更時にalwaysブロックがトリガーされる必要があります。 *演算子は、alwaysブロックの内容に基づいて正しい感度リストを推論するようにVerilogコンパイラに指示します。

  3. すべてのビットパターンをparametersに入れてコードを読みやすくすることを強くお勧めします。

+0

私はあなたが言っていることを見ていますが、あなたが言及した節に入れても、それでも8を表示しませんか?デフォルトの原因は、ケースと同じ出力を作成します。5'b10001 – Zebs

+0

申し訳ありませんが、誤って入力するのが早すぎます。コメントを編集しました – Zebs

+0

出力エンコードが何であるか分かりません。 "何も表示しない"という意味に変更してください。 – skrrgwasme

関連する問題