270 likes | 550 Views
回路記述早分かり. 計算機工学特論 スライド 電気電子工学専攻 修士1年 弓仲研究室 07801614 河西良介. 論理合成前提の主な回路記述. assign 文による組み合わせ回路 function による組み合わせ回路 always 文による順序回路 下位モジュール呼び出し. * always 組み合わせ、 task による回路記述も可だが、一般的ではない。. assign 文による組み合わせ回路. assign 文:論理演算や算術回路等で1行で記述できる回路の場合に用いる. * assign→ 継続的代入.
E N D
回路記述早分かり 計算機工学特論 スライド 電気電子工学専攻 修士1年 弓仲研究室 07801614 河西良介
論理合成前提の主な回路記述 • assign文による組み合わせ回路 • functionによる組み合わせ回路 • always文による順序回路 • 下位モジュール呼び出し *always組み合わせ、taskによる回路記述も可だが、一般的ではない。
assign文による組み合わせ回路 • assign文:論理演算や算術回路等で1行で記述できる回路の場合に用いる *assign→継続的代入 常駆動、値の保持ができない(保持できる例:DFF) よって、代入される左辺にはwire宣言したネット型のみ セレクタ 2入力NAND 桁上がり信号 加算回路 carry a d0 =9 sum dout b d1 sel Cnt10 [3:0] assign sum = a + b; assign na = ~( in1 & in2 ); assign dout = (sel==1) ? d1: d0; assign carry = (cnt10==4’h9);
function文による組み合わせ回路 • function文:条件分岐を含むような「複雑」な回路の時に用いる →functionブロックは関数の定義部分なので実体を書く必要がある *「名前の接続」はfunction文には無い ので引数の並びの順番は大切 2 to 4 デコーダ *if,case文はfunction内で記述する。 モジュール宣言直後等は文法エラー din dout [0] [0] [1] [2] [1] [3]
always文による順序回路 • ラッチやフリップフロップ等の順序回路をalways文で表現する 例1 レジスタ型ビット数無し宣言 DFF Q D クロック立上がりで入力DにQを代入 CK
always文による順序回路2 resが1ならqは0を代入 例2 4bit binary counter それ以外ならqへ+1 4 CK res
計算機工学特論A 3.2.4 下位モジュール呼び出し(P.72) ~ 4.1 基本ゲート回路(P.77) 2007/11/21 弓仲研究室 修士1年 高橋 靖典
下位モジュール呼び出し 回路の階層構造化 一つのモジュールですべてを記述せず、 複数の階層に分けて記述するのが一般的 回路の階層構造 理由 ・ 機能ごとの小ブロックに分割 → 設計・検証の効率が良い ・ ブロックの大きさの条件 → 論理合成ツールの実用範囲内 ・ 必要以上の大きさのブロックの論理合成 → メモリと時間の浪費
4ビットDフリップフロップ 1ビットのDフリップフロップを下位モジュールとして 呼びだし、4ビットのDフリップフロップを構成する。 トップ・モジュール (4ビットDFF) 下位モジュール (1ビットDFF)
下位モジュールの呼び出し方法 「Quartus II 7.2 Web Edition」でのシミュレーション方法 プロジェクトウィザードで、あらかじめ用意した「Verilog HDL File」を追加することができる ① ② Verilog HDL Fileが追加された
モジュール名インスタンス名 (ポート・リスト) ;モジュール名インスタンス名 (ポート・リスト) ; 例) DFFDFF0( ck, d[0], q[0] ) ; Verilog HDLでの記述方法 モジュールの呼び出し 同一モジュールを複数呼び出す場合 DFF DFF0( ck, d[0], q[0] ), DFF1( ck, d[1], q[1] ), DFF2( ck, d[2], q[2] ), DFF3( ck, d[3], q[3] ); このように、コンマ(,)で区切って連続して記述する
Verilog HDLでの記述方法 ポートの記述方法 ① 順番によるポート接続 DFFDFF0( ck,d[0],q[0] ) ; 順番の変更不可 ② 名前によるポート接続 . 定義側ポート名 (接続信号) DFFDFF2( .CK(ck),.D(d[2]),.Q(q[2]) ); 順番の変更可能 DFFDFF2( .D(d[2]),.Q(q[2]) ,.CK(ck) ); これでもOK
D Q CK シミュレーション 1ビットDFF クロックの立ち上がりで 入力信号Dの値を保持する
シミュレーション 4ビットDFF 両方可
シミュレーション(失敗例①) 4ビットDFF 順番によるポート接続 では、ポートの順番を 間違えるとエラーになる
シミュレーション(失敗例②) 4ビットDFF 接続信号の記述では 順番と名前を混在して 書くとエラーになる
第4章 組み合わせ回路のHDL記述 プリミティブ・ゲートを用いたゲート回路 Verilog HDLには、あらかじめ基本的なゲート回路(プリミティブ・ゲート)が用意されている AND、NAND、OR、NOR、インバータ など 記述方法 ゲート・タイプゲート名 ( 出力信号名, 入力信号名1, 入力信号名2, ・・・ ) ; 例) oror2( out_or2 , in0 , in1 ) ; ※ ポートの記述では、「順番による接続」は使えるが、「名前による接続」は使えない ※ ゲート名を省略することができる
シミュレーション① プリミティブ・ゲートを用いたゲート回路 2入力OR回路 真理値表
2入力OR回路 真理値表 シミュレーション② 論理式を用いたゲート回路 assign出力信号 = 論理式 ; 例) assign or2_out = in0|in1 ; 記述方法
4.2.12to1セレクタ 図4.42to1セレクタ 2ビットの2本の信号から一本の選択するセレクタを記述します。 2 in1 2 dout ・仕様 2ビットの入力in0とin1をsel信号で選択し2ビットdoutに出力します。 sel=0でin0を、sel=1でin1を選択。 2 in0 sel
条件演算子による2to1セレクタ //条件演算子による2to1セレクタ Module sel2to1_cond( in0 , in1 , sel , dout ); input [1:0] in0 , in1; input sel; output [1:0] dout; assign dout = (sel==1’b1) ? in1: in0; endmodule 条件演算子部分にビット幅の記述が含まれないため、ビット幅の変更を用意に行えます。
AND-ORによる2to1セレクタ //AND-ORによる2to1セレクタ Module sel2to1_andor( in0 , in1 , sel , dout ); input [1:0] in0 , in1; input sel; output [1:0] dout; assign dout [0] = (~sel & in0 [0] ) | (sel & in1 [0] ) ; assign dout [1] = (~sel & in0 [1] ) | (sel & in1 [1] ) ; endmodule 記述から動作を理解しにくく、ビットを分解して記述しているため、ビット幅変更による対応がよくありません。
if文による2to1セレクタ //if文による2to1セレクタ Module sel2to1_if( in0 , in1 , sel , dout ); input [1:0] in0 , in1; input sel; output [1:0] dout; function [1 : 0] select; input [1 : 0] in0, in1; input sel; if ( sel==1’b0 ) select = in0 ; else select = in1; endfunction assign dout = select (in0, in1, sel ); endmodule ・if文はモジュール構成要素ではないので、function内で用いる。 ・if文では条件式が’x’または’z’ならば偽とみなすため、selが’x’でもin1が選択される。 ・論理合成語のゲート回路では不定値が伝播するため、HDL記述と論理合成後のゲート回路で、シミュレーション結果が異なることがある。
case文による2to1セレクタ //case文による2to1セレクタ Module sel2to1_case( in0 , in1 , sel , dout ); input [1:0] in0 , in1; input sel; output [1:0] dout; function [1 : 0] select; input [1 : 0] in0, in1; input sel; case ( sel ) 1’ b0 : select = in0 ; 1’ b1 : select = in1 ; default : select = 1’ bx ; endcase endfunction assign dout = select (in0, in1, sel ); endmodule ・if文と同様にfunctionの中で用いる。 ・selが指定した値以外を取る場合はdefault以降を実行し、戻り値selectは不定となる。