FC2カウンター FPGAの部屋 2011年05月18日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Spartan-3A Starter KitでMIGを使用する8(論理シミュレーション2)

”Spartan-3A Starter KitでMIGを使用する7(論理シミュレーション1)”でMIGのuser desginのシミュレーションができた。今回はユーザー回路からどのようにMIGが制御されているかを見ていく。Memory Interface Solutions UserGuide参照。

DDR2 SDRAMの初期化のシミュレーション波形を下に示す。
MIG_74_110516.png

200us 待ってから、Burst Length=4, CAS Latncy=3, ODT Rtt = Disabled, DQS_N Enable = Enabledに設定している。シミュレーション時の初期化時のログを下に示す。

268252100.0 ps INFO: Precharge All
268372100.0 ps INFO: Load Mode 2
268372100.0 ps INFO: Load Mode 2 High Temperature Self Refresh rate = 1X (0C-85C)
268492100.0 ps INFO: Load Mode 3
268612100.0 ps INFO: Load Mode 1
268612100.0 ps INFO: Load Mode 1 DLL Enable = Enabled
268612100.0 ps INFO: Load Mode 1 Output Drive Strength = Full
268612100.0 ps INFO: Load Mode 1 ODT Rtt = Disabled
268612100.0 ps INFO: Load Mode 1 Additive Latency = 0
268612100.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
268612100.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
268612100.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
268612100.0 ps INFO: Load Mode 1 Output Enable = Enabled
268732100.0 ps INFO: Load Mode 0
268732100.0 ps INFO: Load Mode 0 Burst Length = 4
268732100.0 ps INFO: Load Mode 0 Burst Order = Sequential
268732100.0 ps INFO: Load Mode 0 CAS Latency = 3
268732100.0 ps INFO: Load Mode 0 Test Mode = Normal
268732100.0 ps INFO: Load Mode 0 DLL Reset = Reset DLL
268732100.0 ps INFO: Load Mode 0 Write Recovery = 3
268732100.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
268852100.0 ps INFO: Precharge All
268972100.0 ps INFO: Refresh
269092100.0 ps INFO: Refresh
269212100.0 ps INFO: Load Mode 0
269212100.0 ps INFO: Load Mode 0 Burst Length = 4
269212100.0 ps INFO: Load Mode 0 Burst Order = Sequential
269212100.0 ps INFO: Load Mode 0 CAS Latency = 3
269212100.0 ps INFO: Load Mode 0 Test Mode = Normal
269212100.0 ps INFO: Load Mode 0 DLL Reset = Normal
269212100.0 ps INFO: Load Mode 0 Write Recovery = 3
269212100.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
269332100.0 ps INFO: Load Mode 1
269332100.0 ps INFO: Load Mode 1 DLL Enable = Enabled
269332100.0 ps INFO: Load Mode 1 Output Drive Strength = Full
269332100.0 ps INFO: Load Mode 1 ODT Rtt = Disabled
269332100.0 ps INFO: Load Mode 1 Additive Latency = 0
269332100.0 ps INFO: Load Mode 1 OCD Program = OCD Default
269332100.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
269332100.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
269332100.0 ps INFO: Load Mode 1 Output Enable = Enabled
269452100.0 ps INFO: Load Mode 1
269452100.0 ps INFO: Load Mode 1 DLL Enable = Enabled
269452100.0 ps INFO: Load Mode 1 Output Drive Strength = Full
269452100.0 ps INFO: Load Mode 1 ODT Rtt = Disabled
269452100.0 ps INFO: Load Mode 1 Additive Latency = 0
269452100.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
269452100.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
269452100.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
269452100.0 ps INFO: Load Mode 1 Output Enable = Enabled
269452100.0 ps INFO: Initialization Sequence is complete


次にユーザー回路とのインターフェース信号を見ていく。
Spartan-3A用のMIGのデータ入力(user_input_data) は90度位相のずれたクロック(clk90_int) に同期している必要がある。その他の信号は、0度のクロック(clk_int) の立ち下がりに同期させる必要がある。また、DDR2 SDRAMからReadしたデータ(usr_output_data) や有効信号(usr_data_valid) は0度のクロック(clk_int) の立ち上がりに同期している。
Virtex-5のMIGよりユーザーインターフェースを作るのが面倒だ。コマンド入力用FIFOが付いていない感じだ。MIGのユーザーインターフェースの上にFIFOを使ったラッパーを作ったほうが良いかもしれない。

Spartan-3A用のMIGのユーザー・インターフェース信号について簡単に説明する。

clk0:位相0度のクロック
clk90:位相90度のクロック
user_command_register:Write Request(100) やRead Request(110)、NOP(000) などのコマンド。Initialize memory(010)。(clk0の立ち下がりに同期)
user_cmd_ack:MIGからコマンドをうけとれるという返事。リフレッシュなどの用事があってコマンドを受け取れない場合はアサートされない。(clk0の立ち下がりに同期)
user_input_address:アドレス入力。使いにくいことにROW+COLUMN+BANKの順番になっているので、まともに使用するためには、COLUMNとBANKのアドレスを入れ替える必要がありそう。(clk0の立ち下がりに同期)
burst_done:バーストの終了時に4バーストモードは2クロック間、8バーストモードは4クロック間アサートする。(clk0の立ち下がりに同期)
user_input_data:clk90に同期してデータを出力する(Writeのみ)。(clk90の立ち上がりに同期)
user_data_valid:user_output_dataが有効。(Readのみ)(clk90の立ち上がりに同期)
user_output_data:Readしたデータ。(Readのみ)(clk90の立ち上がりに同期)


Memory Interface Solutions UserGuideの332ページのFigure 8-10: DDR2 SDRAM Write Burst, Burst Lengths of Four and Two Burstsを下に引用する。
MIG_75_110519.png

上の図はSpartan-3A用MIGのWriteの例だ。

1.clk0の立ち下がりに同期して、ユーザー回路はWriteコマンドを発行し始める。
2.最低1クロック後にMIGは、clk0の立ち下がりに同期してuser_cmd_ackをアサートし、Writeコマンドを受け付けたことをユーザー回路に知らせる。ただし、リフレッシュ動作中でuser_cmd_ackのアサートが遅れることもある。
3.user_cmd_ackがアサートされた後のclk90の立ち上がりに同期して、ユーザー回路はuser_input_dataにWriteするデータを入力する。user_input_dataはDDR2 SDRAMのデータ幅の2倍幅となっている。4バーストモードならば、2つのデータを入力する必要がある。
4.ユーザー回路が入力するアドレス(row+column+bank address)は、user_cmd_ackがアサートされた後の3クロック間維持する。その後のバーストアドレスは2クロック維持する。(clk0の立ち下がりに同期)
5.write burstを終了させるときに、ユーザー回路はburst_doneをアサートしてMIGに知らせる。4バーストモードの時は2クロック間アサートする。
6.burst_doneのアサート後にWriteコマンドをデアサートする。(NOPコマンドに変更)
7.プリチャージをした後に、MIGはuser_cmd_ackをデアサートする。user_cmd_ackをデアサートされたら、ユーザー回路は次のコマンドを入力することができる。


実際にシミュレーションでデータをWirteしている部分を下に示す。
MIG_77_110519.png

4バーストモードで2組のデータをWriteすると、25クロックほどかかる。


次に、Memory Interface Solutions UserGuideの333ページのFigure 8-11: DDR2 SDRAM Read, Burst Lengths of Four and Two Burstsを下に引用する。
MIG_76_110519.png

上の図はSpartan-3A用MIGのReadの例だ。

1.clk0の立ち下がりに同期して、ユーザー回路はReadコマンドを発行し始める。
2.最低1クロック後にMIGは、clk0の立ち下がりに同期してuser_cmd_ackをアサートし、Readコマンドを受け付けたことをユーザー回路に知らせる。ただし、リフレッシュ動作中でuser_cmd_ackのアサートが遅れることもある。
3.ユーザー回路が入力するアドレス(row+column+bank address)は、user_cmd_ackがアサートされた後の3クロック間維持する。その後のバーストアドレスは2クロック維持する。(clk0の立ち下がりに同期)
4.user_output_dataが有効なのは、user_data_validがアサートされた時である。
5.DDR2 SDRAMのReadしたデータがuser_output_dataに出力される。user_output_dataはDDR2 SDRAMのバス幅の2倍の幅がある。DDR2 SDRAMは1クロックで2つのデータを読み書きするが、その2つのデータがuser_output_dataにSDR1クロックで出力される。4バーストモードでは、2つのデータがclk90の立ち上がりに同期して出力される。
6.read burstを終了させるときに、ユーザー回路はburst_doneをアサートしてMIGに知らせる。4バーストモードの時は2クロック間アサートする。
7.burst_doneのアサート後にReadコマンドをデアサートする。(NOPコマンドに変更)
8.プリチャージをした後に、MIGはuser_cmd_ackをデアサートする。user_cmd_ackをデアサートされたら、ユーザー回路は次のコマンドを入力することができる。大体、Readコマンドを発行してからデータが来るまで17クロックかかるようだ。


実際にシミュレーションでReadしている例を下に示す。
MIG_78_110519.png

4バーストモードで2組のデータをReadすると、データが到着し終わるまでに26.75クロックかかる。

Spartan-3AのMIGで困ったことは、user_input_addressのアドレス割り当てがrow+column+bank addressなことだ。COLUMNアドレスとBANKアドレスを入れ替えないと使いにくい。
  1. 2011年05月18日 05:50 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0