順序回路の設計

プロジェクト実習
LSIの設計と実現
LSI設計入門
• 論理回路
– 論理関数、ブール代数
– 真理値表
• C言語
– ビット演算(論理和、論理積、排他的論理和)
– 3項演算子( X = A ? B : C)
プロジェクト実習
LSIの設計と実現
順序回路の設計
マルチプレクサ
A
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
Sel Out
0
1
0
1
0
1
0
1
マルチプレクサ
• もう一つの書き方
• assign out=(sel==1’b1) ? B : A;
以下はイメージ
if(sel==1’b1)
assign out=b
else
assign out=a
乗算器
sum=(b[0]==1’b1) ? sum+a : sum;
a=a<<1’b1;
sum=(b[1]==1’b1) ? sum+a : sum;
a=a<<1’b1;
sum=(b[2]==1’b1) ? sum+a : sum;
a=a<<1’b1;
sum=(b[3]==1’b1) ? sum+a : sum;
• 基本的な考え方は合っているが重大な問題
が
• wire(=配線)
– 複数回代入してはいけない
– ループしてもいけない
• reg(=記憶素子)
– 複数回代入してはいけない
– ループは良い
• reg <= reg+1
クロックのあるテスト回路
`timescale 1ns/1ps
always begin
#40 clock = ~clock;
end
initial begin
clock=0;
a=0;
b=0;
#100 a=1’b1
#100 b=1’b1
end
順序回路
• レジスタの仕様を把握する
• 「現在の状態」から「次の状態」を組合せ回路
で記述する
現在の状態
– レジスタ
– input
次の状態
– always中の右辺値(左辺はreg変数)
順序回路
Reg
組合せ回路
Reg
Verilogルール
• always @(posedge clock or negedge reset) begin
• if(reset==1’b0) begin
•
/*initialize*/
• end else begin
•
/*code*/
• end
• end
• この形を変えてはいけない
• if(reset==1’b0) begin
• x<=0;
• end begin begin
• if(xxx) begin
•
x<=1;
• end else begin
•左辺はXのみ
•
x<=y;
•どんな条件でもXに代入さ
• end
れるのは1回(または0回)
•複数のalwaysからXに代入
• end
してはいけない
イネーブル付きカウンタ
• ステートマシンとカウンタを組み合わせる
• ステートが???のときのみにカウントする
– Xのパルス幅がクロックよりも十分長い時にどうな
るか?
ストップウォッチ
• ステートマシンを考える
– 入力は2つ(左右のボタンに相当)
– 4状態では無理
• 押した瞬間からカウントを始め、押した瞬間に
停止すること
– 離した時にはカウンタに変化がない
ヒント
• カウント用とラップ用のレジスタが必要
• 切替は
– assign out put(条件)? count : lap;