回路設計の基礎 | Verilog HDLとは?

このQ&Aのポイント
  • 回路設計の基礎を学びながら、Verilog HDLについて理解を深めましょう。
  • 宿題の課題で7セグメントデコーダの回路をVerilog HDLで設計する方法について教えてください。
  • Verilog HDL文の動作レベルでの記述について理解を深めましょう。
回答を見る
  • ベストアンサー

回路の設計 教えて

宿題の課題で7セグメントデコーダの回路をVerilog HDLというもので設計してきてくださいと言われて宿題をやったのですが、正直よくわからなくて教科書のものを映して提出してしまいました。 よくわからなかったというのは、Verilog HDL文の動作レベルでの記述で何が何のことを言っているのかわかりませんでした。だれか下の動作レベルでの記述はここではこうなんだよと教えてくれると助かります。 `define SEG_OUT_0 7'b011_1111 `define SEG_OUT_1 7'b000_0110 `define SEG_OUT_2 7'b101_1011 `define SEG_OUT_3 7'b100_1111 `define SEG_OUT_4 7'b110_0110 `define SEG_OUT_5 7'b110_1101 `define SEG_OUT_6 7'b111_1101 `define SEG_OUT_7 7'b010_0111 `define SEG_OUT_8 7'b111_1111 `define SEG_OUT_9 7'b110_1111 `define SEG_OUT_ERR 7'b111_1001 /*7SEG_DECODER*/ module SEG7_DEC (IN,OUT); input [3:0]   IN; output [6:0] OUT; assign OUT = FUNC_SEG7_DEC (IN); function[6:0] FUNC_SEG7_DEC ; input [3:0] IN; case(IN) 0:  FUNC_SEG7_DEC = `SEG_OUT_0; 1:   FUNC_SEG7_DEC = `SEG_OUT_1; 2:  FUNC_SEG7_DEC = `SEG_OUT_2; 3:   FUNC_SEG7_DEC = `SEG_OUT_3; 4:   FUNC_SEG7_DEC = `SEG_OUT_4; 5:   FUNC_SEG7_DEC = `SEG_OUT_5; 6:   FUNC_SEG7_DEC = `SEG_OUT_6; 7:   FUNC_SEG7_DEC = `SEG_OUT_7; 8:   FUNC_SEG7_DEC = `SEG_OUT_8; 9:   FUNC_SEG7_DEC = `SEG_OUT_9; default: FUNC_SEG7_DEC = `SEG_OUT_ERR; endcase endfunction endmodule

質問者が選んだベストアンサー

  • ベストアンサー
  • ybnormal
  • ベストアンサー率50% (220/437)
回答No.1

> `define SEG_OUT_0 7'b011_1111 これは、SEG_OUT_0という変数に011_1111という値を割り当てている(数値内で使われるアンダースコアはVerilogでは無視されるので、7'b011_1111は0111111と等価)。これは、後々011_1111を引用するときに、011_1111という意味不明の数字を使うのではなく、SEG_OUT_0という変数を使うことにより、コードが読みやすくなるため。 > module SEG7_DEC(IN, OUT); ブロック名の宣言. > input [3:0]   IN; > output [6:0] OUT; ポートの宣言。入力ポートINは4ビット、出力ポートOUTは7ビット。 functionとendfunctionで挟まれた部分はいわばサブルーチンのようなもので、、 INが0000であれば、FUNC_SEG7_DECにSEG_OUT_0、つまり011_1111を代入、INが0001であればFUNC_SEG7_DECにSEG_OUT_1,つまり000_0110を代入、INが0010であればFUNC_SEG7_DECにSEG_OUT_2を代入,,.....というサブルーチン処理を定義してると考えればよい。 最後のdefaultはINが0から9のどれにも一致しなかった場合に実行されるブロックで、論理合成をするときにラッチを作るのを避けるためのもの。 でそのfunctionを呼び出しているのが、 assign OUT = FUNC_SEG7_DEC (IN); このブロック全体で行っている処理は、 IN=0000ならOUT=0111111 IN=0001ならOUT=0000110 IN=0010ならOUT=1011011 ... ..

tokkurisann
質問者

お礼

返事が遅れてしまいすみませんでした。 凄く詳しい回答ありがとうございました。どこがどういう機能か前よりも理解することができました。

関連するQ&A

  • Verilog-HDLでの記述方法

    Verilog-HDLで回路を記述しているのですが、疑問点があるので質問させていただきます。 回路記述はおおまかに以下のようなものです。 module Adder(A, B, S, C); input [3:0] A; input [3:0] B; output [3:0] S; output C; 4ビット加算器のインスタンス(.A(A), .B(B), .S(S), .C(C)); endmodule この回路への入力は上位モジュールから与えられるとします。 このような回路記述をしていたとして、たとえば入力線Aの特定のビットが常に0になってしまう故障を記述したいとき wire err = 1'b0; assign A[0] = err; という記述を追加してみたのですが、どうもA[0]には不定値が入り込んでいるようです。 このような記述ではA[0]を常に0にすることはできないのでしょうか?またこのような故障を仮定したい場合はどのように記述すべきなのでしょうか?

  • Verilog HDL 3_5セレクタ

    Verilog_HDLで3_5セレクタを作成しているのですが、うまくいかないので助けてください。 1つの4ビットの入力と2つの5ビットの入力の中から5ビットの出力を選び出す回路です。入力が4ビットのとき、最上位に0をつけ、5ビットにする。SELの組み合わせにより、出力を選択する。 /* 3-5SELECTOR */ module SEL3_5module (A, B, C, SEL, OUT); input [3:0] A; input [4:0] B, C; input [1:0] SEL; output [4:0] OUT; wire [4:0] IN; CONECT (A[0],IN[0]); CONECT (A[1],IN[1]); CONECT (A[2],IN[2]); CONECT (A[3],IN[3]); CONECT (0,IN[4]); assign OUT = SEL4_5_FUNC (IN, B, C, SEL); function [4:0] SEL4_5_FUNC; input [4:0] IN, B, C; input [1:0] SEL; case ( SEL ) 0: SEL4_5_FUNC = IN; 1: SEL4_5_FUNC = B; 2: SEL4_5_FUNC = C; 3: SEL4_5_FUNC = 0; endcase endfunction endmodule エラー文はError: Node instance "comb_4" instantiates undefined entity "CONNECT" Error: Node instance "comb_5" instantiates undefined entity "CONNECT" Error: Node instance "comb_6" instantiates undefined entity "CONNECT" Error: Node instance "comb_7" instantiates undefined entity "CONNECT" Error: Node instance "comb_8" instantiates undefined entity "CONNECT" です。 よろしくお願いします

  • 2ビットのレジスタのVerilog HDL記述

    QuatusIIで2ビットのレジスタをつくっているのですが、ブロック図をコンパイルするときにエラーがでてしまいます。 エラー内容をみるとVerilog HDL記述が間違えているみたいなのですが、どこが間違えているか教えてください。 /* REG2 */ module REG2module ( EN, CLR_B, IN1, IN2, CLK, Q ); input CLR_B, CLK; input IN1, IN2; output [1:0] Q; output EN; assign EN=FUNC_EN (IN1, IN2); function FUNC_EN; input IN1,IN2; if (IN1>0|IN2>0) FUNC_EN=1; else FUNC_EN=0; endfunction wire [1:0] D; CONECT (IN1,D[0]); CONECT (IN2,D[1]); reg [1:0] Q; always @( posedge CLK or negedge CLR_B ) if( !CLR_B ) Q <= 0; else if(EN) Q <= D; endmodule エラーにはError: Node instance "comb_8" instantiates undefined entity "CONECT" Error: Node instance "comb_9" instantiates undefined entity "CONECT" と出ています。意味を調べたのですが、CONECTが定義されていない?という事は具体的にどうすればいいでしょうか。 CONECT (IN1,D[0]); CONECT (IN2,D[1]); の部分が間違っているのはなんとなくわかるのですが、どうしたらいいかわかりません。 よろしくお願いします

  • 変数の値がおかしくなる

    以下のようなプログラム(DLLとEXE)を書いたのですが、変数の値がおかしくなる(●参照)箇所があります。原因がお分かりになりましたら、ご回答をよろしくお願い致します。 ●mkdll.cppの、sub1()の(※1)までは、input[]が正しい値で入っているが、(※2)で値がおかしくなる。(※1)から(※2)までで、input[]は参照するだけです。 ---test.cpp(EXE)--- … main(){ int input[10],output[10]; int err; CDLL DLL; err = DLL.func(input,output); … return(0); } ---test.cpp End--- ---mkdll.h(DLL)--- … class __declspec(dllexport) CDLL{ public: int func(int *input, int *output); private: int sub1(int *input, int *output); int sub2(int in, int out); … }; ---mkdll.h End--- ---mkdll.cpp(DLL)--- #include "mkdll.h" … int CDLL::func(int *input, int*output){ int i; int error; error = sub1(input, output); return(error); } int CDLL::sub1(int *input, int *outout){ int i; int in1, in2, out1, out2; int err; //(※1) for(i=0; i<5; i++){ err = 0; in1 = input[i*2]; in2 = input[i*2+1]; //(※2) err = sub2(in1, out1); if(err != 0) return(err); … } } … ---mkdll.cpp End---

  • verilogでのwhile文について質問

    verilog初心者です。 while文での処理を記述していたのですが、 下記のように変更するとエラーとなってしまいます。 なんとか出来る方法はないでしょうか? module TEST(in_data, state, clock, reset, out); input [9:0] in_data; input [5:0] state; input clock; input reset; output [5:0] out; reg [5:0] out; always@(posedge clock or negedge reset) begin if(reset == 0) begin out = 0; end else begin out = in_data; while(out > 7)begin out = out >> 1; end end end // always@ (posedge clock or negedge reset) endmodule // TEST 上のように書くと、合成でき、シミュレーションでも期待する値は得ることが出来ました。 以下のようにwhile文を変更するとエラーとなってしまいます。 while(out > state)begin out = out >> 1; end よろしくお願いします。

  • フリーのverilog-HDLシミュレータ

    Windows上で動作するフリーのverilog-HDLシミュレータを探しています。 Siliosが少し前までフリーでダウンロードできたそうなのですが、今はダウンロードが禁止されています。。 例えば、このような回路を波形を見ながら解析したいと考えています。 //○シミュレーション対象:4ビット加算回路 module adder ( a, b, q ); input [3:0] a,b; output [3:0] q; assign q = a + b; endmodule //○シュミレーション記述 `timescale 1us/1us module adder_test; reg [3:0] a,b; wire [3:0] q; parameter STEP=1000 adder adder ( a, b, q ); initial begin a = 4'h0; b = 4'h0; #STEP a = 4'h5; b = 4'ha; #STEP a = 4'h7; b = 4'ha; #SEEP $finish; end endmodule

  • verilog 符号付加減算(最上位符号拡張)について教えてください

    verilog初心者で、(2の補数形式)符号付加減乗算器を作成しています。 …が符号拡張のところで解決できずにいます f(--;) もとの数a,bの最上位ビット(符号ビット)を16ビット分(乗算器に あわせ)増やすことは理解できたのですが、それをどうverilog 記述すればいいのかわかりません。下記にある記述ではエラーと なってしましました。 0拡張や、演算結果の最上位ビットだけを符号ビットにしてみたりし たのですが、これではダメとのことで もうどうやったらいいのか わからなくなってきました。(TT); どなたか教えてください。 m(_ _)m -------------------------------------------------------------- module kadai(a,b,c,q); input [15:0] a,b; input [2:0] c; output [32:0] q; wire [32:0] q; assign q =(c == 3'b000)?{16{a[0]},a}+{16{b[0]},b}: (c == 3'b001)?{16{a[0]},a}-{16{b[0]},b}:      (c == 3'b010)?{16{a[0]},a}*{16{b[0]},b}; endmodule ---------------------------------------------------------------- {16{a[0]},a}や{16{a[0]},b}という表現がいけないようなのですが… よろしくお願い致します。

  • Verilogでの通信

    現在CPLD(MAX2)とVerilog-HDLを用いて、センサの信号が入力された回数をPCにシリアル通信(RS232C)で送信する回路を作成しています。 http://www.hmwr-lsi.co.jp/fpga/fpga_3.htm 上記のサイトを参考に通信部を作成しましたが、 例えば「300」 と送信したい場合に 8'b0000_0011(3) 8'b0000_0000(0) 8'b0000_0000(0) と3回にわけて送信したいのですが、Verilog-HDLではそのように記述すればよいでしょうか? お分かりになられる方がいらっしゃいましたら、ご教授宜しくお願い致します。

  • verilogでデマルチプレクサの作り方

    verilog初心者です。 ISEにてロジックを作成しているのですが、 verilogでデマルチプレクサをつくりたいのですが良い参考資料が 見当たらない為困っています。 module SEL(CLK, S, OUT); input CLK; input [2:0] S; output [3:0] OUT; といったような構成なので このクロック信号をセレクト結果によって たとえば s=000 OUT[0]=CLK OUT[1]=0 OUT[2]=0 OUT[3]=0 s=001 OUT[0]=0 OUT[1]=CLK OUT[2]=0 OUT[3]=0 といったようにしたくて、case文等を使用して 出力させようと記述してみたものの、エラーでパラで出力できない と表示されます。 何卒アドバイスをお願いします。

  • 「入門Verilog HDL記述」 の 一例について

    「入門Verilog HDL記述」を読みながらVerilog を勉強中なのですが、周りに聞ける人がいないので、質問させてください。 (ちなみに VHDL は習得しているつもりです。) いろいろ疑問点があるので、分けて何点か質問させていただきました。 改訂版 入門Verilog HDL記述の240ページのリスト II.5に generate ブロックと if 分についての以下のようなコードがありますが、 これは期待通りには動かないと思うのですが。。。 module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); parameter sel_type = 1; generate if(sel_type == 1) begin: sel_always reg [3:0] dout; always @* begin if(sel) dout <= d1; else dout <= d0; end end else if(sel_type == 2) begin: sel_cond wire [3:0] dout; assign dout = (sel == 1) ? d1 : d0; end endgenerate endmodule ModelSimでシミュレーションしてみましたが、generate文の中の reg [3:0] dout は generate 文の中のスコープでのみ定義されているらしく、 output [3:0] dout とは別の信号らしいです。よってoutputには何も代入されず。 試しに、xilinx の ISE でコンパイルしてみたが、やっぱり output には なにも接続されず、セレクタなんて生成されませんでした。 そもそも module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); reg [3:0] dout; みたいに書くと、2回宣言されているとなってエラーになります。 よって、参照ソースコードみたいに reg と wire を切り替えるような書き方はそもそもできないのでは? 皆さんどう思われますか? (インデントがうまくいかず、読みづらくてすいません。)