【FPGA】ModelSimのTutorial 。。演習4 7セグ・デコーダ【Verlog HDの基礎の基礎】

スポンサーリンク
広告

これまでの経緯

全部書くのメンドクサイので、前回は、

【FPGA】Tutorial 演習問題を解きながら理解しようと。。演習3マルチプレクサ【Verlog HDの基礎の基礎】
知らないこと勉強するのって。。面白い こんな年で、こんなことするのって。。意外に面白いですね。。まぁ、大学生の学部レベルの話だからなんだろ...

でした。 続いて 演習4です

演習4 7セグ・デコーダ

Case を使って、入力 inp3ビット から、a,b,c,d,e,f,g に 1ビットづつ出力しろと。。

7セグデコーダのサンプルもググると沢山でてきますね。

http://www.arch.cs.kumamoto-u.ac.jp/project/kite/3days/explain/VHDL/example/7segment_decoder.html
[FPGA Tutorial] Seven-Segment LED Display on Basys 3 FPGA
FPGA tutorial guides you how to control the seven-segment LED display on Basys 3 FPGA Board. A display controller is designed and full Verilog code is provided.

Example 29 に乗ってる

テストベンチを見てみる。。ピンを配列化?

Portmapの記述が、こんな感じ

seven u1 (.inp(inp),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g));

出力a,b,c,d,e,f,g がばらばらになっているので。。 書き方としてなんか工夫ないかな?って調べてたら。。

http://ifdl.jp/akita/class10/2.html

に、Encoder Decoderで 配列のような扱い方が書かれていました。

module sample(SW, LED);
  input  [1:0] SW;
  output [3:0] LED;

  wire   [1:0] d;
  reg    [3:0] q;

  assign d = {SW[1], SW[0]};
  assign LED = q;

  always @(d) begin
    case (d)
      2'b00 : q <= 4'b0001;
      2'b01 : q <= 4'b0010;
      2'b10 : q <= 4'b0100;
      2'b11 : q <= 4'b1000;
    endcase
  end
endmodule

このVerilog HDL簡易文書法だと、case内で{a,b,c..}みたいな使い方もできるみたいですね。

いったん、7ビット幅の配列にして、assign すれば良さそう。

reg[6:0] outseg ;
assign outseg={a,b,c,d,e,f,g};

って感じかな?

こういう書き方をしておくと、case 内での書き方がきれいになりそうですね。

上の動作条件を一応書いてみると

always @(inp) begin 
case (inp) 
3'b000: outseg<= 7'b1111110;
3'b001: outseg<= 7'b0110000;
3'b010: outseg<= 7'b1101101;
3'b011: outseg<= 7'b1111001;
3'b1xX: outseg<= 7'b1001111;
endcase 
end

ん?? x?? 不定って表せるのかな??

やってみますかね??

regにイコールで代入できない。。そうだよね。assignも反対だし。。ということで。。

module seven(inp, a,b,c,d,e,f,g);

input[2:0] inp;
output[1:0] a,b,c,d,e,f,g;

wire[2:0] inp;
reg[6:0] outseg;

assign a=outseg[6];
assign b=outseg[5];
assign c=outseg[4];
assign d=outseg[3];
assign e=outseg[2];
assign f=outseg[1];
assign g=outseg[0];

always @(inp) begin
case (inp)
3'b000: outseg<= 7'b1111110;
3'b001: outseg<= 7'b0110000;
3'b010: outseg<= 7'b1101101;
3'b011: outseg<= 7'b1111001;
3'b1XX: outseg<= 7'b1001111;
endcase
end

とりあえず、これで動いたけど、やっぱり3’b1XX ってうまく動かないみたい。

論理値

(2) 論理値
 1ビットの信号が取りうる値は,論理回路の世界では0と1ですが,VHDLの世界ではこれだけではありません.不定値Xや,ハイ・インピーダンスのZがあります.正確に言えば,これら論理値もパッケージの中で定義されています.(出典)

X:不定値

Z:ハイ・インピーダンス

Case 文と ?X Zの補足文

補足 - z,xに対する比較演算子とcase文

?と書けばいいのか?

あと、Caseにはdefault って書くときとOthersと書くときがあるみたいだけど。。どっちなのかな??

default: outseg<=7'b1001111;

とりあえず、これを入れたら。。思い通りの結果にはなったけど。。

3’b1??: outseg<= 7’b1001111; でも XXでも動くので。。どっちが正解か??わからないです。。誰か教えて~

Githubにソースおいておきます。

ちなみに、Case文はこちらも参考に

http://hirokinakaharaoboe.net/yaruo_verilog/chapter1_7.html

コメントを残していただけるとありがたいです

Loading Facebook Comments ...
%d人のブロガーが「いいね」をつけました。