300 likes | 499 Views
計算機工学特論 A. テキスト内容 5.6. ワン・ホット方式ステートマシン. 一つの状態に対して1個 FF を用いる方式。 例 4 つの状態 A,B,C,D に対して4個の 1bit FF a,b,c,d が対応する。. ワン ・ ホット式. デコード 式. リスト 5.2. Always @(cur or SW1 or SW2 or SW3) begin case (cur) NORMAL: if(SW2) nxt <= SEC; else nxt <= NORMAL; SEC: if(SW2) nxt <= NORMAL;
E N D
計算機工学特論A テキスト内容 5.6
ワン・ホット方式ステートマシン 一つの状態に対して1個FFを用いる方式。 例 4つの状態A,B,C,Dに対して4個の1bit FFa,b,c,dが対応する。 ワン・ホット式 デコード式
リスト5.2 Always @(cur or SW1 or SW2 or SW3) begin case (cur) NORMAL: if(SW2) nxt <= SEC; else nxt <= NORMAL; SEC: if(SW2) nxt <= NORMAL; else if(SW3) nxt <=HOUR; else nxt <= SEC; HOUR: if(SW2) nxt <= NORMAL; else if(SW3) nxt <= MIN; else nxt<= HOUR; MIN: if(SW2) nxt <= NORMAL; else if(SW3) nxt <= SEC; else nxt <= MIN; default: nxt <= NORMAL; endcase end (デコード式) [0][0][1][0] [0][0] [0][0][0][1] [0][0][0][1] [0][0][0][1] [0][0][1][0] [0][1] [1][0][0][0] [0][0][1][0] [0][0][0][1] [1][0][0][0] [1][1] [0][1][0][0] [1][0][0][0] [0][0][0][1] [0][1][0][0] [1][0] [0][0][1][0] [0][1][0][0] [0][0][0][1]
Verilog-HDLグラフィック合成ほか 修士一年 赤津 実幸
主な説明事項 ・ モジュール同士を結線し、大規模回路をつくるグラフィッ ク合成の仕方を学ぶ ・ 制御信号の作り方 ・ ステートマシンの使い方
全加算回路(fulladder)2個の半加算器と1個のOR回路で形成全加算回路(fulladder)2個の半加算器と1個のOR回路で形成 簡単な回路のグラフィック合成例 入力x,y 半加算器 出力s 桁上げ出力cout 半加算器 OR回路 桁上げ入力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の主な役割 受信信号から位相情報を取り出すため直交検波を行い、位相が90度ずれたQI信号を取得する。 超音波1MHz Pulse送波 胎児信号をドプラの原理にて位相情報として取得、受信 3200Hz 312.5us間隔で繰り返す
FPGA 検波回路内部モジュール構成 検波用FPGAの主な機能 ・送波Pulse 送波数、タイミングの制御⇒8パルス送波 ・受信信号を直交検波し、位相情報を取り出す⇒QI信号の生成 ・FIFO&USB側に検波信号の転送⇒PCにデータ転送
直交検波について 受信信号の位相情報を取り出す 受信信号 :超音波の中心周波数1MHz Q信号の生成 :受信信号の位相情報(胎児信号) これにsin(w0 t)をかけると 第一項を低域通過フィルタを用いて取り除く 位相情報が取り出せた I信号の生成 同じように受信信号にcos(w0t)をかけてやると Q信号とI信号は位相が90度ずれている。 Q信号とI信号をつくることで情報が失われていないため元の受信信号を復元することができる。
FPGA 検波回路内部モジュール構成 controllerFPGA 検波回路内部モジュール構成 controller 10MHz 外部CLK IN PLL 10MHz⇒20MHz controllerモジュール(制御回路) 各モジュールの動作タイミングを制御する制御信号を生成する。外部入力(スタート時のリセット信号、モード変更など)により動作を変更させることができる。
クロック20MHz 1クロック 0.05us controllerモジュール制御信号 312.5us k_clr リセット信号 count_outcontroller内部カウンタ transmittransmitモジュール 送波pulse生成&タイミング kernel_enkernel_genモジュール sin波&cos波生成 selecter_1、q_result_savedetect_waveモジュール QI信号生成タイミング mult_save マルチプレクサ内のステートマシンの状態移行タイミング
制御信号生成回路 controllerモジュール controllerモジュールはFPGA内外のタイミング制御をつかさどっている。 CLK 各モジュールへ制御信号を出力 モード切替 input 12bit受信信号 一部は外部へ出力 リセット信号 装置スタート時に初期化する
FPGA 検波回路内部モジュール構成 TransmitFPGA 検波回路内部モジュール構成 Transmit 10MHz 外部CLK IN PLL 10MHz⇒20MHz transmitモジュール(送波パルス生成) controllerモジュールから制御信号transmitを受け取りONのとき送波pulseを生成する。 外部アナログ回路でなめらかな正弦波に精錬される。
FPGA 検波回路内部モジュール構成 kernel_genFPGA 検波回路内部モジュール構成 kernel_gen 10M 外部CLK IN PLL 10MHz⇒20MHz kernel_genモジュール(正弦波生成) 受信信号と乗算するための検波用1MHzsin波とcos波を生成する。
FPGA 検波回路内部モジュール構成 sin_convertFPGA 検波回路内部モジュール構成 sin_convert 10MHz 外部CLK IN PLL 10MHz⇒20MHz sin_convertモジュール(12bit⇒16bit) 外部ADコンバータで12bitデータに出力される。内部で16bitデータとして扱うため、ビット数の変換をしている。
FPGA 検波回路内部モジュール構成 detect_waveFPGA 検波回路内部モジュール構成 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モジュールを分かりやすいように他の出力を切って見やすくした。controllerモジュールを分かりやすいように他の出力を切って見やすくした。 また、どのようなタイミングで出力されているか調べるために内部カウンタcounterを出力させた。 マルチプレクサに送る制御信号 このFPGAでは312.5usごとに同じ動作を繰り返している。(内部カウンタを312.5usごとにリセットしている) 内部カウンタcounter312.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