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