計算機工学特論A
テキスト内容 5.6
ワン・ホット方式ステートマシン
一つの状態に対して1個FFを用いる方式。
例 4つの状態A,B,C,Dに対して4個の1bit FF a,b,c,dが対応する。
FF a
FF b
FF c
FF d
状態A
1
0
0
0
状態B
0
1
0
0
状態C
0
0
1
0
状態D
0
0
0
1
ワン・ホット式
FF a
FF b
状態A
0
0
状態B
1
0
状態C
0
1
状態D
1
1
デコード式
リスト5.2
Always @(cur or SW1 or SW2 or SW3) begin
case (cur)
(デコード式)
if(SW2) nxt <= SEC;
[0][0]
NORMAL:
[0][0][0][1]
if(SW2) nxt <= NORMAL; [0][0][0][1]
[0][1]
SEC:
[0][0][1][0]
else nxt <= NORMAL; [0][0][0][1]
else if(SW3) nxt <=HOUR; [1][0][0][0]
else nxt <= SEC;
HOUR:
[1][0][0][0]
[1][1]
[0][0][1][0]
[0][0][1][0]
if(SW2) nxt <= NORMAL; [0][0][0][1]
else if(SW3) nxt <= MIN; [0][1][0][0]
else nxt<= HOUR; [1][0][0][0]
MIN:
[0][1][0][0]
[1][0]
if(SW2) nxt <= NORMAL; [0][0][0][1]
else if(SW3) nxt <= SEC; [0][0][1][0]
else nxt <= MIN; [0][1][0][0]
default:
endcase
end
nxt <= NORMAL; [0][0][0][1]
ワン・ホット方式
デコード方式
Verilog-HDL
グラフィック合成ほか
修士一年 赤津 実幸
主な説明事項
・
モジュール同士を結線し、大規模回路をつくるグラフィッ
ク合成の仕方を学ぶ
・
制御信号の作り方
・
ステートマシンの使い方
簡単な回路のグラフィック合成例
全加算回路(fulladder) 2個の半加算器と1個のOR回路で形成
半加算器
入力x,y
半加算器
OR回路
出力s
桁上げ出力cout
桁上げ入力c
赤 計算例: x(1) + y(1) + c(0)⇒ cout(1) + s(0)
青 計算例: x(1) + y(1) + c(1) ⇒ cout(1) + s(1)
大規模回路を記述するには
機能ごとのモジュールを作り、それぞれを結線して大規模化する
手順1-1 半加算器、OR回路をつくる
1.まず、fulladderをつくるのが目的なのでfulladderというプロジェクトを作成します。
2.次にメニュー「New」欄からverilogファイルを追加し、半
加算器のモジュールを作成します。ソースが書けたら、save
asで保存し、名前は「halfadder.v」にするといいでしょう。
3.halfadder.vを制作したら、Fileメニュー > Create/_Update >
Create Symbol Files for Current Fileを選択すると、グラフィッ
ク合成でしようできるシンボルが作成されます。(成功すると
下のようなダイアログが表示されます。)
4.NewメニューよりDevice Design Filesタグ内の Block
diagram/Schematic Fileを選択し、グラフィックデザイン用ファ
イル「block1.bpf」を作ります。保存する際に名前をプロジェク
ト名と同じにする必要があります。今回はプロジェクト名が
「fulladder」なので「fulladder.bdf」にします。
手順1-2
5.手順4で作ったhalfadderのシンボルを呼び
出します。赤丸部分を選択し、Symbolダイアロ
グを呼び出します。Project内にhaifadderのシン
ボルが作成されています。これを選択し、OK
を押すと先ほどのグラフィックデザインファイル
block1.bdfに追加できるようになります。
6.block1.bdfにhalfadderのシンボ
ルをスタンプできるようになります。
やめたいときは右クイックでCancel
できます。
手順1-3
6.同じようにOR回路をつくります。今回は名前は「f_or.v」
にしました。
手順2-1 結線
1.全加算器は右のような構成になってますの
でそのように結線する必要があります。また、
全加算器の入出力が必要です。
結線ツールについて
モジュールのIN、OUTのビット数に応じてワイ
ヤーツールとバスツールを使い分けます。バス
ツールを使う場合は特殊で、8ビットの入力を作
りたい場合、inputシンボルの名前を「 input
[7..0] 」のように、名前のあとに何ビットのバス
かを明記する必要があります。
バスツール(多ビット用)
ワイヤーツール(1ビット
用)
手順2-2 入出力
input、outputシンボルについて
Symbol内のc:/altera~ > primitive > pinに入出力に
必要なピン用シンボルがあります。ワイヤーツール、
またはバスツールを用いてモジュールと結線されま
す。入力はinputピン、出力はoutputピンを使います。
6ビットの入出力バスではa[5..0]のように
pin名を変更します。
例 (下図0) IQ_count_out[5..0]
入力例
出力例1
出力例2
手順2-3
また、4ビットの出力output [3:0]qを作りたい場合、4つのoutputを用いて
q[0],q[1],q[2],q[3]としても4ビット出力として認識されます。
下図は4ビット加算器です。入出力とも1ビットの入出力で構成されていますが、ピ
ンの名前によって、4ビット入力 a,b 、 4ビット出力 qになっています。
多ビット入出力例
手順3-1 シミュレーション
1.つくったblock1.bdfをプロジェクト名で保存します。fulladder.bdfはfulladder.vで作成したと同様、
コンパイル、シミュレーションが可能です。
胎児モニタリング装置システム
1MHzの超音波を用い、胎児信号を取得する装置(主に胎児心拍、胎児呼吸様運動の信号)
音声回路
検波専用LSI
データ転送部
アナログ回路
検波専用LSIの主な役割
超音波1MHz
Pulse送波
胎児信号をドプラの原理にて
位相情報として取得、受信
受信信号から位相情報を取り出
すため直交検波を行い、位相が
90度ずれたQI信号を取得する。
3200Hz 312.5us間隔で繰り返す
FPGA 検波回路内部モジュール構成
検波用FPGAの主な機能
・送波Pulse 送波数、タイミングの制御⇒8パルス送波
・受信信号を直交検波し、位相情報を取り出す⇒QI信号の生成
・FIFO&USB側に検波信号の転送⇒PCにデータ転送
直交検波について
受信信号の位相情報を取り出す
受信信号
Iin (t )  Ii sin(0t  A(t )   )
Q信号の生成
0 :超音波の中心周波数1MHz
A(t ) :受信信号の位相情報(胎児信号)
これにsin(w0 t)をかけると
Q '  I in sin(0t )
 Ii sin(0t  A(t )   )sin 0t
1
Q '   I i {cos  20t  A(t )     cos  A(t )   }
2
第一項を低域通過フィルタを用いて取り除く
1
Q  I i cos  A(t )  
位相情報が取り出せた
2
I信号の生成
同じように受信信号にcos(w0t)をかけてやると
1
I  I i sin  A(t )   
2
Q信号とI信号は位相が90度ずれている。
Q信号とI信号をつくることで情報が失われていないため元の受信信号を復元することができる。
FPGA 検波回路内部モジュール構成 controller
10MHz 外部
CLK IN
PLL 10MHz⇒20MHz
controllerモジュール(制御回路)
各モジュールの動作タイミングを制
御する制御信号を生成する。外部
入力(スタート時のリセット信号、
モード変更など)により動作を変更
させることができる。
controllerモジュール制御信号
クロック20MHz 1クロック 0.05us
312.5us
k_clr リセット信号
count_out controller内部カウンタ
transmit transmitモジュール 送波pulse生成&タイミング
kernel_en kernel_genモジュール sin波&cos波生成
selecter_1、q_result_save detect_waveモジュール QI信号生成タイミング
mult_save マルチプレクサ内のステートマシンの状態移行タイミング
制御信号生成回路 controllerモジュール
controllerモジュールはFPGA内外のタイミング
制御をつかさどっている。
CLK
モード切替
input 12bit受信信号
一部は外部へ出力
リセット信号
装置スタート時に初期化する
各
モ
ジ
ュ
ー
ル
へ
制
御
信
号
を
出
力
FPGA 検波回路内部モジュール構成 Transmit
10MHz 外部
CLK IN
PLL 10MHz⇒20MHz
transmitモジュール(送波パルス生成)
controllerモジュールから制御信号transmit
を受け取りONのとき送波pulseを生成する。
外部アナログ回路でなめらかな正弦波に
精錬される。
FPGA 検波回路内部モジュール構成 kernel_gen
10M 外部
CLK IN
PLL 10MHz⇒20MHz
kernel_genモジュール(正弦波生成)
受信信号と乗算するための検波用1MHz
sin波とcos波を生成する。
FPGA 検波回路内部モジュール構成 sin_convert
10MHz 外部
CLK IN
PLL 10MHz⇒20MHz
sin_convertモジュール(12bit⇒16bit)
外部ADコンバータで12bitデータに出力さ
れる。内部で16bitデータとして扱うため、
ビット数の変換をしている。
FPGA 検波回路内部モジュール構成 detect_wave
10MHz 外部
CLK IN
PLL 10MHz⇒20MHz
Q信号用
detect_waveモジュール(検波)
位相情報を取り出し、Q信号、I信号を生成する。
kerne_genで生成されたsin波、cos波を受信信号と
乗算し、一定時間加算する。低域通過フィルタと
同等の効果が得られる。
I信号用
FPGA 検波回路内部モジュール構成 multiplexer
10MHz 外部
CLK IN
PLL 10MHz⇒20MHz
マルチプレクサ(ステートマシン)
10クロック間状態を維持し、次の
状態に移行させる。I信号を10クロッ
ク(0.5us)間外部に出力し、Q信号を
次の10クロック(0.5us)間出力して、
controllerで作られたstart_save信号
が1のときこれを繰り返す。
マルチプレクサに送る制御信号
controllerモジュールを分かりやすいように他の出力を切って見やすくした。
また、どのようなタイミングで出力されているか調べるために内部カウンタcounterを出力させた。
このFPGAでは312.5usごとに同じ動作を繰り返している。(内部カウンタを312.5usごとにリセットしている)
内部カウンタcounter 312.5us / 0.05us = 6250回までカウントできる。
クロック20MHz 1クロック 0.05us
312.5us
mult_save信号 マルチプレクサ内でstart_save信号として扱われる
ステートマシン
312.5usの間にI信号とQ信号の組を20回生成している。また、
save_start制御信号が立ち上がってる間
1組のQI信号生成し、0.5us間I信号出力、次に0.5us間Q信号を出力する。
クロックは0.05usなので始め10クロック分はI信号、次の10クロック分はQ信号を出力する。
I信号出力モード
Q信号出力モード
無出力モード
の3通りの状態シフトがある。
クロック20MHz 1クロック 0.05us
312.5us
…..…..TO BE CONTINUED
ダウンロード

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