回路記述早分かり
計算機工学特論 スライド
電気電子工学専攻
07801614
修士1年 弓仲研究室
河西良介
論理合成前提の主な回路記述




assign文による組み合わせ回路
functionによる組み合わせ回路
always文による順序回路
下位モジュール呼び出し
*always組み合わせ、taskによる回路記述も可だが、一般的ではない。
assign文による組み合わせ回路

assign文:論理演算や算術回路等で1行で記述できる回路の場合に用いる
*assign→継続的代入
常駆動、値の保持ができない(保持できる例:DFF)
よって、代入される左辺にはwire宣言したネット型のみ
2入力NAND
セレクタ
桁上がり信号
加算回路
carry
d0
dout
d1
sel
=9
a
b
sum
Cnt10 [3:0]
assign na = ~( in1 & in2 );
assign dout = (sel==1) ? d1: d0;
assign carry = (cnt10==4’h9);
assign sum = a + b;
function文による組み合わせ回路

function文:条件分岐を含むような「複雑」な回路の時に用いる
→functionブロックは関数の定義部分なので実体を書く必要がある
2 to 4 デコーダ
din dout
[0]
[0] [1]
[1] [2]
[3]
*「名前の接続」はfunction文には無い
ので引数の並びの順番は大切
*if,case文はfunction内で記述する。
モジュール宣言直後等は文法エラー
always文による順序回路

ラッチやフリップフロップ等の順序回路をalways文で表現する
例1
レジスタ型ビット数無し宣言
DFF
D
CK
Q
クロック立上がりで入力DにQを代入
always文による順序回路2
例2
resが1ならqは0を代入
4bit binary counter
4
CK
res
それ以外ならqへ+1
2 to 4 デコーダ シミュ結果
計算機工学特論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が追加された
②
Verilog HDLでの記述方法
モジュールの呼び出し
モジュール名 インスタンス名 (ポート・リスト) ;
例)
DFF
DFF0
( ck, d[0], q[0] ) ;
同一モジュールを複数呼び出す場合
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での記述方法
ポートの記述方法
① 順番によるポート接続
DFF DFF0 ( ck, d[0], q[0] ) ;
順番の変更不可
② 名前によるポート接続
DFF DFF2 ( .CK(ck), .D(d[2]), .Q(q[2]) );
. 定義側ポート名 (接続信号)
順番の変更可能
DFF DFF2 ( .D(d[2]), .Q(q[2]) , .CK(ck) );
これでもOK
シミュレーション
1ビットDFF
D
Q
CK
クロックの立ち上がりで
入力信号Dの値を保持する
シミュレーション
4ビットDFF
両方可
シミュレーション(失敗例①)
4ビットDFF
順番によるポート接続
では、ポートの順番を
間違えるとエラーになる
シミュレーション(失敗例②)
4ビットDFF
接続信号の記述では
順番と名前を混在して
書くとエラーになる
第4章 組み合わせ回路のHDL記述
プリミティブ・ゲートを用いたゲート回路
Verilog HDLには、あらかじめ基本的なゲート回路
(プリミティブ・ゲート)が用意されている
AND、NAND、OR、NOR、インバータ など
記述方法
ゲート・タイプ ゲート名 ( 出力信号名, 入力信号名1, 入力信号名2, ・・・ ) ;
例) or
or2
( out_or2 ,
in0
,
in1
) ;
※ ポートの記述では、「順番による接続」は使えるが、「名前による接続」は使えない
※ ゲート名を省略することができる
シミュレーション①
プリミティブ・ゲートを用いたゲート回路
2入力OR回路
真理値表
ClkA
0
0
1
1
OR
ClkB
0
1
0
1
OUT
0
1
1
1
シミュレーション②
論理式を用いたゲート回路
記述方法
2入力OR回路
真理値表
ClkA
0
0
1
1
OR
ClkB
0
1
0
1
OUT
0
1
1
1
assign 出力信号 = 論理式 ;
例) assign or2_out = in0 | in1 ;
4.2.1 2to1セレクタ
図4.4 2to1セレクタ
2
2
2ビットの2本の信号から一本の選択す
るセレクタを記述します。
in1
dout
in0
sel
2
・仕様
2ビットの入力in0とin1をsel信号で
選択し2ビットdoutに出力します。
sel=0でin0を、sel=1でin1を選択。
条件演算子による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文はモジュール構成要素ではな
いので、function内で用いる。
・if文では条件式が’x’または’z’なら
ば偽とみなすため、selが’x’でもin1
が選択される。
if ( sel==1’b0 )
select = in0 ;
else
select = in1;
endfunction
assign dout = select (in0, in1, sel );
endmodule
・論理合成語のゲート回路では不
定値が伝播するため、HDL記述と
論理合成後のゲート回路で、シミュ
レーション結果が異なることがある。
case文による2to1セレクタ
//case文による2to1セレクタ
Module sel2to1_case( in0 , in1 , sel , dout );
input
[1:0]
in0 , in1;
input
sel;
output [1:0]
dout;
・if文と同様にfunctionの中で用いる。
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
・selが指定した値以外を取る場合は
default以降を実行し、戻り値select
は不定となる。
ダウンロード

計算機工学特論A 講義資料第4回