27
1 1 Verilog-HDL講習会 追加資料(6) 順序回路記述(1) ~カウンタを例題として~ 6, July, 2012

Verilog-HDL講習会 追加資料(6) 順序回路記述(1) ~カウン … · 2 いよいよ順序回路編です •ほぼ全ての実用的な回路は順序回路です •順序回路の記述法をマスターすることが、

Embed Size (px)

Citation preview

11

Verilog-HDL講習会追加資料(6)順序回路記述(1)

~カウンタを例題として~6, July, 2012

22

いよいよ順序回路編です• ほぼ全ての実用的な回路は順序回路です• 順序回路の記述法をマスターすることが、FPGAを使いこなせるかどうかのポイント

• 頑張って理解しましょう!– とはいえ、言語ですから「たくさん書いて慣れろ」

33

順序回路とは?• 組合せ回路の出力:現在の入力• 順序回路の出力:

– 現在の入力+現在の状態(現在の状態=過去の入力)

• つまり、順序回路は現在と過去の入力に応じて出力する回路といえる

• 過去の入力を記憶 状態を記憶

• 状態を記憶する記述!?

組合せ回路組合せ回路

組合せ回路組合せ回路

記憶素子記憶素子

外部入力

外部出力

外部入力

外部出力

状態出力

状態入力

組合せ回路

順序回路

44

例題:4ビットカウンタ• クロックに同期するカウンタ

4ビット加算器

4ビット加算器

4ビットレジスタ4ビットレジスタ

クロック

00100001 0000

リセット信号

55

今回作成するプロジェクト

プロジェクト名: topmodule_4bit_cnt

各自のFPGAボードに合わせて適切なFPGAを選択

ISimであることを確認

66

カウンタの記述

今回のファイル名:topmodule_4bit_cnt.v

右クリック「New Source」を選択し「Verilog Module」で…

ここを記述

77

解説4ビット加算器

4ビット加算器

4ビットレジスタ4ビットレジスタ

レジスタ宣言レジスタを宣言します(countは出力でもありレジスタでもある)

クロック信号の立ち上がり

リセット信号の立ち上がりor

(または)に always@ 以下の処理が行われる

88

解説(続き)always@( クロック信号or リセット信号)begin

if( クロック信号 )begin(レジスタ初期化);

end else begin(順序回路の処理);

endend

always@() は定型文で記述

レジスタに代入するときは「<= 」を使う!(ノンブロッキング代入)

左辺はレジスタ値にする

99

シミュレーションで動作を確認

リセット信号初期化を記述

クロックを記述

テストベンチ

(Verilog Test Fixture)

「testbench_4bit_cnt」

を追加

保存してISimを起動

1010

シミュレーション結果の確認• 拡大縮小をクリックして表示させる

リセットがかかるまで値が決まらないので出力は不定

リセット中は初期値が出る

リセット後はクロックの立ち上がりでカウントする

1111

FPGAボード上に実装してみる• ピン配置ファイル(UCFファイル)の追加

右クリック

Implementation ConstraintsFile を選択

プロジェクト名と同じtopmodule_4bit_cnt

あとは「Next」をクリックし次のウインドウで「Finish」

1212

ucfファイルのオープン「ファイルを開く」アイコンをクリック

プロジェクトがあるディレクトリを選択

「ファイルの種類」を「UCF」に

先ほど追加した「topmodule_4bit_cnt.ucf」をクリック

1313

ucfファイルにピン配置の指定を書く(Spartan3Eボードの場合)

C9

V16

F11, E11, E12, F12

1414

ucfファイルにピン配置の指定を書く(Spartan3Aボードの場合)

E12

R13

U19, U20, T19, R20

E12;R13;R20;T19;U20;U19;

1515

配置配線・ビットストリーム作成

トップモジュールをクリック

プロセスモードに切り替わるので

「Generate Programming File」(ビットストリーム生成)をダブルクリック

ビットストリーム生成を行うと、ISEが論理合成・配置配線も自動で行ってくれます。(回路を変更するとこれらの作業が必要なので)

1616

FPGAの準備

Spartan 3Eボード Spartan 3Aボード

1. ACアダプタ(5v)を差込む 2. 電源スイッチをONにする

3. USBケーブルでPCと繋ぐ

1717

FPGAに書込み(iMPACT)

「iMPACT」をダブルクリック

iMPACTウインドウが開くので「File」->「New Project」を選択

TJAGを選択

そのまま「Yes」

1818

そのまま「Yes」

「Look in」をプロジェクトのあるディレクトリに変更する

Bitファイルを指定(ここでは「topmodule_4bit_cnt.bit」)

1919

ROMファイルの追加は「No」

コンフィギュレーション用ROMが2個あるので「Cancel」を2回行う(同じようなウインドウが2回出てきます)これで書き込み準備完了!

そのまま「OK」

2020

FPGAへのプログラム一番左の「sc3s500E」(Sprantan3Aボードは「xc3s700A」)を右クリック->「Program」を選択

と出れば成功です!うまく動作しましたか?

2121

原因の考察• 基準クロック50MHz に同期• LEDの点滅が早すぎる!

4ビット加算器

4ビット加算器

4ビットレジスタ4ビットレジスタ

クロック (50MHz)

考えてみよう:50MHz のとき点滅の間隔は____[nsec]である.

リセット信号

2222

タイミングを調整

タイミング調整用の値を保持するレジスタ宣言

レジスタ初期化

50MHz カウントしたらLEDを1つインクリメント保存したら

「Generate Programming File」を実行

2323

FPGAに再度書き込み• iMPACT(p.18)の作業を再度実行

LEDがカウントアップすると成功

2424

右から左に流れるLED• 以下の動作をする回路を記述せよ

– ただし、LEDが切替るのは1秒間隔とする

??

4ビットレジスタ4ビットレジスタ

クロック (50MHz)

どこを書き換えればよいか?リセット信号

2525

答え• 初期値を与え左シフタを記述するだけ!

加算はコメントアウト

左シフタ

初期値を変更

2626

FPGA上に実現• iMAPCTを使って書込み(p18の作業だけ)

LEDが右から左へ点灯すると成功

2727

課題ただしLEDの点灯間隔は全て1秒とする1. LEDを点滅させよ2. スライドスイッチがOFF: ダウンカウンタスライドスイッチがON: アップカウンタとなる回路を作成せよ

3. スライドスイッチがOFF: LEDが右→左スライドスイッチがON: LEDが左→右となる回路を作成せよ