5.3 各種カウンタ
DESCRIPTION
5.3 各種カウンタ. 平木. 5.3.1 バイナリ・カウンタ. Verilog HDL 記述. バイナリ・カウンタとは、クロックが立ち上がると 1 ずつカウントしていく。. モジュールの作成. 入出力信号の設定. リセット信号が 1 ならば 0. リセット信号が 0 ならば 1 を足す. シミュレーション結果. 5.3.2 アップ / ダウン・カウンタ. Verilog HDL 記述. アップ / ダウンカウンタとは、バイナリカウンタを拡張したもの。 down 信号が. ‘1’ :カウント・ダウン 0→15→14 ・・・ 1→0 ・. - PowerPoint PPT PresentationTRANSCRIPT
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.3 各種カウンタ
平木
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.3.1 バイナリ・カウンタ
Verilog HDL 記述
シミュレーション結果
モジュールの作成
リセット信号が 1 ならば 0
リセット信号が 0 ならば 1 を足す
入出力信号の設定
バイナリ・カウンタとは、クロックが立ち上がると 1 ずつカウントしていく。
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.3.2 アップ / ダウン・カウンタ
Verilog HDL 記述
シミュレーション結果
アップ / ダウンカウンタとは、バイナリカウンタを拡張したもの。
down 信号が
‘0’ :カウント・アップ 0→1→2 ・・・ 15→0 ・・
‘1’ :カウント・ダウン 0→15→14 ・・・ 1→0 ・
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.3.3 グレイ・コード・カウンタ
2 進数は 0, 1, 10, 11 と始まり、グレイコードは、 0, 1, 11, 10 と始まるようにしたコード。
2 進数 グレイコード0000000100100011010001010110011110001001101010111101110011101111
0000000100110010011001110101010011001101111111101010101110011000
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.3.3 グレイ・コード・カウンタ
Verilog HDL 記述 グレイ・コード・カウンタとは、常に出力が 1bit だけ変化するカウンタ。
グレイコード生成入力
現在カウンタ値
グレイコード生成入力
次カウンタ値
0000000100110010011001110101010011001101111111101010101110011000
0001001100100110011101010100110011011111111010101011100110000000
グレイ・コー
ド生成部
真理値表
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.3.3 グレイ・コード・カウンタ
シミュレーション結果
ひげが発生しない
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.3.4 手抜きグレイ・コード・カウンタ
バイナリ・コードバイナリ・コード
グレイ・コードグレイ・コード
バイナリ・コード( 4 ビット 2 進数)からグレイ・コードへの変換は隣り合ったビットの EX-OR で生成することができる。そして、このコード変換をバイナリ・カウンタの出力に接続する。
Verilog HDL 記述
バイナリ・カウンタ
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
計算機工学特論A
テキスト内容 5.3.5 ~ 5.3.8 山越研 河合 智
功
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ジョンソン・カウンタ
clock q[0] q[1] p[2] q[3]1 0 0 0 02 1 0 0 03 1 1 0 04 1 1 1 05 1 1 1 16 0 1 1 17 0 0 1 18 0 0 0 1
1 クロックごとに順次「1」の状態のビットが増加していき、全ビットが「1」になった後、順次「1」の状態が減っていく動作を行う計数カウンタ。
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ジョンソン・カウンタ
13 行目と 14 行目を反転した場合
0000 1111
00001
11110
設定ビット数より上位なので無視
各ビットの状態が「 0000 」の場合
各ビットの状態が「 1111 」の場合
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ジョンソン・カウンタ
シミュレーション結果
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ループ対策ジョンソン・カウンタ
不正ループ対策
ジョンソン・カウンタ
不正ループ対策あり
ジョンソン・カウンタ
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ループ対策ジョンソン・カウンタ
q[0] <= ~q[3] | ( q[0] & ~q[2] )
X= ( q[0] & ~q[2] ) q[0] ~q[2] X
1011 1 1 11001 1 1 1
q[0] <= ~q[3] | X ~q[3] X q[0]
1011 1 1 11001 1 1 1
入力1 入力2 出力0 0 01 0 00 1 01 1 1
入力1 入力2 出力0 0 01 0 10 1 11 1 1
AND OR
1011
ループ対策前
1001
一度不正ループになると正常に戻すのがかなり困難
1001010110
1011
ループ対策後
1001
不正ループから本来の動作に復帰している
1001110111
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
リング・カウンタ
clock q[0] q[1] q[2] q[3]1 0 0 0 02 1 0 0 03 0 1 0 04 0 0 1 05 0 0 0 16 1 0 0 07 0 1 0 08 0 0 1 0
クロック 1 周期で出力の 1 本のみが常に「1」になるカウンタ
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
000
リング・カウンタ
入力1 2入力 出力0 0 11 0 00 1 01 1 0
0000001
0001 0010000
NOR
q
ff
000
001
010
ff
q[0]
1 00
0001 0010 0100q
always 文に入る前の「q」と「ff」の各ビットの状態
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
リング・カウンタ
シミュレーション結果
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ディバイダ(分周回路)
q[0] はクロックに対して 1/2 の周波数になっている。 q[1] はクロックに対して 1/4 の周波
数になっている。
ディバイダはある周波数のクロック信号から、それよりも低い周波数のクロック信号を作るときに使用する。
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ディバイダ(分周回路)
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ディバイダ(分周回路)
Wire 型変数「q2、q1、q0」を使用しなくても同じ動作はシミュレーションできる
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
22. シフト・レジスタ と レジスタ・ファイル
12 月 12 日 山越研究室 増山 知東
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
レジスタとは 8bit 、 16bit 、 32bit ・・・ 等のデータを一時的に記憶するもの。
シフト・レジスタはその記憶しているデータの桁を左右にシフトできるものを指す。
シフト・レジスタとは
【シフト・レジスタの分類】
シリアル入力-シリアル出力
パラレル入力-シリアル出力
シリアル入力-パラレル出力
パラレル入力-パラレル出力
【シフト・レジスタのイメージ】
・
・
・
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
シリアル入力-パラレル出力
// 4bit シリアル・パラレル変換
module Seri_Par(ck,res,en,si,q);
input ck,res,en,si;
output [3:0] q;
reg [3:0] q;
always @ (posedge ck) begin クロックの立ち上がりごとに実行
if (res)
q <= 4’h0; 4bit 16 進数表現で 0 が代入
else if (en) begin
q <= q << 1; 1bit 左シフト→ q[0] には 0 が代入
q[0] <= si; q[0] に si の値が代入
end
end
endmodule
記述
シミュレーション結果
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
シリアル入力-パラレル出力 NG 編その 1
// 4bit シリアル・パラレル変換 NG 編 1
module Seri_Par(ck,res,en,si,q);
input ck,res,en,si;
output [3:0] q;
reg [3:0] q;
always @ (posedge ck) begin クロックの立ち上がりごとに実行
if (res)
q <= 4’h0; 4bit 16 進数表現で 0 が代入
else if (en) begin
q[0] <= si; q[0] に si の値が代入
q <= q << 1; 1bit 左シフト→ q[0] には 0 が代入
end
end
endmodule
記述
シミュレーション結果
0 が常に入力された状態
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
シリアル入力-パラレル出力 NG 編その 2
// 4bit シリアル・パラレル変換 NG 編 2
module Seri_Par(ck,res,en,si,q);
input ck,res,en,si;
output [3:0] q;
reg [3:0] q;
always @ (posedge ck) begin クロックの立ち上がりごとに実行
if (res)
q = 4’h0; 4bit 16 進数表現で 0 が代入
else if (en) begin
q[0] = si; q[0] に si の値が代入
q = q << 1; 1bit 左シフト→q[0] には 0 が代入
end
end
endmodule
記述
シミュレーション結果
最下位 bit を飛び越えてしまっている
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
// 4bit シリアル・パラレル変換 シフト演算を用いない方法
module Seri_Par(ck,res,en,si,q);
input ck,res,en,si;
output [3:0] q;
reg [3:0] q;
always @ (posedge ck) begin クロックの立ち上がりごとに実行
if (res)
q <= 4’h0; 4bit 16 進数表現で 0 が代入
else if (en)
q <= {q , si}; 4bit + 1bit を 4bit に代入
end
endmodule
シリアル入力-パラレル出力 シフト演算を用いない方法
記述シミュレーション結果
例)
結果、最上位 bit が欠落
5bit の信号を 4bit に代入
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
パラレル入力-シリアル出力
// 4bit パラレル・シリアル変換
module Par_Seri(ck,en,ld,pi,so);
input ck,en,ld;
input [3:0] pi;
output so;
reg [3:0] ps;
always @ (posedge ck) begin クロックの立ち上がりごとに実行
if (ld)
ps <= pi;
else if (en)
ps <= ps << 1; 1bit 左シフト→ ps[0]には 0 が代入
end
assign so = ps[3];
endmodule
記述
シミュレーション結果
出力 so はレジスタ ps の 3bit そのもの
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
レジスタ・ファイル ・・・ ビット幅を持ったレジスタの集合体
// 8bit × 4 レジスタ・ファイル
module regfile(ck,we,din,inaddr,dout,outaddr);
input ck,we;
input [7:0] din;
input [1:0] inaddr, outaddr; 00, 01, 10,11 で レジスタの指定可
output [7:0] dout;
reg [7:0] file [0:3];
always @ (posedge ck) クロックの立ち上がりごとに実行
if (we)
file (inaddr) <= din; inaddr で指定し、 din に代入
assign dout = file[outaddr]; outaddr で指定し、 dout に代入
endmodule
記述 シミュレーション結果
inaddr ・・・ 00
outaddr ・・・ 00
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
レジスタ・ファイル ・・・ ビット幅を持ったレジスタの集合体
シミュレーション結果 B
inaddr ・・・ 00
outaddr ・・・ 01
inaddr ・・・ 00 & 01
outaddr ・・・ 00 & 01
シミュレーション結果 C
シミュレーション結果A
inaddr ・・・ 00
outaddr ・・・ 00
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
計算機工学特論AVrilog-HDL 23 ステートマシン
山越研究室修士1年 赤津 実幸
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.6.1 ステートマシンの目的
回路システム
データパス系
制御系
演算などのデータ処理が中心
データパス系に対する制御信号を作成
(リセット、カウンタ、FFのイネーブル信号など)
制御信号は回路仕様に応じて順次ON /OFFされる
ステートマシンとは
制御信号を作り出すための順序制御回路
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
ステートマシンの具体例 デジタルウォッチ
SW1: 設定 時刻を変更する
SW2: モード切り替え 通常モード⇔時刻修正モード
SW3: けた選択 秒修正⇒時修正⇒分修正
使用例としてデジタルウォッチ内でどのようにステートマシンが利用されるか検証する。
表示ブロック
制御ブロック
カウントブロック
デジタルウォッチのブロック図
sysreset ck SW1~SW3
表示
本例のデジタルウォッチは計時するだけではなく、時刻修正も可能
「通常の状態」と「修正中の状態」を表す「ステート(状態)」の概念が必要
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
具体的なデジタルウォッチのステート(状態)
デジタルウォッチの状態遷移図
ステート名 SW1動作 表示通常 NORMAL なし 通常秒修正 SEC 秒リセット 秒2ケタ点滅分修正 MIN 1+ 分 分2ケタ点滅時修正 HOUR 1+ 時 時2ケタ点滅
ストップウォッチの4つの状態
・通常状態
・時修正状態
・分修正状態
・秒修正状態
各修正モード時のSW1(設定)の動作
ステートマシン状態遷移図を回路に置き換えたもの
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
5.6.2 ステートマシンの構成法
ワン・ホット方式 デコード方式
・使用するFFの量が少ない・状態数が多いと状態デコーダ部分の回路 規模が大きくなり、動作速度が遅くなる。・HDL記述が簡潔で分かりやすい
デコード方式の利点
・使用するFFの量が多い・動作スピードは速い・用途によっては、複数の状態が同時にアクティブにならないためのフェイルセーフ 的な回路が必要
ワン・ホット方式の利点
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
デコード方式ステートマシンの記述例(リスト5.1)
ステートマシン2方式の共通項目
ステート名:
スイッチ入力:
出力:
NORMAL (通常)、 SEC (秒修正)、 HOUR(時修正)、 MIN (分修正)
SW1 、 SW2 、 SW3 (いづれもクロック一周分のパルスとする)
SW1 が押されたときの動作 sec_reset (秒リセット)、 hour_inc (+1時)、 min_inc(+1分)モード ON/OFF の表示sec_onoff 、 hour_onoff 、 min_onoff
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
リスト 5.1 の説明 1
reg [1:0] cur; // ステートレジスタ
reg [1:0] nxt; // ステート生成回路
(組み合わせ回路)
cur は現在の状態
nxt はアクションによる状態遷移を表す
parameter NORMAL = 2’b00, SEC = 2’b01, MIN = 2’b10, HOUR = 2’b11
2 ビットの状態変数 curや nxt にステート情報を伝えるために定義する。
後述のステートデコーダで nxt<=NORMAL などの形で代入を行う。
always@( posedge ck or posedge sysreset ) beginif ( sysreset )
cur <= NORMAL;else
cur <= nxt;end
sysreset は初期化を行っており、強制的に通常モードに戻します。
sysreset が押されていない場合は状態遷移図に従って動作します。
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
リスト 5.1 の説明 2
always @( cur or SW1 or SW2 or SW3 ) begin case( cur ) NORMAL: if (SW2)
nxt <= SEC; else
nxt <= NORMAL; SEC:~~~~ HOUR:~~~~ MIN:~~~~ default: nxt <= 2’bxx; endcaseend
ステート生成回路(ステートデコーダ) クロックとは無関係に
cur (状態を表すレジスタ)
SW1 (設定)
SW2 (通常⇔修正モード変更)
SW3 (秒⇒時⇒分)
の変更に合わせて動作する。
SW2 の入力があるとき 状態 NORMAL の場合 nxt <= SEC で秒修正モードに移行
状態 SEC,HOUR,MIN の場合 nxt <= NORMAL で通常モード に移行
SW2 の入力がないとき nxt <=今の状態を代入して状態の変更をしない
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
リスト 5.1 の説明 3
カウント・ブロックに送られる制御信号
assign sec_reset = ( cur == SEC ) & SW1;
assign min_inc = ( cur == MIN ) & SW1;
assign hour_inc = ( cur == HOUR ) & SW1;
どの状態のときに SW1 が押されたか、という情報をカウント・ブロックに送ります
表示ブロックに送られる制御信号
assign sec_onoff = ( cur == SEC );
assign min_onoff = ( cur == MIN );
assign hour_onoff = ( cur == HOUR );
修正モード時に修正部分を 点滅させるために現在どの修正モードであるかという情報を表示ブロックに送ります
assign xx_enable = ( ( cur == xxx) | (cur == yyy ) | ( cur == zzz) | ・・・ ) & yy_enable
※複雑な制御を行う場合下記ような記述をすることがあるそうです。
おそらく今回のステートマシンには関係ない。
追加
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
シミュレーションによる検証 1
モードの変更例
NORMAL(通常) SEC(秒修正) HOUR (時修正)
SW2 ON
SW3 ON
SW2(通常⇔修正モード ) で秒修正に移り
SW3(秒⇒時⇒分 ) により秒修正から時修正に移っていることが分かる
クロック周期 100us 10000Hz
Yamakoshi-Lab.Yamakoshi-Lab. -Department of Electric and Electronic Engineering,Faculty of Engineering,Gunma University Japan-
シミュレーションによる検証 2
SW1動作例
NORMAL(通常) SEC(秒修正)
SEC (秒修正)リセット
秒修正状態のときに SW1 (設定)を押したときに秒修正の秒リセットがONになっていることが分かる