verilog-hdl tutorial (14)

53
1 Verilog-HDL 講習会DE0編(14) Cyclone内蔵メモリM9Kを使う 2, August, 2013 鹿児島大学 中原 啓貴

Upload: hiroki-nakahara

Post on 16-Jul-2015

78 views

Category:

Education


2 download

TRANSCRIPT

1

Verilog-HDL 講習会DE0編(14) Cyclone内蔵メモリM9Kを使う

2, August, 2013 鹿児島大学 中原 啓貴

M9Kとは? •  Altera社FPGA Cyclone IIIに内蔵されているメモリ(RAM:

Random Access Memory): 1個の容量は9Kbit •  複数のM9Kを組合せて大きなメモリとしても使用可能 •  デュアルポートRAMをサポート •  DE0搭載のFPGA (EP3C16)

‒  56個のM9Kを搭載 (合計504Kbit) 利用可能数に限り有り!

2

M9Kの構成 •  用途に応じて構成を変えることができる

3

構成 入力数 出力数 8192 x 1 13 1 4096 x 2 12 2 2048 x 4 11 4 1024 x 8 10 8 1024 x 9 9 9 512 x 16 8 16 512 x 18 8 18 256 x 32 7 32 256 x 36 7 36

M9Kのモード •  同期式(クロック使用)のみサポート

4

Single-port RAM Simple dual-port RAM

True dual-port RAM

Single-port ROM 他にも, Dual-port ROM, FIFO, Shift registerが構成可能

M9KをROMとして使う

5

M9Kのタイミングチャート •  ROM構成時のタイミング(連続読み出し)

6

clock address q

ADR1

DATA1

アドレスを セットする 次のクロックで ROMにセット

ちょっと遅れて データが出てくる

次のクロックで 読み出し&次の アドレスをセット

ADR2

DATA2

仕様 •  ROMに書かれたデータを1秒毎にLEDGに表示する回路を作成

7

状態遷移図

8

READ ADR Set

Reset r_adr <= 3'b0; LEDG <= 10'b0; clk_cnt <= 26'b0;

NONE clk_cnt <= 26'b0; LEDG <= w_rdata (ROMのデータ);

clk_cnt != 26'd50000000 clk_cnt <= clk_cnt + 1'b1

clk_cnt== 26'd50000000 r_adr <= r_adr + 1'b1; 20nsec (50MHzの逆数)を 50000000回カウントすると 1000000000 nsec = 1secになる

9

•  ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう!

(DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)

DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_14_M9K_basic¥ 内にコピー

DE0_TOP.qpfをダブルクリックしてQuartus IIを起動

10

Pin Plannerを開いてみると ピン配置が終わっている!

Verilog-HDLを入力

11

ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力

コード入力したら保存を忘れずに!

ROMの中身を用意

12

content.mif を作成する. テキストエディタを開いて content.mif を編集

MIFファイルフォーマット

13

ワード数 8 (つまり入力3ビット), ワード長 (出力) 10ビット

アドレスとワードの表記法(基数)を 設定. ここでは2進数 (binary)

アドレス : ワード の順番に ROMの中身を記述する

MegaWizard を起動

14

Create a new custom megafunction variation を選択

15

ROM 1-PORT を選択

16

Memory Compiler -> ROM: 1-PORT を選択

Verilog-HDL を選択

ファイル名は ROM_LEDGに

17

出力 (q)は10ビット ワード数は 8 個

メモリの種類は M9Kを指定

18

チェックを外す

19

Browseをクリックし mif ファイル (ROMの中身) を読み込む

20

Files of type: で「MIF files (*.mif)」を 選択

先程作成した「content.mif」を 選択する

21

22

23

【重要】Instantiation template file に チェックを付けることを忘れないこと!!

ポップアップウインドウには Yesをクリック

24

先程, 生成した Instantiation template file をコピペ

25

作業用フォルダに できた ROM_LEDG_inst.v をテキストエディタで開く

Quartus II のDE0_TOP.vにコピペ!

26

入力するVerilog-HDL

コンパイルを行う

27

「保存アイコン」を クリックして保存

「コンパイルアイコン」を クリックして コンパイルを行う

コンパイル後、このウインドウが 表示されればOK

Compilation Report と Project Navigator にM9Kが

使用されていることが表示されます

28

Project Navigator(左上にある) の下のスクロールバーを右に スクロールする

FPGAをプログラム

29

動作確認 1秒毎にMIFファイルの中身が LEDGに表示されていますか?

30

M9KをRAMとして使う

31

Sinple-port RAM のタイミングチャート

32

clock address data wren q

ADR1

DATA1

Write アドレスと データを セットする

次のクロックで Read アドレスが RAMに取り込まれる

ちょっと 遅れて データが 出てくる

Readアドレスを セットする

ADR2

DATA2

Write イネーブル をONにする

次のクロックで 書き込み完了 & Writeイネーブルを OFFにする

今回の仕様 RAMを手で動かしてみる

•  スライドスイッチ SW[9:4]: アドレス(6ビット) •  スライドスイッチ SW[3:0]: データ(4ビット) •  押しボタンスイッチ BUTTON[2]: 書き込みイネーブル •  LEDG[3:0]: RAMのデータ表示

33

34

•  ピン配置が面倒くさいので、デフォルトのプロジェクトを読み込みましょう!

(DE0に限った事ではないが、Terasic製品はサンプルCD-ROMの プロジェクトを改変するのが楽でお勧め)

DE0付属のCD-ROM ”Demonstrations”内の "DE0_Top"フォルダの ファイル全てを C:¥verilog¥DE0_tutorial_14_M9K_RAM¥ 内にコピー

DE0_TOP.qpfをダブルクリックしてQuartus IIを起動

35

Pin Plannerを開いてみると ピン配置が終わっている!

Verilog-HDLを入力

36

ダブルクリック Verilog-HDLの テンプレートが 表示されるので コードを入力

コード入力したら保存を忘れずに!

MegaWizard を起動

37

Create a new custom megafunction variation を選択

38

RAM: 1-PORTを選択

39

Memory Compiler -> RAM: 1-PORT を選択

Verilog-HDL を選択

ファイル名は M9K_RAMに

40

出力 (q)は4ビット ワード数は 64 個

メモリの種類は M9Kを指定

41

チェックを外す

同一アドレスに読み込みと書き込みが同時 に発生した時の処理はデフォルトのまま (書き込みデータをそのまま読み出す)

42

43

初期データ(RAMの中身)は blank (空っぽ)でOK RAMはデータが書かれる ことがあるから. もちろん, mifファイルで 初期データを指定してもよい

44

Instantiation Template File 生成の 指定を忘れないように!

45

生成した Instantiation Temple File を テキストエディタで開いてDE0_TOP.v にコピペ

46

作業用フォルダに できた M9K_RAM_inst.v をテキストエディタで開く

Quartus II のDE0_TOP.vにコピペ!

入力するVerilog-HDL

47

コンパイルを行う

48

「保存アイコン」を クリックして保存

「コンパイルアイコン」を クリックして コンパイルを行う

コンパイル後、このウインドウが 表示されればOK

コンパイル後, Compilation Report で M9Kのメモリ量を確認

(64 x 4 = 256ビットになってますか?)

49

FPGAをプログラム

50

データ: 1111とセットして 押しボタンを押す LEDGに1111 が表示される (アドレス000000に書き込まれた!)

動作確認

51

アドレス: 000000 データ: 0000 LEDGには何も表示されない

データ: 0001とセットして 押しボタンを押す LEDGに0001 が表示される (アドレス000000に書き込まれた!)

動作確認

52

アドレス: 000001 LEDGには何も表示されない (アドレス000001には何も書かれていない)

データ: 0001とセットして 押しボタンを押す LEDGに0001 が表示される (アドレス000001に書き込まれた!)

アドレス: 000000 LEDGには1111が表示される (先程のデータがRAMに残っている!)

まとめ •  M9Kの使い方を学習

‒ ROM ‒ RAM ‒ いずれもSingle-Port

•  課題 ‒ 様々な大きさのROMを作成し, LEDGの表示パターンを変えてみよう

53