これまでの経緯
全部書くのメンドクサイので、前回は、
【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
https://www.fpga4student.com/2017/09/seven-segment-led-display-controller-basys3-fpga.html
テストベンチを見てみる。。ピンを配列化?
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:不定値
Case 文と ?X Zの補足文
http://zakii.la.coocan.jp/hdl/59a_zx_compare.htm
?と書けばいいのか?
あと、Caseにはdefault って書くときとOthersと書くときがあるみたいだけど。。どっちなのかな??
default: outseg<=7'b1001111;
とりあえず、これを入れたら。。思い通りの結果にはなったけど。。
3’b1??: outseg<= 7’b1001111; でも XXでも動くので。。どっちが正解か??わからないです。。誰か教えて~
Githubにソースおいておきます。
ちなみに、Case文はこちらも参考に
http://hirokinakaharaoboe.net/yaruo_verilog/chapter1_7.html
コメントを残していただけるとありがたいです