FC2カウンター FPGAの部屋 2006年04月

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

FPGAの部屋

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

スパルタン3EスターターキットのLCD表示回路1

今、スパルタン3EスターターキットのLCD表示回路を作っているところだ。 LCDの上の列と下の列に右端から4つの16進数を表示する回路だ。下にVHDLファイルのentityを示す。


entity LCD4HexDisp is
port( clk : in std_logic;
reset : in std_logic;
upper_4hex_data : in std_logic_vector(15 downto 0); -- LCD上の行の4つの16進数
lower_4hex_data : in std_logic_vector(15 downto 0); -- LCD下の行の4つの16進数
lcd_d : inout std_logic_vector(7 downto 4);
lcd_rs : out std_logic;
lcd_rw : out std_logic;
lcd_e : out std_logic
); end LCD4HexDisp;



このVHDLファイルの下にPicoBlazeをインスタンスして、初期化やupper_4hex_dataとlower_4hex_dataから切り出した8ビットを読み込んでLCD読み書き回路に8ビットを与える。 LCD書き込み回路は前に示したスパルタン3スターターキットのユーザーズマニュアルの図に沿って、与えられた8ビットのデータを4ビットずつLCDに書き込む回路だ。
Spartan3E_LCD_3_060421.png
最初にupper 4bitを書き込んで、1us、waitし、次にlower 4bitを書き込む。LCD書き込み回路のentityを下に示す。この回路はタイミングとLCD_Eを発生する。データのセレクタは上の階層に実装されている。

entity LCD_operation is
port(
access4bit : in std_logic; -- 初期化時の4ビットアクセス用
port1_w_strobe : in std_logic; -- データをPicoBlazeから書き込んだ
lcd_e : out std_logic; -- LCD_E信号、LCDに供給
ope_is_idle : out std_logic; -- upper,lower4bitをLCDに書き込み終了
sel_lower : out std_logic -- lower4bit書き込み中
);
end LCD_operation;



LCD書き込み回路の下には書き込みタイミング発生用のステートマシンがある。ステートマシンはStateCADで作ってみた。
LCD_StateMachine_060430.png


まだ作っている段階でシミュレーションもしていない。 次回はPicoBlazeと回路のインターフェースの仕様を書こうと思う。

-- 2006.05.06 ステートマシンの説明を追加
・Main State Machine
ope_startが1の時ステートマシンがスタートする。access4bitが1の時はlower_startからスタートし、0の時はupper_startからスタートする。
upper_startからスタートした時には、次のクロックでupper_end_waitに遷移し、operateステートマシンの終了を待つ。終了後wait_1usステートに遷移し、U2Linterval_endを待つ。
U2Linterval_endは別のVHDLファイルにあって1usを間としているカウンタの出力であり、1になると1us経過したことを示す。
その後lower_startに遷移して1クロックでlower_end_waitに遷移する。upper同様にoperateステートマシンの終了を待ってidle_mainに戻る。

・右のステートマシン(operateステートマシン)
Figure 5-6のLCD_Eを出力するためのステートマシン。access4bitが0の時はMain State Machineがアクティブになっているときにupperの4bitとlowerの4bitの2回アクティブになる。
1の時はlowerの4bitの1回アクティブになる。
  1. 2006年04月30日 16:51 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

剣道の1級の検定試験

今日は上のお姉ちゃんが剣道の1級の試験を受けるので、龍ヶ崎市の城の内中学校まで検定試験に行ってきた。結構遠かった、3十数キロあった。
部活の朝練サボってばかりいるのに、結構うまくなっていたのにびっくり。
1級の試験は型の講習を受けて、切り返しをやり、その後稽古をした。(面打ちなのかな。剣道が良くわからないので。。。)
一応受かったようだ。試験料金が3,000円で、認定料金が2,500円だった。
今度は初段の試験だそうだが、練習しないと受からないという講評があった。もっと練習しないと受からないようである。
  1. 2006年04月29日 15:54 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

StateCADの使い方3

きのうはもう書くのが疲れてしまって、尻切れトンボ気味になってしまった。
出てきたVHDLコードを見るとあまり人間が作ったようではない。説明のためにランダムロジックを使った例にしてしまったので、わかりにくいコードが出てしまったのかも。普段はもっと自分で書いたようなコードが大体は出てくる。
私はエクスプローラーの"ツール”の”フォルダ オプション”の”ファイルの種類”タブからStateCADのEXE(sc.exe)を登録して****.diaをダブルクリックするとStateCADが起動するようにしている。sc.exeは、Webpackのインストールディレクトリ\bin\ntのディレクトリの中にある。
ファイル名の8文字までがネックだがこれは一度作って、エクスプローラーから名前を変更すればOKだ。ダブルクリックすれば起動できる。
今やってみたが、文字数を変えるとアプリケーションエラーで落ちることもあるようだ。一応、VHDLファイルは出力できているようだが。。。
StateCADはほかの論理回路(カウンタやマルチプレクサなど)を一緒に組み込むのも制約があるし、やはりステートマシンだけを書けばよいときに便利だと思う。
NIのステートマシンも結構これで書いてある。PCIのターゲットやマスタのステートマシンとか。
PCIのところで示した下の図とかはそうだ。
http://blog-imgs-29.fc2.com/m/a/r/marsee101/PCI_traget_access_060106.png
日本語は使えないが、後で見て見やすいのが利点だ。見やすい範囲のステート数ならば。。。
そういえばステートの色の変え方を説明していなかった。
ステートの色の変え方は、まずは色を変えるステートを選択して、左のツールバーの下の列の上から二番目のアイコン(Fill Color)をクリックすると、下にハイドされていた色が出てくる。そこで変えたい色をクリックする。
StateCAD_17_060425.png


濃い色にしてしまうと字が見えなくなるので、字の色も変えられる。
StateCAD_18_060425.png

  1. 2006年04月26日 09:08 |
  2. StateCADの使い方
  3. | トラックバック:0
  4. | コメント:0

StateCADの使い方2

StateCADの使い方の続きだ。

次にステートの名前とステートでの出力を入力しよう。いわゆるムーア型ステートマシンにする。ミーリー型にも出来るのだが、あまりやっていないし、なるべくならばムーア型で作ったほうが良い。
3クロック分のパルスを出力する信号はpulse3、入力信号はlong_pulseとする。
左端のツールバーの1番目をクリックすると選択モードになるので、STATE0をクリックしよう。そうするとEdit Stateダイアログが出るのでそこのState Nameに"idle"、Outputに"pulse3 <= '0';"を入れてみよう。
StateCAD_8_060425.png


そうするとSTATE0がidle/pulse3 <= '0';に変わったと思う。
同様にSTATE1に"pulse_is_high/pulse3 <= '1'"を、STATE2に"hold_off/pulse3 <= '0'"を入力する。
StateCAD_9_060425.png


次に→の遷移条件を入力しよう。
最初にidleステートからpulse_is_highステートに行く→をクリックする。"Condition"のところに"long_pulse"と入力する。これでlong_pulseが1の時にidleステートからpulse_is_highステートに遷移するようになる。startが0の時に遷移するするためには"!long_pulse"と入力する。"long_pulse=1"や"long_pulse=0"でも良い。(ただしVHDLのときにしか確かめたことが無い)
"Outputs"に入力するとミーリー型ステートマシンになるが、やったことは無い。
StateCAD_10_060425.png


pulse_is_highステートからhold_offステートに行く→に"count[1]"、hold_offステートからidleステートに行く→に"!long_pulse"を入れる。これでlong_pulseが1になってからcount[1]が1までの間pulse3出力に1が出力される。
StateCAD_11_060425.png


次にpulse3を3クロック分にするためにカウンタを作ろう。pulse_is_highステートに遷移してから2カウントしてからhold_offステートに遷移させると3クロック幅のパルスになる。
上のツールバーから"Random Logic"をクリックし、適当なところでクリックするとLogic Wizardダイアログが開く。"Count up"を選択してCOUNTに"count"、Data Path widthに2を入れる。そうしたらOKボタンをクリック。
StateCAD_12_060425.png


Edit Equationダイアログが表示される。Sync resetに"pulse3"を入力し、=0にする。Okボタンをクリックする。
StateCAD_13_060425.png


そうするとカウンタロジックが生成される。
StateCAD_14_060425.png


メニューの"Options"から"Configuration..."を選択して表示する。下の図の通りにしてほしい。Verilogの方はVerilogで生成できるようだ。(私はやったことは無い)特にLanguage VenderはIEEE 1076にしたほうが人間がHDLコードを読みやすいようだ。OKボタンをクリック。
StateCAD_15_060425.png


pulse3をOptimizeするかを聞いてくるので、Optimizeしないためにpulse3の前のXを消して、Optimizeボタンをクリック。
StateCAD_16_060425.png


そうすると、もう一度countをOptimizeするか聞いてくるので、これはOptimizeするので、Optimizeボタンをクリック。そうするとHDLが表示され、SMSAMPLE.VHDが生成される。
  1. 2006年04月25日 05:59 |
  2. StateCADの使い方
  3. | トラックバック:0
  4. | コメント:0

StateCADの使い方1

今日はグラフィカルにステートマシンを記述できるツールStateCADを解説しようと思う。
StateCADを使うと出力信号をFF出力に記述することが簡単に出来る。出力コードを見ると参考になると思う。
今回は入力信号の立ち上がりのときに3クロック分1を出力するステートマシンを作ることにしよう。
まずはstate_sampleというからのプロジェクトを作成する。作成の仕方はいままでやったし、いろんなWebページに書いてあるのでここでは省略する。使用するFPGAはXC3S200-4FT256とする。
ここでメニューの"Project"から"New Source"を選ぶ。
New Source Wizard - Select Source TypeダイアログでFile nameにstatem_sampleと入力し、左のペインからState Diagramを選択する。
StateCAD_1_060424.png


次へ>ボタンをクリックして、New Source Wizard - Summaryダイアログが出てくるので、Finishをクリックする。
StateCAD_2_060424.png


そうするとエラーが出て落ちる。これがStateCADのよくないところで名前が8文字まで出ないとだめなのだ。それでsmsampleに名前を変えてもう一度やろう。
今度はちゃんとStateCADのウインドウが開いたことと思う。
StateCAD_3_060424.png


左端のツールバーの二番目のボタンをクリックするとステートが書けるので、適当なところでクリックするとステートが書ける。3つ下図のように書いてみよう。
StateCAD_4_060424.png


左端のツールバーの3番目のボタンをクリックすると遷移を表す→が書ける。まずはSTATE0の上の楕円の線上でダブルクリックすると@ELSEと書かれている→を書ける。これは遷移の→の条件に合わない時に元のステートに戻る→だ。普通の遷移を示す→は例えばSTATE0の楕円の線上をクリックすると赤い線が延びるので、行先まで伸ばして行先のSTATEでクリックするとそこまで→を書くことが出来る。
StateCAD_5_060424.png


次にリセットの時にどのステートから始まるかを指定しよう。左端のツールバーの4番目のボタンをクリックするとリセット時にどこのステート空始まるかを指定できる。適当なところでクリックして、STATE0までマウスを移動して線を伸ばしてクリック。
ダイアログが出てくるので非同期リセットならばyesを同期リセットならばnoボタンをクリック。下の図は非同期リセット。
StateCAD_6_060424.png


次にステートマシンのタイトルを入れよう。左端のツールバーの5番目のボタンをクリックするとテキストボックスが開いてタイトルを入れることが出来る。
ステートマシンの図の上の適当なところでクリックするとテキストを入れるダイアログが開くので、タイトルを入れる。ここでは"Sample State Machine"と入れた。
StateCAD_7_060424.png


今日はとりあえずここまでとする。続きはまた後で。
ここまで作った人はとりあえずセーブして置いてください。
  1. 2006年04月24日 21:03 |
  2. StateCADの使い方
  3. | トラックバック:0
  4. | コメント:0

昨日は授業参観、そして今日は

jyugyousankan_040623.jpg


昨日の日曜日は小学校の授業参観だった。
小学校へは歩いて1分くらいなのでとても近い。
うちの小学校はオープンスペースになっていて、教室と廊下の区別がない。教室のドアや仕切りがない。授業参観するにはとても都合が良い。
算数と国語の授業を見てきたが、なかなか面白そうだった。子供の興味を引くようにやってくれているようだった。

話は変わるが、一番上の子にHSPでゲームプログラムを教えた。わかっているかどうかは怪しいものだが、一応waitの数値を変えて速さを変えたり、ラインの色を変えるのはわかったようだ。

またまた話は変わるが、今日は真ん中の子の誕生日だ。
ケーキを買ってくるのをおおせつかったので、早く帰宅しなくてはいけなくなった。
  1. 2006年04月24日 05:17 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

トイザラスで任天堂DS Liteを買いました。

toyzarus_060422.jpg


トイザラス荒川沖店にDS Liteが160台入るという情報が入ったので、朝7時ごろ家を出て、トイザラス荒川沖店に行きました。
もう20人くらい並んでいたので後ろに並びました。9時ころ整理券を配るということで並んでいたら結局全員買えるので整理券を配らずに10時開店まで並んでネイビーのDS Liteとメルヘヴンのカルディアの悪魔のソフトを買って帰りました。結局2時間以上並んでましたが、携帯用いすを持っていったので結構楽に過ごせました。
息子の誕生日前に買えてよかったです。

DS Lite本当に液晶が明るい。びっくりしたよく見える。PSPもきれいだが、それ以上にコントラストが強いかも?
早速えいご漬けを購入した音声もでるし、ペンでスペルを書く練習もできるのでPSPのトークマンよりいいと思った。発音を練習するにはトークマンなんだろうけど、総合的にはえいご漬けが良い。両方持っているが。お姉ちゃんにもやらせようと思う。
  1. 2006年04月22日 14:10 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Spartan3E Starter KitのLCD2

改めてSpartan3E Starter KitのLCDの使い方をSpartan3E Starter Kitの初めからコンフィグROMに入っているプロジェクトs3esk_startupのマニュアルを見てお勉強したら、やはりとても面倒なことがわかる。 Power-On Initializationを結構永遠としなくてはいけないらしい。まずは4ビット(LCDのデータバスは4ビット分のみFPGAに接続されている)インターフェースで以下の図のように書き込む。(s2esk_startup_rev2.pdfより引用) Spartan3E_LCD_1_060421.png
その後、RS=0,RW=0にして8ビットのコマンドを書く。(s2esk_startup_rev2.pdfより引用) Spartan3E_LCD_2_060421.png
そのときに、4ビットインターフェースなので上位、下位と書いて8ビット分とするようだ。(ug230.pdfの50ページより引用) Spartan3E_LCD_3_060421.png
これでやっと初期化終了でLCDに文字を表示できる準備ができる。 かなり面倒なのでマイクロコードを使用したステートマシンかプロセッサじゃないと現実的でない。(スピードが遅いのでステートマシンでも大丈夫そうだけど、PicoBlazeを使ってみようと思う) 前にも書いたがインターバルタイマとLCD書き込み、読み出し用ステートマシンをハードでサポートしてPicoBlazeを使用することにしようと思う。やはりアセンブラは面倒なので、多少バグがあってもここで紹介されていたCで開発することにしようと思う。
  1. 2006年04月21日 12:45 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Spartan3E Starter KitのLCD

Spartan3E Starter KitのLCDについてマニュアルを読んだ。 いろいろモードもあるし、BUSYもみる必要があるのでステートマシンではきついと思いPicoBlazeで表示してみることにする。 MicroBlazeでもプロジェクトを作ってみたが、LCD表示回路が生成できなかったのでやめることにした。 PicoBlazeの事が良く書いてあるhttp://www.fpga-lab.org/proc/picoblaze/index.htmlのページでお勉強。 pBlazIDEは本家のサイトがなくなっているようでダウンロードできない。でもなんとかあるところからダウンロード。使ってみるがXilinxの本家のアセンブラと書き方が違うそうだ。スタータキットの最初から入ってるアセンブラもシミュレーションできないみたい。これはあきらめることにする。 サンプルを参考にスライドスイッチの値をLEDに出力するプログラムを作ることができた。 今度はLCDに表示するプログラムを作ることにする。その場合にLCDに書き込む回路とタイマーをつけようと思っている。 ModelSimでシミュレーションするときに逆アセンブルして表示できないかな?少し暇になったら考えてみよう?でも、いつになるかわからないか。。。 逆アセンブル作ろうと思ったら、先ほどのFPGA Laboratoryに”ModelSim® XE Ⅲ 6.0dによるPicoBlaze™のシミュレーション”というのがあってModelSimでシミュレーションするとオペコードが見えるそうだ。それじゃこれでOKだ。
  1. 2006年04月19日 20:34 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:2

プリント基板のデータバスの信号品質

またまた、プリント基板のデータバスの信号品質について問題が出ている。
データバスはFPGA-SDRAM-PowerPCとつながっている。
以前は実際の配線前の目安ということで波形を出してもらったのだが、実際に配線したら長くなったということで今度はSDRAMからの出力信号も信号の変化点で乱れるようになってしまった。
こうなると信号が安定してる場所にセットアップ時間を設定するためにPowerPCへのクロックを遅らせることになる。そうするとPowerPCからSDRAMへのデータ転送のときにセットアップ時間がきつくなり破綻してしまう。
解決策としては今FPGAの元にダンピング抵抗を入れてもらってシミュレーションしてもらっているが、それでもだめならレイアウトを見直すしかないかもしれない。
それとも今FPGAからSDRAMとPowerPCへつながっているデータバスを分けるとか。小さい基板だけだが、大きなほうはピンの余裕がないのでその場合は周波数を落とすことになるだろう。

スパルタン3Eスタータキットはまだ本格的に使っていない。ちょこちょこサンプルプロジェクトをやっている。今はLCDをどう表示するか知るためにマニュアルを読んでいる。
  1. 2006年04月19日 05:42 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:2

DDR SDRAMのDQS信号でデータをサンプルする方法2

DDR SDRAMのDQS信号でデータをサンプルする方法のうち、SRL16EプリミティブでFIFOを作って実際にDDR SDRAMのデータを受ける方法だ。これはXAPP758Cでも使われていたが、CLB内のLUTをFIFOとして使用する方法だ。LUTをFIFOとして使用するためにSRL16Eプリミティブを使用している。これはデータを取り出せる位置が任意に選べるシフトレジスタである。4ビットのアドレスがあって、アドレスを入れるとそのアドレス番号のシフトレジスタのデータが出力できる。なおSRL16というプリミティブもあるが、SRL16Eとの違いはイネーブルがあるかどうかである。
これを使用してFIFOにすることにした。FIFOにするためのコードはVHDLで自分で書いた。
使用するFPGAはXC2VP7-6FF896だ。サンプルプロジェクトはここにあるので参照してほしい。
最初にPACEでIOピンを割り当てよう。今まで数回PACEによるIOピンの割り当てはやってきたので、以前の画像で済ませてしまうことにする。入出力ピンの名前は違っているので注意願います。
まずは、SEのProcessesウインドウのUser Constraintsを展開してAssgin Package Pinsをダブルクリック。
pace_1_060126.png


BANK7のみSSTL2レベルのIOに対応するためにVREFピンをPROHIBITする。メニューバーのIOBsからProhibit Special Pins...を選択する。下図のようなダイアログが開くので、BANK7にチェックを入れる。次にProhibit Pin TypesのVREFにチェックを入れ、OKボタンをクリック。
pace_1_060126.png


Design Object ListペインからDevice Architectureペインに、下のUCFファイルを見ながらI/Oをドラックアンドドロップしてほしい。(でも、UCFファイルを直接コピーしたほうが早いか。。。)
pace_1_060126.png


ピンアサイン部分のUCFファイルです。

NET "wr_en" LOC = "K26" ;
NET "reset" LOC = "D26" ;
NET "rd_en" LOC = "K25" ;
NET "full" LOC = "K27" ;
NET "empty" LOC = "N24" ;
NET "dqs" LOC = "C30" ;
NET "dout<7>" LOC = "N23" ;
NET "dout<6>" LOC = "L29" ;
NET "dout<5>" LOC = "K29" ;
NET "dout<4>" LOC = "J28" ;
NET "dout<3>" LOC = "J27" ;
NET "dout<2>" LOC = "M26" ;
NET "dout<1>" LOC = "M25" ;
NET "dout<0>" LOC = "K30" ;
NET "din<7>" LOC = "M24" ;
NET "din<6>" LOC = "M23" ;
NET "din<5>" LOC = "J29" ;
NET "din<4>" LOC = "H29" ;
NET "din<3>" LOC = "D28" ;
NET "din<2>" LOC = "C27" ;
NET "din<1>" LOC = "J24" ;
NET "din<0>" LOC = "J23" ;
CONFIG PROHIBIT = C29;
CONFIG PROHIBIT = J30;
CONFIG PROHIBIT = L30;
CONFIG PROHIBIT = N30;
CONFIG PROHIBIT = R29;



次にFloorplannerで論理素子を割り当てよう。ピンもFloorplannerで割り当ててもよい。
"Processes"ペインのImplemnent Designを開き、その中のTranslateを開く。その中のFloorplan Designをダブルクリックする。そのFloorplannerで下図のようにLUT3,SRL16Eを割り当てる。
ddr_receive_1_060418.png


論理素子割り当て部分のUCFは以下の通り。

INST "delay3" LOC = "SLICE_X2Y75" ;
INST "delay2" LOC = "SLICE_X1Y75" ;
INST "delay1" LOC = "SLICE_X0Y75" ;
INST "lut_fifo_inst/SRL16E_inst7" LOC = "SLICE_X0Y70" ;
INST "lut_fifo_inst/SRL16E_inst6" LOC = "SLICE_X0Y70" ;
INST "lut_fifo_inst/SRL16E_inst5" LOC = "SLICE_X0Y71" ;
INST "lut_fifo_inst/SRL16E_inst4" LOC = "SLICE_X0Y71" ;
INST "lut_fifo_inst/SRL16E_inst3" LOC = "SLICE_X0Y72" ;
INST "lut_fifo_inst/SRL16E_inst2" LOC = "SLICE_X0Y72" ;
INST "lut_fifo_inst/SRL16E_inst1" LOC = "SLICE_X0Y74" ;
INST "lut_fifo_inst/SRL16E_inst0" LOC = "SLICE_X0Y74" ;


Processesウインドウから"Implement Design"を展開して"Place & Route"を展開し、"View/Edit Routed Design (FPGA Editor)"をダブルクリック。
そうすると論理合成、インプリメントをしてFPGA Editorが起動する。
クロックとして使用してるdqs_delay_3をみると、かなり短い距離で配線されていることがわかる。delayを見てみると0.261nsから0.665nsの間である。
ddr_receive_2_060418.png


次にTiming Analyzerを起動して、DQSパッドからdqs_delay_3(遅延素子で遅延したクロックとして使用)の遅延時間とD入力パッドからSRL16Eのセットアップ時間までの遅延を比べてみる。
ddr_receive_3_060418.png


D3を比べてみるとDQSは2.847ns遅延して、D3用SRL16Eまでは1.682ns遅延する。DQSのほうがSRL16Eのセットアップ時間を加えた遅延時間より1.165ns遅れてるので、データを受けられるはずだ。これから受信クロックからシステムクロックに乗せ変えなければならないが。このFIFOからもう一度非同期FIFO入れても良いだろう。ほかにも方法があると思う。

ちょっと条件を変えてやってみよう。FloorplannerでDelay3とDelay1の位置を反対にする。
ddr_receive_4_060418.png


これでインプリしてFPGA Editorを起動すると、dqs_delay_3の遅延を見ると、大幅に伸びている
ddr_receive_5_060418.png


0.566nsから1.055nsまでの遅延になっていて、前より伸びている。論理素子の位置によってだいぶ変わるようである。注意が必要のようだ。
ちなみに今までのPlace & Route Effort LevelはStandardでインプリしている。ちなみにHighでやっても変わらないようだ。UCFにタイミング制約を何も書いていないのでやりようがないのだろう。
  1. 2006年04月17日 05:45 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

DDR SDRAMのDQS信号でデータをサンプルする方法2のまえふり

DDR SDRAMのDQS信号でデータをサンプルする方法2のまえふりとなってしまって申し訳ない。
SRL16EプリミティブでFIFOを作って実際にDDR SDRAMのデータを受けるようにプロジェクト作っていたのだが、どうしてXSTでエラーになってしまう。Synplifyだと通るのだがなぜだかまだ不明だ。
うまく行ったら、ブログに書こうと思っている。
Xilinxのアプリケーションノートで見たのだが、DDR SDRAMのデータを受けるFIFOのWrite enableはかなり複雑になっているようだ。自分で作るためにはやはりLUTの遅延を考えた配置にしなければいけないようだ。やはりかなりXilinxのFPGAデバイスに精通していなければ無利だと思われる。やはり、とりあえず100MHz以下で動的位相シフトによってDDR SDRAMのデータを受けるのが良さそうだ。それでもどこがデータかを判定するのが問題だが、一回DDR SDRAMに55やAAなどのパターンを書いて、パターンを受ける位置を保存して持っていると良いかもしれないな。。。

2006.04.16
原因がわかりました。
最初にライブラリをuseするところでunisimを論理合成するときに無視するように-- pragma translate offしますが、それが反対でentityを無視するようになっていたようです。
つまり

-- pragma translate on
library UNISIM;
use UNISIM.VComponents.all;
-- pragma translate off


になっていました。正しくは

-- pragma translate off
library UNISIM;
use UNISIM.VComponents.all;
-- pragma translate on


です。こんなことでだいぶ悩んでしまいました。
でもSynplifyは大丈夫なんですね。entityキーワードがあると自動的に論理合成ONにでもなるんでしょうか?
これで論理合成できて、なかなか面白い結果も出ていますが、今日は元ダイエーがあったビルの巨大100円ショップとかに行っていてブログを書けてないので、そのうち書きます。
  1. 2006年04月15日 22:17 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

信号反射の実験

信号の反射の具合を見る実験だ。
空気中の電波の速度をv0,絶縁物の比誘電率をkとすると、同軸ケーブル中の信号の伝播速度はv=v0/√kである。普通の同軸ケーブルの絶縁物のポリエチレンのkは2.26である。
よって、100mの同軸ケーブルの伝播速度は100/(3×10の8乗/√2.26)で約500nsとなる。

以上のこことを踏まえて下のような回路で実験する。パルスジェネレータの出力インピーダンスは50オーム、100mの同軸ケーブルは5D-2V、ポリエチレン絶縁体とする(同軸ケーブルは巻いてあるので、距離は0mです。オシロスコープの普通のプローブで測っています)。オシロスコープでは基本的にCH1(上の波形)で分岐器からの信号波形を観察し、CH2(下の波形)で終端の両端の信号波形を観察する。

(2013/06/17:追記)分岐器はY型抵抗分配回路を使っていました。50Ωの抵抗を3本パラレルに接続し、16.7Ωとして使用していたようです。
ref_circuit_1_060412.png


最初に終端に50Ωの終端抵抗をつけた場合の波形を見てみる同軸ケーブルのインピーダンスが50オームなので、インピーダンスマッチングしている状態である。上の波形が分岐器で図った波形したの波形が終端で計った波形である。少しなまってはいるがきれいに100mの同軸ケーブルを伝送できている。写真はぼけているが、時間軸は500ns/1divである。ちょうど500ns遅延しているので、計算と合う。
ref_wave_1_060412.jpg


次に終端をオープンにしてみる。こうすると、100mの同軸ケーブルを終端までパルスが伝送して負荷が無限大になるので正方向?で反射する。同様に上が分岐器で見た波形、下が100mの同軸ケーブルの先で見た波形。時間軸は同様に500ns/1divである。上の波形を見ると最初にパルスが立ち上がってから反射の波形が1us後(100m同軸ケーブルを行き帰りする)に出ている。それがまた100m同軸ケーブルを伝送して、下の波形に2番目の反射波形が出ている。3番目くらいまで見える。
ref_wave_2_060412.jpg


これでパルスの幅を増やしてみよう。こうすると一般的な乱れた波形に近くなる。ピンクの→は反射波が加わって波高値があがったところである。(パルスを出してから1us後、行って帰ってきた反射波)このようにだんだんパルスの幅を伸ばすと普通の反射のあるクロック波形に近づく。
ref_wave_3_060412.jpg


もっとパルス幅を伸ばした波形を示す。だいぶ歪んだクロック波形らしくなってきた。
ref_wave_4_060412.jpg


今度は終端をショートに変えてみよう。そうすると反射波はショート回路をスルーしてシールドに入るので、反射波が反対になる。2番目の反射波はー方向、3番目はそれの反対になるので+方向になる。下の終端の信号はショートなので0Vであるため測定しなかった。
ref_wave_5_060412.jpg


今度はオープン同様にパルス幅を伸ばしてみる。今度はピンクの→のところで反射が到着している。(パルスを出してから1us後、行って帰ってきた反射波)今度はショートなので反射の分、波高値が減っている。下の波形はパルスジェネレータのもう1つの出力からの波形だ。インピーダンスマッチングしていれば、こういう波形がでているはずということだ。
ref_wave_6_060412.jpg


このようにインピーダンスの不整合点で反射が起こるのが良くわかる。
線路インピーダンスよりも負荷インピーダンスが高ければ+の方向に、低ければ-の方向に反射が起こるのが、実験をすると良くわかる。
実際の回路ではオープン、ショートほどインピーダンスの不整合が激しいわけでもないが、インピーダンスが不整合だとそれなりに反射が起こる。実際、実験でも100オームの抵抗、コンデンサ、コイルをつけて波形を見るようになっていた。今回は省略したが。。。
本当にいい実験だったと思う。
ちなみにパルスジェネレータの出力インピーダンスを変更することが出来る。今は50オームで使用しているが、HIGHという設定もある。HIGHで反射を見てみると、オープンでは直流になってしまった。反射しまくりなのだろうか? ショートでは発振しているような波形になった。パルスジェネレータの出力インピーダンスによって反射が収まらないので、ひどいことになってしまう。

実際のプリント基板の波形の乱れもこのようなインピーダンスの不整合が関係しているはずだ。インピーダンス不整合点の伝播遅延がわかれば、ある程度どこからの反射かわかり、インピーダンスが高いのか低いのかわかると思う。今の実験は単純なモデルだったが、実際の基板は波形を出力するバッファのインピーダンスや、線路のインピーダンスも違っているし、LやC成分も加わるので単純には比較できないとは思うが、基本は同様だと思われる。
何か間違いや勘違いがあったらコメントをお願いします。

〇沢先生初めて実験したときには感動しました。このようにはっきり反射波を見たことが無かったので。何か問題がありましたら、お知らせください。

<補足>
なぜ100mの同軸ケーブルを使用しているかというと、この実験は30年くらい前に出来た実験で、その当時はオシロスコープが高価だったため、性能の低い(時間分解能の低い)オシロスコープしか学生実験に使えなかった。(たぶん)時間分解能の低いオシロでも見やすいように反射波を遅延するために100mの同軸ケーブルを使用したと思われる。現在の性能の良いオシロでは1mのケーブルでも遅延、反射が良く見えることと思う。
  1. 2006年04月12日 19:55 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

今までのこのブログのアクセス数

このブログも2005年の8月10に始まったようだ。
その頃はあまりFPGAのツールやFPGAチップの使い方の情報があまりにも少なかったので、自分で書いてみようと思って書き始まった。このブログは自分の備忘録としても使っている。あれは確か前にやったはずだが、どうやるんだっけ?という時に自分のブログを検索している。
ブログに書くようになって、あまりに中途半端ではかけないので、ある程度は詳しく追いかけるようになり、自分の知識も増したような気がする。これもひとえに見ていただいてる皆さんのおかげと思っている。アクセス数が多くなると励みになる。
2005年の8月は454アクセスだったが3月には10,233アクセスだった。
access_cout_060411.png


これからもねたがある限り書こうと思っている。今回は基板の作成で波形の乱れに悩まされた。波形が乱れる原因の反射に関して、とてもいい実験があった。今はなくなってしまったが、100mの同軸ケーブルを使用して終端を変え、伝播遅延と反射を実際に見る実験だった。最初に職場に来てやった時には感動した。これを器材があるうちにもう一度実験してブログに書きたい。のだが、なかなか時間が取れない。
後、自分の備忘録としても検索が大変になってきたのでまとめたい。しかし、これも本を書くようなもので大変そうだ。
なんにしても皆様、いろいろコメントをいただいてありがとうございます。これからもいろいろコメントお願いします。間違っているぞとか、こうしたほうがいいんじゃないとかどしどしお願いします。張り合いも出ますので、よろしくお願いします。
  1. 2006年04月11日 06:26 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

クロックを遅延する方法

今回はグローバルバッファに入る前にクロックを内部の論理素子で遅延する方法だ。使用するFPGAチップはXC2V50-6FF1152とする。
たとえば下の図のようにFPGAの入力ピンに入力される信号波形が乱れているとしよう。FPGAの入力用FFのクロックのラッチポイントが波形の乱れの近くにある場合はセットアップ時間やホールド時間に波形の乱れが入る場合がある。その場合、下図ではVil(max)を超えていないが、超える場合も考えられる。Vil(max)を超えてスレッショルドに近くなるとFFがミスる場合も考えられる。その場合にクロックを信号が安定しているところにずらせば安定してデータを受けることができるようになる。クロックをずらすためにグローバルバッファ(BUFGMUX)の前に遅延素子を入れるわけだ。
input_wave_form_060407.png


その方法を見てみよう。最初にチャレンジしたのはMUXF5プリミティブを使って遅延する方法だった。以前使用したBUFプリミティブはTranslateの時点でインスタンスが見えないのでフロアプランできなかったため不可となった。
今回の遅延素子のブロック図を下に示す。delay_timeの値で遅延の量を変化できるようになっている。
delay_circuit_block_060409.png


以前に使用した"KEEP"制約を使用しても最初のMUXF5プリミティブがなくなってしまった。ソースの一部を示す。

attribute KEEP : string;
attribute KEEP of clk_node: signal is "ture";
attribute KEEP of clk_delay_1: signal is "true";
attribute KEEP of clk_delay_2: signal is "true";
attribute KEEP of clk_delay_3: signal is "true";

begin
 logic1 <= '1';

 ibufg_inst : ibufg port map(i=>clk, o=>clk_node);

 delay_time <= "11";
 delay1 : MUXF5
  port map(
   o => clk_delay_1,
   i0 => clk_node,
   i1 => clk_node,
   s => logic1 -- sel
  );
 delay2 : MUXF5
  port map(
   o => clk_delay_2,
   i0 => clk_node,
   i1 => clk_delay_1,
   s => delay_time(0)
  );
 delay3 : MUXF5
  port map(
   o => clk_delay_3,
   i0 => clk_node,
   i1 => clk_delay_2,
   s => delay_time(1)
  );

 bufg_inst : bufg port map(
  i => clk_delay_3,
  o => clk_bufg_out
 );


MUXF5を使用するとフロアプランナーで1スライス分論理素子を占有してしまう。なぜかわからなかったのでTiming Analyzerの説明を見てみたらLUTの後ろのMUXを使用しているようだ。それがMUXF5というらしい。
MUXF5_circuit_060409.png


これでBUFGMUXの前に遅延はいれることができたが、1スライスを占有するのでどうももったいない。やはりMUXプリミティブ系にはLUTを使用するものがないので直接LUTプリミティブを使用しないと問題を解決できないようだ。
そこでLUT3を使用することにする。LUT3を使用するのはINITの値を考えるのが楽であるためだ。LUTを使用してMUXを構成できるようにINIT値を決めた。これでMUXF5の代わりにこれを使用する。VHDLコードは下のようになった。

attribute KEEP : string;
attribute KEEP of clk_node: signal is "ture";
attribute KEEP of clk_delay_1: signal is "true";
attribute KEEP of clk_delay_2: signal is "true";
attribute KEEP of clk_delay_3: signal is "true";

begin
 logic1 <= '1';

 ibufg_inst : ibufg port map(i=>clk, o=>clk_node);

 delay_time <= "11";
 delay1 : LUT3
 generic map(
   INIT => X"CA")
  port map(
   o => clk_delay_1,
   i0 => clk_node,
   i1 => clk_node,
   i2 => logic1 -- sel
  );
 delay2 : LUT3
  generic map(
   INIT => X"CA")
  port map(
   o => clk_delay_2,
   i0 => clk_node,
   i1 => clk_delay_1,
   i2 => delay_time(0)
  );
 delay3 : LUT3
  generic map(
   INIT => X"CA")
  port map(
   o => clk_delay_3,
   i0 => clk_node,
   i1 => clk_delay_2,
   i2 => delay_time(1)
  );

 bufg_inst : bufg port map(
  i => clk_delay_3,
  o => clk_bufg_out
 );


LUTは下の図のように論理素子を使用する。
LUT_circuit_060409.png


これならばスライスのFかGにフロアプランナーで配置できる。しかし、同じスライスの2つともこのLUT3プリミティブを配置することはできないようだ。これで良いだろう。

クロックの遅延素子なし、MUXF5遅延素子つき、LUT3遅延素子つきのFPGA Editorの画面を示す。
最初にクロックの遅延素子なしを示す。
no_delay_FPGA_Editor_060409.png


遅延素子がなくてもかなりCLKピンからBUFGMUXまでの配線が回っているようだ。
次にMUXF5遅延素子つきを示す。
MUXF5_delay_FPGA_Editor_060409.png


1つ予定より遅延素子が少ない。
LUT3遅延素子つきを示す。
LUT_delay_FPGA_Editor_060409.png


Timinig Analyzerの結果も示す。この結果はCLKピンからBUFGMUXの入力までの遅延だ。
最初にクロックの遅延素子なしを示す。
no_delay_tim_ana_060409.png


次にMUXF5遅延素子つきを示す。
MUXF5_delay_060409.png


最後にLUT3遅延素子つきを示す。
LUT3_delay_060409.png


どっちの遅延素子つきも1.406ns~1.675ns程度遅れている。
MUXF5の方は上のスライスのブロック図を見てもわかるが、信号通過の経路が増えているためLUTに比べて論理素子で倍以上の遅延があるようだ。
  1. 2006年04月09日 14:15 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:0

DDR SDRAMのDQS信号でデータをサンプルする方法1

DDR SDRAMのデータをFPGAで受け取る場合に、DQSをクロックとして受け取る方法がある。DQSはデータと同位相だが、DQSだけをプリント基板の配線遅延でデータの半分(IOBのセットアップ時間を満足する時間)遅延させてIOBでデータをラッチする方法が考えられる。
この場合に問題になるのは、mixiのよっしーさんから質問があったのだが、普通にDフリップフロップをHDLで記述するとDQSがクロックとして論理合成ツールに認識されてグローバルバッファを使ってしまう。
実際にやってみよう。
スパルタン3スタータキットのXC3S200-4FT256を使用する。下に示すVHDLファイルをコンパイルしてFPGA Editorで見てみよう。やり方はFPGA Editorの使い方1などを見てほしい。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ff_test is
Port ( dqs : in std_logic; -- clk
 reset : in std_logic;
 d : in std_logic_vector(7 downto 0);
 q : out std_logic(7 downto 0));
end ff_test;

architecture RTL of ff_test is
begin
 process(reset, dqs) begin
  if reset='1' then
   q <= (others => '0');
  elsif dqs'event and dqs='1' then
   q <= d;
  end if;
 end process;
end RTL;


最初にPACEを使って、ピンを割り当ててみよう。PACEの使い方はPACEの使い方1などを見てほしい。

ISEのProcessesウインドウのUser Constraintsを展開してAssgin Package Pinsをダブルクリック。
pace_1_060126.png


BANK7のみSSTL2レベルのIOに対応するためにVREFピンをPROHIBITする。メニューバーのIOBsからProhibit Special Pins...を選択する。下図のようなダイアログが開くので、BANK7にチェックを入れる。次にProhibit Pin TypesのVREFにチェックを入れ、OKボタンをクリック。
DQS_CLK_1_060407.png


Design Object ListペインからDevice Architectureペインに、DQSをE2にD0からをE1からに並べてドラックアンドドロップする。
DQS_CLK_2_060407.png


次にqをJ1からのピンにドラックアンドドロップする。(邪魔なので見やすくするため)
UCFを下に示す。

#PACE: Start of Constraints generated by PACE

#PACE: Start of PACE I/O Pin Assignments
NET "d<0>" LOC = "E1" ;
NET "d<1>" LOC = "E4" ;
NET "d<2>" LOC = "F4" ;
NET "d<3>" LOC = "F3" ;
NET "d<4>" LOC = "F2" ;
NET "d<5>" LOC = "F5" ;
NET "d<6>" LOC = "G5" ;
NET "d<7>" LOC = "G4" ;
NET "dqs" LOC = "E2" ;
NET "q<0>" LOC = "J1" ;
NET "q<1>" LOC = "J2" ;
NET "q<2>" LOC = "J3" ;
NET "q<3>" LOC = "J4" ;
NET "q<4>" LOC = "K1" ;
NET "q<5>" LOC = "K2" ;
NET "q<6>" LOC = "K3" ;
NET "q<7>" LOC = "K4" ;
NET "reset" LOC = "K5" ;

#PACE: Start of PACE Area Constraints

#PACE: Start of PACE Prohibit Constraints
CONFIG PROHIBIT = C3;
CONFIG PROHIBIT = E3;
CONFIG PROHIBIT = H1;

#PACE: End of Constraints generated by PACE


Processesウインドウから"Implement Design"を展開して"Place & Route"を展開し、"View/Edit Routed Design (FPGA Editor)"をダブルクリック。
そうすると論理合成、インプリメントをしてFPGA Editorが起動する。
Array1ペインで赤い線がDQSからBUFGMUXへ行く線だ。List1ペインにBUFGMUXがあるのがわかる。
DQS_CLK_3_060407.png


ISEで任意のパスのディレイを見る方法を参考にしてDQSからIOBのクロック入力までの遅延を見てみよう。Timing Analyzerの結果は6.498nsとかなり遅い。
DQS_CLK_4_060407.png


これでVHDLファイルの

architecture RTL of ff_test is
begin



architecture RTL of ff_test is
attribute buffer_type: string;
attribute buffer_type of dqs : signal is "ibuf";
begin


に変更する。dqsのバッファをibufだけにする設定だ。
これでコンパイルしてFPGA Editorで見てみる。赤い線で示した線がDQSからの配線だ。
DQS_CLK_5_060407.png


BUFGMUXを使っていないのがわかる。
Timing Analyzerで見てみると、4.344nsとだいぶ早くなった。
DQS_CLK_6_060407.png


まだ、下の図で赤い箱のDQSの配線が余計なところをまわって、下に行っている。下に行っている線はロングラインだが、そこに入るまでが、結構いろいろまわっている。このロングラインに直接行く配線はないようだ。
DQS_CLK_7_060407.png


同じVHDLファイルをVirtex2pro,XC2VP7-7fg456を使用してコンパイルしてみる。
FPGA Editorの結果を見ると、スパルタン3に比べて、よそに行っていないで自分のスイッチボックス(配線切り替え機)の中でロングラインに配線されている。
DQS_CLK_8_060407.png


Timing Analyzerで解析してみると
DQS_CLK_9_060407.png


1.771nsと速い。これはVitrex2proのスピードグレードが一番上でスパルタン3のスピードグレードが一番下のためもあるが、スパルタン3より2.573ns速い。
配線領域の関係でスパルタン3が不利になることもあるようだ。これは単にパッケージの違いかもしれないが、スパルタン3ユーザーはこのような不利な状況もあることも認識していたほうが良いと思われる。

Vitrex2proとスパルタン3のスピードの違いの割合を計算した、やはり基本的にスピードが速いのがほとんどだが、Vitrex2proの配線の割合を計算すると、配線が短い分少し速いようだ。

もう1つやっている上で疑問に思ったのだが、DQSの配線をみたFPGA EditorのArray1ペインで、不自然なほど下にdqs_IBUF配線が伸びているのわかると思う。
DQS_CLK_5_060407.png

これはD6とQ6のペアだ。他のDはD入力のIOBの中の入力用Dフリップフロップを使用しているが、D6とQ6のペアだけはD6は入力バッファだけを使用して配線にスルーして、Q6の出力用のDフリップフロップを使用しているようだ。他のと記述が違うわけでもないのにどうして違うのだろうか?疑問だ?
  1. 2006年04月07日 20:42 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:2

Spartan-3Eスタータキット

昨日、Spartan-3Eスタータキットが届いた。
あけてみると、Spartan-3スタータキットに比べてかなり大きな基板になっている。XC3S500Eの他にXC2C64AとXC2C256の2つのCool Runner-IIも載っている。
ただ、iMPACTで見たところSpartan3EとコンフィギュレーションROM、XC2C64Aしか見えなかった。XC2C256はUSBのコンフィギュレーション回路専用なのだろうか?
LANポートやらLCDやらも載っていて豪華な基板だ。これで18,000円とは信じられない。
これでDDR SDRAMコントローラのテストをしようと思っている。どういう風にテストをするかが問題だが、とりあえずスライドスイッチでデータを入れてDDR SDRAMに書き込んで、読み出してLCDに表示させようかと思っている。

週末はmixiの方から質問のあったDDR SDRAMの読み出しデータをDQSをクロックとして受ける場合にグローバルクロックをまわさないでローカル配線を使ってIOBのDFFを駆動する方法、(これは主にDQSをプリント基板の配線を使用してDQSをデータの真ん中までに遅延させる方法で使用できる)と今度の伝送線路シミュレーションの結果の時に考えたのだが、グローバルクロックをMUX(CLBのルックアップテーブル、マルチプレクサ)を使用して、任意の遅延をさせる方法を解説したい。?(希望、条件設定に時間がかかるので間に合うかは不明?)
できればFPGAのピンの配置による違いなども考察したい。
DQSをMUX(CLBのルックアップテーブル、マルチプレクサ)を使用して遅延させて、データをSRL16で受ける方法も考察したいが時間が足りないか。。。
Spartan3Eスタータキットもこんな苦労をしなくてもEDKで使えばDDRも簡単に使えるのだろうが、それじゃ○カチョン(放送禁止用語)だし。。。
MIG(Memory Interface Generator)使えばらくだと思われるがまだ成功していない。そのうちやってみよう。
  1. 2006年04月07日 12:53 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

伝送線路シミュレーションの解析に苦戦中

伝送線路シミュレーションが出てきたがその意味の解析に苦戦中だ。
クロックの伝送線路シミュレーション結果はこの前のブログに書いたし、きれいな波形にしなければいけないというので、どういう波形が必要がわかるため楽だった。
でもデータバスなどはFPGA,SDRAM,PowerPCの3つ一筆書きでつながっているので、端から真ん中のSDRAMにデータ転送する場合の波形が悪くなる。
タイミングのダイアグラムは考えてあったのだが、波形の乱れによって、だいぶマージンが減りそうだ。どのように計算したらよいかが良くわからないので困っている。おまけにクロックはフェーズシフトする予定なのでどの位置に来ればよいかがいまいちイメージがわかない。
データにクロックを重ね合わせて自分で見られれば一発なんだけど。考えすぎて胃が痛くなってきた。
一応、ターミネータをつけてもちょっと改善できないかどうかをやってみてもらえることになった。
やはりLVCOMSデータバス133MHzは反射が多いのか?スルーレートを変えるという方法もあるな。。。
でもあまりシミュレーションお願いしていると悪そうだし。。。ああ.....自分でやりたい。

それから伝送線路シミュレーションは67MHzのクロックでやっているが、例えばLVDS受信用ICだとLVDSで来た信号を受けてLVCOMSでクロックとデータを送ってくる。実際のデータはクロックのようには変化はしない。
そのクロックに対してデータの有効時間が仕様で指定されている。これがクロックの前、少なくとも2ns前から有効になっていると書いてあったら、伝送線路シミュレーションの立ち上がり、立下りから2ns付近の点で反射が起こってスレッショルド近くまで反射があったらまずいのだろうか?

いろいろ詳しく解析すると悩んでくるが、なるべく波形を改善してもらって作ってもらえばいいのだろうか?
LVDS受信ICの件は違うが、なまじクロックをシフトできると悩んでくる。
  1. 2006年04月04日 05:52 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:4

桜、でも奥さんまた風邪

上野の桜は満開らしいが、近くの運動公園の桜は3分咲きくらいだ。
今日は余り天気が良くないので花見とは行かないが、さらにうちの奥さんがまた風邪で寝込んでいる。
きのうミニバスの試合の審判をしてきた後、買い物に行って帰ってきたら寝込んでしまった。昨晩は39度くらい熱が出たようだ。
今日は日曜日でもやっている医院に行ってきたが、インフルエンザは治っているだろうから熱の出る風邪を引いたのだろうということだった。
もう年なのだからミニバスの審判は無理だろうといっておいたが、このところ調子悪いようだ。今日は奥さんは仕事だったが休んでしまった。
晩御飯の用意は私がしなくちゃいけなくなった。久しく作ってないけど、何が出来るかな? 豚肉のしょうが焼きでも作ろうか? そのくらいしか出来ないという話もある。

--------------------------------------------------
結局、しょうがが無かったので(しょうがない)、一番上のお姉ちゃんと一緒に豚肉とニラと玉ねぎを炒めた野菜炒めのような物を作りました。ちょっと塩辛くなってしまった。
味噌汁も玉ねぎとニラを入れて作ったが、一番下の娘が喜んでお替りしてくれたのでうれしかった。
  1. 2006年04月02日 18:43 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

高速?(133MHz)クロックの配線について

今の基板のクロックの配分は水晶発信器からFPGAへ入力し、FPGAのDCMを使って0ディレイで、その他のデバイスに供給している。
そのやり方はVirtex2pro users guide ver.4.0の91ページに図がある。下に転載する。
DCM_ext_out_1_060331.png


このように出力したクロックを他のデバイスに供給するが、またFPGAの入力に戻しフィードバックをかけ、ディレイをキャンセルする。
Spartan3でもXAPP462(v1.0)の31ページに外部クロック信号でのスキュー削減方法が載っている。下に図を転載する。こちらは外部バッファのディレイもキャンセルして良いようだ。
DCM_ext_out_2_060331.png


このようにしてプリント基板でクロックを分配することにする。分配するのはSDRAM4個とPowerPCだ。
初めにFPGAの1つの出力からフィードバック(FB)と全てのデバイスにクロック(133MHz)を供給することにする。トポロジーは一筆書き。PowerPCへのクロック配線はセットアップ時間の関係から約7cm(400ps)余計に長さを増やしてデータより遅延させることにする。以下の図ではダンピング抵抗と水晶発信器を省略してある。
CLK_dist_toplogy_1_060331_.png


上図でクロック出力は緑の点、クロック入力は赤の点だ。FPGA内にはDCMを最上図のFigure3-23に様に実装する予定だ。シミュレーション時に、これだと特に真ん中のSDRAMの波形が乱れ、波形がなくなってしまうような感じになるようだ。この辺のトポロジーをいろいろ変えてもらったが、やはりだめだった。やはり後ろのPowerPCの負荷が重いとのことだったので、PowerPCだけ専用のDCMを使用することになった。これだとDCMを2個使用することになる。それは出力を2つ出すとFPGA内の配線ルートが異なるので内部遅延が異なり、FBがかかっているクロック出力とそうでないのとで、クロックの位相が変化してしまうからである。
そこでDCMを2つに増やして負荷を減らし波形の改善を試みる。さらにSDRAMだけになったので分岐配線にした。
CLK_dist_toplogy_2_060401.png


今度はPowerPCへの配線に余分な長さはない。波形も乱れるし専用DCMなので位相をシフトして辻褄を合わせることにする。
FPGAの出力プロパティはFastの24mAだが、SDRAMは負荷が重いのか波形の立ち上がり、立下りがかなりなまっている。SDRAMの規格からCLK High time、CLK low timeは両方とも2.5nsだが、CLK low timeの方は規格に入らない。
そこで仕方が無いので、DCMを3個使うことにしてSDRAMを2個ずつに分けることにした。
CLK_dist_toplogy_3_060401.png


これでシミュレーションによる波形もだいぶ良くなり、これで行くことになった。DCMを3個も使用することになってしまったが。。。
FPGA出力1個に付きSDRAM1個負荷のシミュレーションもしてもらったが、さらに立ち上がりが良くなっていた。これが理想なのだが、ちょっと無理である。

これは余談だが、DDR SDRAMコントローラのタイミングを書いた文書ftp://ftp.xilinx.com/pub/applications/misc/ar19385.pdfの3ページ目の図にもあるがIOBのDDRレジスタで送信クロックを生成している。こうするとFPGA内部のクロックに対してもDDRレジスタなどの遅延が発生するが、これらの遅延をDCMにフィードバックすることによってキャンセルすることが出来ないだろうか?
キャンセルすることが出来れば、IOB間のスキューは残るがDCM1個でSDRAM1個に対して1個のピン(IOB)を割り当てられるのではないか?
具体的には下の図のような構成である。
CLK_dist_toplogy_4_060401.png


上図は水晶発信器からDCMのCLKINに入力してCLK0出力からBUFGを通しグローバルクロックラインを使ってFDDRRSEのクロックに入力する。FDDRRSEのD0に1をD1に0を入れておくと入力クロックと同じクロックが出力に出る。それを5つ並べてそのうちの4つのFDDRRSEの出力をSDRAMのクロックとして出力する。残りの1つのFDDRRSEの出力は一旦FPGAの外に出して、もう一度グローバルクロック入力から入れてDCMのCLKFBにフィードバックする。
そうすると、うまく動けば入力クロックと同期したクロックがSDRAMへ出力できるはずだ。グローバルクロックラインのスキューがあるが、1個のDCMで4個のSDRAMへのクロックが同期できるはずだ。
ただしこれは構想だけで確かめたことは無いから動くかどうかわからない。
誰か確かめた人がいらしたら教えてください。
自分でも、今度の基板は3個のDCMを使う構想だが、うまく動いたら一番下の図のようにDCMを1個減らして試してみようと思う。
  1. 2006年04月01日 06:17 |
  2. プリント基板の作成過程
  3. | トラックバック:0
  4. | コメント:7