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

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

FPGAの部屋

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

PSXが壊れた

昨日PSXでメモリスティックデュオにコピーしようとしたらPSXが壊れていた。
電源を入れると最初のPSXのロゴは出るのだがその後真っ暗になる。
今日ソニーのサポートに電話したら、その症状だとハードディスクが壊れているそうだ。修理代は2万5千円くらいかかるようだ。
かなり高いが仕方がない。PSXが壊れるとPS2とDVDレコーダー両方買わなくちゃいけないので値段が張る。複合機はこういうところが良くない。壊れると影響が大きい。
明日引き取り修理に来てもらうことにした。さてどのくらいで戻ってくるだろう?
  1. 2006年07月31日 20:55 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

夏休み自由研究サポート企画1日目

今日は夏休み自由研究サポート企画の1日目だ。
中学1年生にフリーソフトを使用して音の波形を見せる企画だ。説明する手順を書くと。

1.最初音とは何かを説明して、周波数、周期を説明する。
2.それを説明していると飽きてくるので、フリーソフトをダウンロードしてインストールして設定を実際にやってもらう。
3.その後自分の”あ”の音声波形を録音して波形を見てもらう。
4.そこでピッチを説明して、計り方を教える。再度再生して自分の声を聞かせる。
5.ボイスチェンジャーの使い方を説明する。”われわれは宇宙人だ”を録音してボイスチェンジャー2倍にするとかなり受ける。後は自分の声の母音を見てもらう。
6.あ行以外の子音+母音を録音して波形を見る。
7.リコーダーの音を録音して周波数を確認する。ドから上のドまで。上のドは下のドの2倍の周波数になっていることを確認する。
8.いろいろな楽器、打撃音などの波形を見る。


という手順で説明する。昨日はどうも早く終わったなと思っていたら6.を飛ばして子音の波形を見せるのを忘れてしまった。申し訳ないことをした今日もあるので今日は忘れないようにしたい。
難しいのはあまり難しいことばかり(そんなに難しくはないのだが)やっているとお通夜みたいになってしまって、教えているほうも盛り下がってしまう。そこで、難しいことを教えたら次は受け狙いのねたを披露しなくてはいけないということだ。
ボイスチェンジャーで声を変えたり、逆転再生での逆さ言葉は結構受けを取れるので重宝している。
  1. 2006年07月30日 05:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

ブラックベリーの収穫

今朝は庭の花壇のブラックベリーを収穫した。今年はブラックベリーが大豊作だ。
blackberry_1_060729.jpg

こんなふうにブラックベリーがなっている。黒くなって熟した実はとった後だ。赤くなってから黒くなる。
blackberry_2_060729.jpg

ズームするとこういう風だ。
blackberry_3_060729.jpg

黒い実を食べるとワインに近いような濃いぶどうジュースを飲んでいるような味だ。
収穫した実は今日全部ジャムになる予定だ。
  1. 2006年07月29日 21:03 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

TED Processor Seminar 2006 (06/07/21)

今日はTED Processor Seminar 2006 (06/07/21)に申し込んだ。
あまりエンベデッドプロセッサにあまり興味はないのだがImpluse Cの実力とか、ハードとソフトの協調設計、ハードウェアによるアクセラレーションとかに興味がある。
せっかく行くのだから、ブログでコメントいただいている方等が行かれるのであれば、昼食の間にでもお会いしてお話できたらな。。。と思っている。その場合は何か目印をつけておくか?帽子をかぶっているとか?でも室内ではおかしいね。それとも薔薇の花をつけているとか。。。(笑)

でも、私が当日キャンセルとなる可能性もある。前の日に人間ドックなので、もしかしたら具合が良くないかもしれないのだ。いつも胃の内視鏡なのだが、負担が大きいので終わると寝込んでしまうこともあるのだ。
  1. 2006年07月28日 21:02 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:3

夏休み自由研究サポート企画

今度の土日は中学生対象の夏休み自由研究サポート企画があるので準備に追われている。
今年も変わらずにソフトを使用してパソコンで音声やいろいろな音の波形を見てみようという企画を行う。今年は中学1年生ばかりだ。理科で音を習ったばかりというのもあると思う。
昨年はやはりボイスチェンジャーが一番受けた。逆さ言葉も結構面白い。おはようをローマ字で書いて(Ohayo)それを逆から読んで録音し逆転再生するとアクセントはおかしいがおはように聞こえる。
去年、太陽電池でニッケルヘリウム電池を充電しておもちゃやゲームを何時間できるかという自由研究をやっていた。これは充電池の放電特性が問題でうまく実験結果がそろわなかったので止めることにした。コンデンサなどでやればよいのだろうが、充電池だとうまく行かなかった。
今日は準備、テキストを作らなければ。。。
  1. 2006年07月28日 05:32 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Chipscopeの観測する信号をつなぎ直す

Chipscopeは非常に便利なツールだが少なくともネットリストにChipscope回路を付加するので再度インプリメントしなくてはならない。インプリメントが数分で終わればよいが数時間かかることもある。その場合にはChipscopeの観測する信号を変更するだけで数時間かかることになる。事実数時間かかるのであきらめて違うことをしていた。
Chipscopeの観測する信号をお手軽につなぎなおせないかといつも考えていたがFPGA Editorでお手軽につなぎなおせることを発見した。
検証回路はこの前のSpartan3E Starter KitのDDR SDRAMコントローラである。これにChipscopeをかけてFPGA Editorでお手軽につなぎなおしてみる。
S3E_DDRC_060725.jpg

写真に示す通りにB09Aを読み書きしてみる。下8ビットの2進数で表した値は"1001 1010"ということを覚えておいてほしい。
最初にChipscope Core Inserterで22本のデータ、20本のトリガを設定する。
Chipscope_signal_ex_1_060725.png

次にインプリメントをしてChipscope Analyzerで信号を観測してみる。
Chipscope_signal_ex_2_060725.png

dq_fall<5>~dq_fall<0>を見ると"01 1010"となっていてデータが読めている。このdq_fall<5>とdq_fall<4>をdq_fall<7>とdq_fall<6>につなぎなおしてみる。
まずはFPGA EditorをISEから起動する。(いままで大分やってきたのでわかるだろう)次にFPGA Editorの使い方3等を参考にFPGA EditorをRead/Writeモードに設定しよう。 そうしたらToolsメニューからILA...を選択する。
Chipscope_signal_ex_3_060725.png

ILAダイアログが開くので、データ20のdq_fall<5>を選択し、Change Net...ボタンをクリックする。
Chipscope_signal_ex_4_060725.png

ILA Netダイアログが開く。"*dq_fall<7>*"で検索すると、下のペインにdq_fall<7>が出てくるので選択する。その後OKボタンをクリックする。
Chipscope_signal_ex_5_060725.png

そうするとdq_fall<7>につなぎ直されている。
Chipscope_signal_ex_6_060725.png

dq_fall<6>も同様につなぎ直す。
Chipscope_signal_ex_7_060725.png

ILAダイアログの下の2つのチェックボックスにチェックを入れると関連するネットとコンポーネントがArrayウインドウとWorldウインドウでハイライトされる。
Chipscope_signal_ex_8_060725.png

次にBITファイルを生成しよう。ILAダイアログでBitgen...ボタンをクリックするとRun Bitgenダイアログが開く。bitファイルの名前と-wオプションを入れる。-wオプションを入れるのはこれを入れないと.DRCファイルがオーバライト出来なくてエラーになることがあるためだ。
Chipscope_signal_ex_9_060725.png

そうそう次に.CDCファイルを書いておこう。これはChipscopeがどこを観測しているかが書いてあるテキストのファイルだ。後でChipscope Analyzerでインポートできるはずだ。(でも、Chipscope Analyzerでインポート出来なかった。直接出来ればよいのに。。。)
Chipscope_signal_ex_10_060725.png

これでBITファイルが出来たので再度Chipscopeから基板にBITファイルを流し込もう。Chipscope AnalyzerのDeviceメニューからDEV:0を選択、さらにConfigure...を選択する。
Chipscope_signal_ex_11_060725.png

BITファイルの名前は同じにしておいたので、そのままOKボタンをクリックする。
Chipscope_signal_ex_12_060725.png

そうすると今FPGA EditorでつなぎなおしたBITファイルがFPGAにダウンロードされる。次に先ほどFPGA Editorで生成したCDCファイルのインポートを試みるがインポートできなかった。
Chipscope_signal_ex_13_060725.png

今の信号名のままChipscopeで信号を観測してみると先ほどのdq_fall<5>,dq_fall<4>は"01"だったが、今回は"10"となってdq_fall<7>,dq_fall<6>につなぎかえられたことが確認できた。
Chipscope_signal_ex_15_060725.png

これで何時間もかからずにお手軽にChipcopeの観測信号をつなぎかえることが出来た。CDCファイルをインポートできなかったことがちょっと残念だが、テキストファイルなので該当する部分をテキストエディタでコピペすればOKだと思われる。(まだやっていないけど。。。)
  1. 2006年07月25日 21:11 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:2

ISERDES,OSERDESのその後

ISERDES,OSERDESはこの前のファイルではうまく行っていないが、面白いことがわかった。もうすでに皆さんご存知かもしれないが、Virtex4の入力用DDRレジスタが入っているILOGIC、出力用DDRレジスタが入っているOLOGICはそのままISERDES,OSERDESのようだ。入力用DDRレジスタ、出力用DDRレジスタはISERDES,OSERDESの機能の一部を使っているのだろう。
まず、以前IDDRを使用してみたときのファイルで確かめてみるとinput<7>が"V12"ピンに割り当たっている。
ISERDES_test2_1_060722.png

このq1_7_OBUFをダブルクリックしてみると入力用DDRレジスタのインスタンスが見える。
ISERDES_test2_2_060722.png

これを"U15"に移動して、"V12"の空のOLOGICをダブルクリックして見てみると。
ISERDES_test2_3_060722.png

ISERDES_test2_4_060722.png

そうするとISERDESになっている。空のOLOGICを見てみると同じようにOSERDESが見える。
ISERDES_test2_5_060722.png

という訳でIOピンには全部ISERDES,OSERDESが付いているのでは?
まさか全ピンにISERDES,OSERDESが付いているとは思わなかった。(本当ならば)それでVirtex4は小さいデバイスにピン数の多いものがなかったのかもしれない? IOの論理素子が多すぎで小さいチップではたくさんのIOをつけられないのかも??? さすがXilinxどれも同じ機能にするのが好きなようだ。Alteraだと間違いなく専用ピンだろうな?
ISERDES,OSERDESについては入出力などを直接IOピンにアサインできないかもしれないので要検討。。。
  1. 2006年07月22日 21:55 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

現在のオンチップバス仕様

現在の小さい基板のオンチップバスはコマンドバスとデータ関連に分かれている。
コマンドバスは言わばアドレスバスのようなものでスレーブモジュールを指定してデータ転送をするためにコマンドをマスタが送るバスだ。DMAだけは特殊でソース用とディスティネーション用に2回コマンドを送る。PCIマスタとNBL Controllerは送りと受けに分かれている。マスタはSystem Arbiterにお伺いを立ててGNTがアサートされたらコマンドを出力する。
OCB_1_060720.png

データ関連パスはデータ64ビットと双方向のREADYとバイト・イネーブルなどで構成されるが、データパスにはFIFOが入っている。(System Arbiter) 大体はデータをバーストでデータ転送する。
OCB_2_060720.png

問題はコマンドを1つしかスレーブモジュールが受けられないところだ。処理の途中にコマンドが来ると狂ってしまう。(System Arbiterで調停しているので正常に動く)
あまり詳しく書くとまずいのでこれくらいにするがとにかくブロックしなければいけないのが問題だ。(どのくらいパフォーマンスに関係するかは別問題)
解決方法は複数考えられるので一般的にはどうしているか知りたいと思っている。バスプロトコルではなくてもう1つ上のレベルの問題かもしれないが。。。
  1. 2006年07月20日 21:45 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

基板がやっと製作できる

永く懸案になっていた仕事の次期主力基板がやっといろんな問題をクリア?(していないかもしれませんが。。。)作ってもらえることになった。とりあえず良かった。大分妥協したところもあるが、これで1つやまを越したといえる。
基板が出来上がってきたらデバックが始まるので忙しくなるだろう。配線ミスがなくて1発で動くと良いが。。。ドキドキだ。。。
最初は今までの回路をカスタマイズして載せることになっていて、もうすでに小さい基板の方は出来上がっている。大きい基板の方は配線遅延値を聞いてUCFファイルにセットアップ時間を設定するだけだ。ほとんど出来上がっているが、バスの動作周波数は本来の動作周波数の半分だ。とりあえずこれで動作するかどうかテストしたい。
本来の動作周波数にするには回路の全面的な書き換えが必要になる。現在の回路はレイテンシを最小にするために動作周波数ぎりぎりにパイプライン化するようにしたために、書き換えて動作周波数を倍にするには厳しい。よって全面書き換えしようと思っている。
今回作る上でのオンチップバスはAMBAかOCPに準拠しようと思ったが、OCPはメンバーにならないと仕様書ダウンロードできないようだ。AMBAをダウンロードして仕様を見ているが前回使用した独自オンチップバスに戻すかもしれない。
独自オンチップバスの欠点はバスがどのリソースを使用しているかの情報を持っていたので、例えばマスタモジュールからスレーブモジュールへデータ転送した時にマスタモジュールだけ転送が終了しても開放できなくてブロックし続けてしまっていることだ。その辺を改良してバスがスレーブモジュールにコマンドを出してデータ転送する等の仕様にしたい。
いずれにせよ、早くオンチップバスの仕様を固めないと各モジュールを設計できないことになる。
  1. 2006年07月20日 05:28 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

息子の入院2

最近はFPGAの話題から遠のいてしまったが、これもまた仕方がない。ISERDESやOSERDESを探ってはいる。まとまったらブログに書きたい。
さて、今日も息子の病院に昼休みと夕方行ってきた。
咳をしないで動かなければ問題ないようだ。咳をすると10分くらい腰が痛くて苦しんでいるが。。。
基本的に変化はないが前より少しは元気が出てきたようだ。
病院ではテレビは頼んでいないが、(テレビは備え付け料金制ではなくレンタル制)PSPギガパックを買ってあるのでメモリスティックにアニメを録画して持って行っている。1GBだと約2時間入るのでアニメ4本というところだ。
これでは少ないので2GBを買い足すことにした。1万1千円だった。購入してからITメディアで偽物メモリスティックの記事を読んだ。
http://www.itmedia.co.jp/news/articles/0607/18/news071.html
こりゃ大変と問い合わせのメールを出したら、ソニーから仕入れているので大丈夫ですというメールが届き、一安心した。

メモリスティックにPSXからダビングして持っていくのだが、アニメ4本で7時間以上かかる。いくらエンコードに時間がかかるといってももう少し早くなると良いと思う。
  1. 2006年07月19日 23:00 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ISE8.2iをインストールしました

ISE Webpack 8.2iが出ていたので早速インストールした。SP1も出ていたのでそれもインストールした。
早速、Virtex4のISERDESとOSERDESのテストプロジェクトを再度インプリメントしてみたところ、同様にだめだった。何かISERDESやOSERDESを使っているサンプルを見て使い方を確認しなくてはだめなようだ。
今のところ日本語は正常に表示されている。後の違いはまだ良くわからない。アップデート項目を確認しておかなくては。。。
  1. 2006年07月18日 21:55 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:0

息子の入院

今日息子が腰の怪我で入院した。
今日は大学病院の診察の日だったが、立ち上がれず、仰向けに寝たきりで動かすと凄く痛がるので、担架でもないと病院に連れて行けなかった。そこで、救急車で運んでもらった。
救急処置室で先生に入院するかと聞かれたので、否応なく入院することにした。
胸のレントゲンをとり(結核とかになっていないかの確認だと思う)病棟へ行った。
いろいろ吸い飲みやふりかけ、水などを買っておいてきたが、小学校6年生なので一人で病院にいられるかどうかが問題だ。しかし、病状はそれを許さないのでしょうがない。親としてもおいてくるのが、後ろ髪を引かれるようだった。
近いので昼休みと仕事帰りによってこようと思う。なるべく早く退院できることを祈るのみだ。
  1. 2006年07月18日 21:40 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

パソコンの修理依頼

DELLのパソコンが壊れたと高校の時からの友人から電話があったので、行ってみてみることにした。事前の話では画面がグニャグニャでWindowsが立ち上がらないとのことだった。セーフモードでもだめだとのことなので、これはパソコン終わりかなと思って、一応CDブートができたときにデータバックアップするためにKNOPPIX(Linux)の5.0.1をダウンロードしてCDに焼いた。
これで、KNOPPIX(Linux)の5.0.1をあげてUSBメモリにハードディスクをバックアップできると思った。(ハードディスクが生きていればね!!)
それで行ってみたら、BIOSの画面にごみがいっぱい表示される。一定の模様みたいのが繰り返されている印象。BIOSセットアップも途中で止まってしまう。これはおかしい。修理決定かなとちょっと思う。
よく聞いてみると、パソコンを移動してからこうなったそうだ。ためしにパソコンの中をあけて、メモリとPCIバスのカードを2回ずつ抜きさしてもう一度入れてみた。そしたらどうだろう。見事にWindowsまで立ち上がった。
やはり、メモリのさし方がおかしくて移動の振動で動作が不良になったのだろう。コネクタで接触しているものはそういう現象がたまにある。

たとえば、以前の私のパソコンはAGPのコネクタが接触不良になって、BIOSもあがらなくなってしまったことがあった。結局その時は原因がわからずに新しいパソコンを買ってしまった。その後以前のパーツを流用しようとして、グラボを抜き差ししたら直ってしまった。そのように悲しい体験をしているのでわかったと自負している!!!
PCIバスが刺さっているのに接触不良でコンフィギュレーションサイクルに正常応答しないとデッドロックしてしまうBIOSもあるようだ。(というか、PCIカードでDEVSELアサート出来てIRDYやTRDYが接触不良だったら確実にデッドロックじゃないか?でもマスタアボートか?それよりSTOPアサート固定かな?)だから、そういう症状の時はカード、メモリ類を挿しなおすのが良いと思われる。
  1. 2006年07月16日 21:09 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:0

Virtex4のOSERDESのお勉強

今度はVirtex4のOSERDESをインスタンスしてみたがやはりISERDESと同じだった。やはりTranslateで原因不明で停止してしまう。
ISERDESと同様にユーザーズマニュアルからコードを持ってきてある。

OSERDES_test_1_060715.png

やはり下のVHDLファイルで論理合成は出来たが、Translateでエラーが出ているがエラーリポートが出てこないので原因がわからなくて困っている。

library ieee;
use ieee.std_logic_1164.all;

library unisim;
use unisim.vcomponents.all;

entity OSERDES_test is
    port(
        user_oq: out std_ulogic;
        user_shiftout1: out std_ulogic;
        user_shiftout2: out std_ulogic;
        user_tq: out std_ulogic;
        user_clk: in std_ulogic;
        user_clkdiv: in std_ulogic;
        user_d1: in std_ulogic;
        user_d2: in std_ulogic;
        user_d3: in std_ulogic;
        user_d4: in std_ulogic;
        user_d5: in std_ulogic;
        user_d6: in std_ulogic;
        user_oce: in std_ulogic;
        user_rev : in std_ulogic;
        user_shiftin1: in std_ulogic;
        user_shiftin2: in std_ulogic;
        user_sr : in std_ulogic;
        user_t1: in std_ulogic;
        user_t2: in std_ulogic;
        user_t3: in std_ulogic;
        user_t4: in std_ulogic;
        user_tce: in std_ulogic
    );
end OSERDES_test;

architecture RTL of OSERDES_test is
--Example OSERDES Component Declaration
component OSERDES
    generic(
        DATA_RATE_OQ: string:= "DDR";
        DATA_RATE_TQ: string:= "DDR";
        DATA_WIDTH: integer:= 4;
        INIT_OQ: bit:= '0';
        INIT_TQ: bit:= '0';
        SERDES_MODE: string:= "MASTER";
        SRVAL_OQ: bit:= '0';
        SRVAL_TQ: bit:= '0';
        TRISTATE_WIDTH: integer:= 4
    );
    port(
        OQ: out std_ulogic;
        SHIFTOUT1: out std_ulogic;
        SHIFTOUT2: out std_ulogic;
        TQ: out std_ulogic;
        CLK: in std_ulogic;
        CLKDIV: in std_ulogic;
        D1: in std_ulogic;
        D2: in std_ulogic;
        D3: in std_ulogic;
        D4: in std_ulogic;
        D5: in std_ulogic;
        D6: in std_ulogic;
        OCE: in std_ulogic;
        REV : in std_ulogic;
        SHIFTIN1: in std_ulogic;
        SHIFTIN2: in std_ulogic;
        SR : in std_ulogic;
        T1: in std_ulogic;
        T2: in std_ulogic;
        T3: in std_ulogic;
        T4: in std_ulogic;
        TCE: in std_ulogic
    );
end component;
begin
    U_OSERDES : OSERDES
    Port map (
        OQ => user_oq,
        SHIFTOUT1 => user_shiftout1,
        SHIFTOUT2 => user_shiftout2,
        TQ => user_tq,
        CLK => user_clk,
        CLKDIV => user_clkdiv,
        D1 => user_d1,
        D2 => user_d2,
        D3 => user_d3,
        D4 => user_d4,
        D5 => user_d5,
        D6 => user_d6,
        OCE => user_oce,
        REV => user_rev,
        SHIFTIN1 => user_shiftin1,
        SHIFTIN2 => user_shiftin2,
        SR => user_sr,
        T1 => user_t1,
        T2 => user_t2,
        T3 => user_t3,
        T4 => user_t4,
        TCE => user_tce
    );
end RTL;


Virtex4のLX,SX,FXと全てやってみたがだめだった。
情報を持っている方は教えてください。アンサーサーチにもなかったので。。。
  1. 2006年07月15日 19:06 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

PeggyのPSMファイル用KWDファイル(アップデート)

PeggyでPicoBlaze用アセンブラ.psmファイルを色分け表示する.kwdファイル(ac_psm.kwd)アップデートしたので公開しようと思います。
相変わらず手抜きですが、COMPAREをキーワードに入れるのを忘れていたのと、Assembler Directivesを加えて、レジスタs?を色分けするようにしました。少しましになったとは思います。
ファイルはここにあります。
これをac_psm.kwdという名前でProgram Files\Anchor\shareフォルダの中にセーブしてください。
例によって保証はしませんので、自己責任でお使いください。
  1. 2006年07月14日 22:15 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Virtex4のISERDESのお勉強

気を取り直して、Virtex4のISERDESのお勉強をしてみたが今のところTranslateで原因不明で止まってしまっている。
Virtex4のユーザーズマニュアルのサンプルをほとんどそのまま転載しているが一部論理合成を通らなかったので修正してある。やはり入力ポートは何らかの入力を入れないとエラーになる。
ISERDES_test_1_060714.png

下のVHDLファイルで論理合成は出来たが、Translateでエラーが出ているがエラーリポートが出てこないので原因がわからなくて困っている。

library ieee;
use ieee.std_logic_1164.all;

library unisim;
use unisim.vcomponents.all;

entity ISERDES_test is
    port(
        data_output : out STD_LOGIC;
        Q : out STD_LOGIC_vector(5 downto 0);
        BITSLIP : in STD_LOGIC;
        CE : in STD_LOGIC;
        CLK : in STD_LOGIC;
        CLKDIV : in STD_LOGIC;
        data_input : in STD_LOGIC;
        DLYCE : in STD_LOGIC;
        DLYINC : in STD_LOGIC;
        DLYRST : in STD_LOGIC;
        rst : in STD_LOGIC
    );
end ISERDES_test;

architecture RTL of ISERDES_test is
component ISERDES
    -- synthesis translate_off
    generic (
        BITSLIP_ENABLE : string := "FALSE"; --(TRUE, FALSE)
        DATA_RATE : string := "DDR"; --(SDR, DDR)
        DATA_WIDTH : integer := 4; --(2,3,4,5,6,7,8,10)
        INTERFACE_TYPE : string := "MEMORY"; --(MEMORY, NETWORKING)
        IOBDELAY : string := "NONE"; --(NONE,IBUF,IFD,BOTH)
        IOBDELAY_TYPE : string := "DEFAULT"; --(DEFAULT,FIXED, VARIABLE)
        IOBDELAY_VALUE : integer := 0; --(0 to 63)
        NUM_CE : integer := 2; --(1,2)
        SERDES_MODE : string := "MASTER"; --(MASTER, SLAVE)
    );
    -- synthesis translate_on
    port (
        O : out STD_LOGIC;
        Q1 : out STD_LOGIC;
        Q2 : out STD_LOGIC;
        Q3 : out STD_LOGIC;
        Q4 : out STD_LOGIC;
        Q5 : out STD_LOGIC;
        Q6 : out STD_LOGIC;
        SHIFTOUT1 : out STD_LOGIC;
        SHIFTOUT2 : out STD_LOGIC;
        BITSLIP : in STD_LOGIC;
        CE1 : in STD_LOGIC;
        CE2 : in STD_LOGIC;
        CLK : in STD_LOGIC;
        CLKDIV : in STD_LOGIC;
        D : in STD_LOGIC;
        DLYCE : in STD_LOGIC;
        DLYINC : in STD_LOGIC;
        DLYRST : in STD_LOGIC;
        OCLK : in STD_LOGIC;
        REV : in STD_LOGIC;
        SHIFTIN1 : in STD_LOGIC;
        SHIFTIN2 : in STD_LOGIC;
        SR : in STD_LOGIC
    );
end component;
-- Component Attribute specification for ISERDES
-- should be placed after architecture declaration but
-- before the "begin" keyword
attribute BITSLIP_ENABLE : string;
attribute DATA_RATE : string;
attribute DATA_WIDTH : integer;
attribute INTERFACE_TYPE : string;
attribute IOBDELAY : string;
attribute IOBDELAY_TYPE : string;
attribute IOBDELAY_VALUE : integer;
attribute NUM_CE : integer;
attribute SERDES_MODE : string;
signal logic0, logic1 : std_logic;
begin
    logic0 <= '0';
    logic1 <= '1';
    
    U1 : ISERDES
    -- synthesis translate_off
    generic map (
        BITSLIP_ENABLE => "FALSE", --(TRUE, FALSE)
        DATA_RATE => "DDR", --(SDR, DDR)
        DATA_WIDTH => 6, --(2,3,4,5,6,7,8,10)
        INTERFACE_TYPE => "MEMORY", --(MEMORY, NETWORKING)
        IOBDELAY => "NONE", --(NONE,IBUF,IFD,BOTH)
        IOBDELAY_TYPE => "DEFAULT", --(DEFAULT, FIXED, VARIABLE)
        IOBDELAY_VALUE => 0, --(0 to 63)
        NUM_CE => 1, --(1,2)
        SERDES_MODE => "MASTER", --(MASTER, SLAVE)
    );
    --synthesis translate_on
    port map (
        O => data_output,
        Q1 => Q(0),
        Q2 => Q(1),
        Q3 => Q(2),
        Q4 => Q(3),
        Q5 => Q(4),
        Q6 => Q(5),
        SHIFTOUT1 => open,
        SHIFTOUT2 => open,
        BITSLIP => bitslip,
        CE1 => ce,
        CE2 => logic1,
        CLK => clk,
        CLKDIV => clkdiv,
        D => data_input,
        DLYCE => dlyce,
        DLYINC => dlyinc,
        DLYRST => dlyrst,
        OCLK => logic0,
        REV => logic0,
        SHIFTIN1 => logic0,
        SHIFTIN2 => logic0,
        SR => rst
    );
end RTL;



OSERDESの方を先にやってみることにする。
  1. 2006年07月14日 19:56 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

息子の腰の怪我2

今日は大学病院に行ってステロイドの注射を打てきた。帰ってきて今までと同様だったので、午後から仕事に行ったが、帰ってきたら具合が悪くなっていた。
声を出しても痛くなったとのことで、声も出せず、当然トイレにもいけないのでコーラのペットボトルを加工して尿瓶にした。
大学病院に電話しても今日は循環外科の先生しか当直がいないので入院できないそうだ。ちょっと納得がいかないがしょうがない。
明日は動くことが出来ないので救急車を呼んで連れて行こうと思う。良くなるまで入院できるように頼んでみようと思う。
  1. 2006年07月13日 20:49 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4

息子の腰の怪我

息子が腰に怪我をして7月から小学校に行っていない。きのうも大学病院に行ってきた。非常に心配だ。いろいろ医者に行ったが、やっと話を聞いてくれて、真剣に考えてくれるお医者さんに出会った様だ。やっと直る可能性が出てきて本当にうれしい。さすがに大学病院だと思った。
カイロプラクティックも針も行ったが一向に良くならなかった。神経にダメージを受けたレアなケースだろうとのことだった。とにかく咳をしても腰が痛いようだ。
良い医者を知り合いの体育教員の方に問い合わせるためのメールを編集してみたので、下に載せてみる。そういうわけでFPGAの勉強のほうもはかどらない。

息子の症状
息子は小学校6年生、12歳です。
状況は5月4日の夜に小学校2年生の娘が6年生の息子をおんぶして、後ろにひっくり返りました。その際にパソコン用いすの足の部分(5本足でキャスター付きで角がとがっていました)に腰を強打しました。娘と息子の2人分の体重が1点にかかってしまったようです。患部は右腰で、右わき腹に出ている腰骨の突起と左わき腹の突起を結ぶ線の右から1/4位の位置の少し上の骨の平らな部分です。ゴールデンウィークのため医者がやっていなかったので、ゴールデンウィーク明けにいつもかかっている整形の開業医に行きました。レントゲンを取ってみたところ骨には異常がないのでそのうちに直るだろうということで、暖めるリハビリや電気のリハビリに通っていました。右足に体重をかけると痛いので松葉杖での歩行です。このときはいすに座るのは支障がなく松葉杖で学校に行っていました。
3週間ほど経ったころ、どうにも直りが遅いので、(このときには体重計での測定で5Kg程度しか体重が右足にかけられませんでした)K病院を紹介してもらって詳しく検査してもらいました。その結果、レントゲン、CT、MRIの結果やはり骨には異常がなく、わずかに血種が出来ているとのことでした。そのときは痛み止めやはり薬をもらって帰ってきました。
その後なかなか良くならないで、松葉杖の生活が続きました。それでもわずかずつでも右足にかけられる体重が増えて行ってはいました。
6月24日に見てもらったK病院の先生にハッパをかけられて松葉杖をはずして、歩幅は右足をかばっていますので少ないいですが、少しずつ自分で歩くようになって来ました。
そこで土曜日(7月1日)にリハビリに良いかと思いプールに連れて行きました。1時間弱プールで泳いだり、歩いたりして帰ってきたところ夜に腰が痛くなって、今度は立つことも座ることもできないようになってしまいました。座るのも1分くらいしか我慢できないようなので、食事の際も少し座って食べては、いすに横になって痛みが軽減するのを待って食べています。
7月3日月曜日にK病院に行って診察を受けました。(いつも受診している先生ではなく別の先生です)そのときの診断はいつも動かしていない筋肉を使ってので筋肉痛になったのでしょうということでした。そして痛み止めをもらってきました。(ロキソニン)しかし、痛み止めは効きませんでした。
その後、やはり1分くらいしか座っていられないので筋肉痛ではおかしいと思いました。
7月5日(水)にK病院にいってきました。その結果、CTを取ってもらってやはり骨には異常ないとのことでした。右腰の筋肉が萎縮しているとのことでした。今度はK病院のリハビリを受けてみろということで昨日からリハビリを始めています。
7月8日土曜日にまたK病院にいってきましたが、担当の整形外科医は何が原因だかわからないといっていました。過去に例がないそうです。精神科と小児科をかかった方が良いといわれました。なんだか息子を痛くないのに痛いといっていると疑っているようです。一応もう2週間リハビリをするということになりました。
リハビリを担当している理学療法士の方もリハビリといっても相当痛がるので首をひねっている状態です。
やはり、息子も少し痛みをオーバーに表現している可能性はあると思いますが、痛くないということはないと思っています。今日もうつぶせに家で寝ていて、ズボンをはきかえることも痛くて出来ません。右足を曲げると相当痛がります。
  1. 2006年07月12日 05:30 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Virtex4のFIFO(FWFTモード)

今度はVirtex4のFIFOのFWFT(First Word Fall Through)モードについて考察してみたい。
FWFTモードはemptyが0になった時にdo(data out)に最初のデータが出ているモードだ。バーストする場合はこのモードのほうが私は作りやすいのでVirtex2などの時もなるべくFWFTモードのFIFOを自作して使っていた。DDR SDRAMのFIFOもすべて分散RAMプリミティブを使ってFWFTモードのFIFOを構成している。特にアドレスFIFOはバーストできるかどうかを判定するために次のアドレスがわかるようになっている。
Virtex4ではFIFOプリミティブにFWFTモードを設定できるので便利だ。
FWFTモードのFIFOプリミティブをインスタンスしてModelSimで見てみよう。
最初にVerilog2001で作ってみたがうまく行かなかった。どこが悪いのかわからないが、わかる方教えてください。

module FIFO16_test(almostempty, almostfull, do, dop, empty, full, rdcount, rderr, wrcount, wrerr, di, dip, rdclk, rden, rst, wrclk, wren);

output wire almostempty, almostfull;
output wire [31:0] do;
output wire [3:0] dop;
output wire empty;
output wire full;
output wire [11:0] rdcount, wrcount;
output wire rderr, wrerr;
input wire [31:0] di;
input wire [3:0] dip;
input wire rdclk, rden;
input wire rst;
input wire wrclk, wren;

FIFO16 #(
    .ALMOST_FULL_OFFSET(12'h000),
    .ALMOST_EMPTY_OFFSET(12'h000),
    .DATA_WIDTH(36),
    .FIRST_WORD_FALL_THROUGH("TRUE")
) FIFO16_inst (
    .ALMOSTEMPTY(almostempty),
    .ALMOSTFULL(almostfull),
    .DO(do),
    .DOP(dop),
    .EMPTY(empty),
    .FULL(full),
    .RDCOUNT(rdcount),
    .RDERR(rderr),
    .WRCOUNT(wrcount),
    .WRERR(wrerr),
    .DI(di),
    .DIP(dip),
    .RDCLK(rdclk),
    .RDEN(rden),
    .RST(rst),
    .WRCLK(wrclk),
    .WREN(wren)
);
endmodule


やはり慣れているVHDLでやるとうまく行く。でもなぜだか?ALMOST_FULL_OFFSETとALMOST_EMPTY_OFFSETをコメントアウトしないとうまく行かなかった。

library ieee;
use ieee.std_logic_1164.all;

Library UNISIM;
use UNISIM.vcomponents.all;
-- <--Cut code below this line and paste into the architecture body-->
-- FIFO16: Virtex-4 Block RAM Asynchrnous FIFO
-- Virtex-4 User Guide
entity FIFO16_test is
    port(
        ALMOSTEMPTY : out std_logic; -- 1-bit almost empty output flag
        ALMOSTFULL : out std_logic; -- 1-bit almost full output flag
        DO : out std_logic_vector(31 downto 0); -- 32-bit data output
        DOP : out std_logic_vector(3 downto 0); -- 4-bit parity data output
        EMPTY : out std_logic; -- 1-bit empty output flag
        FULL : out std_logic; -- 1-bit full output flag
        RDCOUNT : out std_logic_vector(11 downto 0); -- 12-bit read count output
        RDERR : out std_logic; -- 1-bit read error output
        WRCOUNT : out std_logic_vector(11 downto 0); -- 12-bit write count output
        WRERR : out std_logic; -- 1-bit write error
        DI : in std_logic_vector(31 downto 0); -- 32-bit data input
        DIP : in std_logic_vector(3 downto 0); -- 4-bit partity input
        RDCLK : in std_logic; -- 1-bit read clock input
        RDEN : in std_logic; -- 1-bit read enable input
        RST : in std_logic; -- 1-bit reset input
        WRCLK : in std_logic; -- 1-bit write clock input
        WREN : in std_logic -- 1-bit write enable input
    );
end FIFO16_test;

architecture RTL of FIFO16_test is
begin
    FIFO16_inst : FIFO16
    generic map (
--        ALMOST_FULL_OFFSET => X"000", -- Sets almost full threshold
--        ALMOST_EMPTY_OFFSET => X"000", -- Sets the almost empty threshold
        DATA_WIDTH => 36, -- Sets data width to 4, 9, 18, or 36
        FIRST_WORD_FALL_THROUGH => TRUE) -- Sets the FIFO FWFT to TRUE or FALSE
    port map (
        ALMOSTEMPTY => ALMOSTEMPTY, -- 1-bit almost empty output flag
        ALMOSTFULL => ALMOSTFULL, -- 1-bit almost full output flag
        DO => DO, -- 32-bit data output
        DOP => DOP, -- 4-bit parity data output
        EMPTY => EMPTY, -- 1-bit empty output flag
        FULL => FULL, -- 1-bit full output flag
        RDCOUNT => RDCOUNT, -- 12-bit read count output
        RDERR => RDERR, -- 1-bit read error output
        WRCOUNT => WRCOUNT, -- 12-bit write count output
        WRERR => WRERR, -- 1-bit write error
        DI => DI, -- 32-bit data input
        DIP => DIP, -- 4-bit partity input
        RDCLK => RDCLK, -- 1-bit read clock input
        RDEN => RDEN, -- 1-bit read enable input
        RST => RST, -- 1-bit reset input
        WRCLK => WRCLK, -- 1-bit write clock input
        WREN => WREN -- 1-bit write enable input
    );
end RTL;


最初にISEでインプリメントしてFPGA Editorで見てみた。そうするとFIFO16というプリミティブが1個インスタンスされていた。FIFO16というモジュールがVirtex4には入っているようだ。(下の図)
FIFO16_1_060708.png

さらにModelSimで動作を見てみるとemptyが0になった時にdo(データ出力)に最初のデータが出ているので、間違いなくFWFTモードになっているようだ。次にレイシテンシだが、wrenを1にしてFIFOに書き込んでからちょうど4クロックでデータが出てきている。完全にパイプライン化されているようである。
FIFO16_2_060708.png

最後のコアジェネレータのFIFOジェネレータでもFWFTモードを指定できるようになっているようだ。(下図参照、ピンクで囲んだ部分がFWFTモードを指定できるFIFO、Virtex4の場合) Spartan3でもやってみたが、BlockRAMと分散RAMのFWFTモードのFIFOをジェネレートできるようだ。これでVirtex4でなくてもFWFTモードのFIFOを使えるようになるのでとてもうれしい。
FIFO16_3_060708.png

  1. 2006年07月08日 18:36 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

Spratan3E Starter KitのDDR SDRAMコントローラの説明

Spratan3E Starter KitのDDR SDRAMコントローラの説明をしようと思う。
Spratan3E Starter KitのDDR SDRAMコントローラのトップはddr_sdram_cont.vhdだ。

まずはWriteの場合。
・input_addressに書き込むアドレスをセット
・input_maskに書き込みマスクをセット
・read_writeをwriteの0にする
・input_dataにデータをセット
この下準備の後にwrdata_fifo_wrenとaddr_fifo_wrenを1クロックの間だけ1にする。
その後でコントローラがWriteコマンドを発行してDDR SDRAMへデータを書き込む。
下の図を参照。
ddr_sdram_cont_WR_060707.png


Readの場合
・input_addressに読み込むアドレスをセット
・read_writeをReadの1にする
この下準備の後にaddr_fifo_wrenだけを1クロックの間だけ1にする。
これでコントローラがReadコマンドを発行してDDR SDRAMからデータを読み出す。
データはoutput_dataに出てくる。output_dataが有効なのはrddata_validが1の時である。

ddr_sdram_cont_RD_060707.png


Writeの時のレイテンシは80ns、Readの時のレイテンシは130nsのようだ。ちょっとレイテンシが大きい気もするが、チューニングはしていないのでしょうがないだろう。実際に使う場合にはもう少しチューニングできると思う。今は詳しい検討はしていない。チューニングはFPGAチップのスピードグレードや動作周波数にも影響されるし時間がかかる作業だ。
  1. 2006年07月07日 20:30 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Spratan3E Starter KitのDDR SDRAMコントローラ(プロジェクト)

Spratan3E Starter KitのDDR SDRAMコントローラのプロジェクトをここにおいておくので、興味のある方は試してみてください。例によって保証はありません。プロジェクトやファイルは個人的に実験するのみで、商用に使用することや再配布は禁止します。DDR SDRAMコントローラを部品として組み込んで使う場合には何の一部として使ったかコメントで教えてください。
XilinxのアプリケーションノートXAPP253を参考に作ってありますが、自分で書き換えてあります。
DDR SDRAMコントローラの中のcontrollerはNGCファイルになっています。(とりあえず秘密!)
残念ながら論理シミュレーションは出来ません。simurationフォルダの中にはテストベンチ(DDRtest_tb.vhd)も入っていますがmt46v16m16.vhdというマイクロンのDDR SDRAMのモデルをダウンロードしないと使えません。でももうVHDLのモデルはないようです。
もう1つ足りないものはPicoBlaze本体です。これはいままで同様Xilinxからダウンロードしてください。そうしたらkcpsm3.vhdをAdd Sourceしてからインプリメントしてください。

しかし、NGCファイルをプロジェクトのルートディレクトリに入れておかなかったので、Translateでエラーが出てしまった。これはTranslateのプロパティでマクロの検索パスを指定していないためだった。だいぶ時間を無駄にしてしまった。こうやって覚えていくのだからしょうがないだろうけど。今度、IPを使う時には覚えておこう。

8.1i ISE - CORE Generator のマクロを使用すると「ERROR:NGDBuild:604 - Logical block 'xxxxx' with type 'xxxxx' is unexpanded」というエラー メッセージが表示され、変換ができない


TranslateのプロパティのMacro Search Pathに./ddr_controllerを設定してOKになった。

(2006年9月4日追記)
DDRtest_IP/simulationの下にms60d_lib_ddr_cont_controllerをおいた。これはddr_controllerの中でVHDLファイルがないcontroller.vhdのModelSim6.0dでコンパイルしたライブラリだ。これをModelSim6.0dでコンパイルする時にライブラリ登録するとシミュレーションが出来る。まだDDR SDRAMのモデルが必要だが、後で暇になったら書いてみようかな?
  1. 2006年07月06日 20:39 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:10

Spratan3E Starter KitのDDR SDRAMコントローラまとめ3

”Spratan3E Starter KitのDDR SDRAMコントローラまとめ”を良く見てみると、リード時のデータを3/4クロックずらすより、1/4クロックずらせて立下りエッジからデータをサンプルした方が受けられるIFD_DELAY_VALUEの値の幅が広くてよいと思った。
下の図がいままでの3/4クロックずらせて立ち上がりからデータをサンプルする方法だ。
DDRtest_sim_RD_060703.png

そしてこれが1/4クロックずらせて立下りエッジからデータをサンプルする方法だ。
DDRtest_sim_RD_1q_060704.png

2つの図のddr_dq_fpgaを比べてみてほしい。
1/4クロックずらせて立下りエッジからデータをサンプルするので、”Spratan3E Starter KitのDDR SDRAMコントローラまとめ”のIFD_DELAY_VALUEの表からIFD_DELAY_VALUE=2を選択してインプリメントしてボードにダウンロードして確かめてみたところOKだった。
  1. 2006年07月04日 19:31 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Spratan3E Starter KitのDDR SDRAMコントローラまとめ2

今度はDDR SDRAMの論理シミュレーションから動作を説明しようと思う。
DDR SDRAMの初期化はエルピーダ社のユーザーズマニュアル、DDR SDRAMの使い方の初期化を参考に作った。下の図で言うとピンクの四角で囲まれた部分だ。ここでバースト長を2、バースト・シーケンスをシーケンシャル・タイプ、CASレイテンシを2にモードレジスタを設定している。
DDRtest_sim_ALL_060703.png

白い四角で囲んだ部分がリフレッシュ・コマンドで、7.8usごとに出力している。
黄色で囲んだ部分がデータのライト、赤で囲んだ部分がデータのリード、青で囲んだ部分がプリチャージ・コマンドとリフレッシュ・コマンドだ。ちなみにライト・コマンドもリード・コマンドもプリチャージなしである。
次にライト・コマンドの様子を詳しく見てみよう。下図はその様子だ。
DDRtest_sim_ACT_WR_060703.png

ddr_cke=1, ddr_csb=0, ddr_casb=1, ddr_web=1の時にddr_rasb=0にするとACTコマンドで指定されたバンクをライト・コマンドやリード・コマンドで読み書きすることが出来る。このときにddr_ba(バンクアドレス)とddr_address(行アドレス)にはメモリのアドレスをFPGAがドライブする。
(オール0)
次に1クロック、ウエイトしてddr_casbとddr_webを0にするとライト・コマンドになる。その時にFPGAはddr_addressに列アドレスをドライブする。それと同時にといってもコマンドは半クロックずれているが、データをドライブする。データをドライブしてから1/4クロック後にDQSを立ち上げる。(データとDQSはFPGA側とSDRAM側に分かれていて遅延をくわえてある)
今度はリード・コマンドを簡単に説明する。下の図を見てほしい。
DDRtest_sim_RD_060703.png

ddr_cke=1, ddr_csb=0, ddr_rasb=1, ddr_web=1の時にddr_casbだけを0にするとリード・コマンドになる。ライト・コマンドと一緒でFPGAはddr_addressに列アドレスをドライブする。そうするとSDRAMはCASレイテンシ後にデータを出力する。FPGAのIFD_DELAYと配線遅延でデータを遅延するが、現在はIFD_DELAY_VALUEをUCFに記述しているためシミュレーションのソースの方で遅延させている。それがddr_dq_fpgaである。そのデータをサンプルしてリードしている。
これでライトやリードは終了だが、バンクをアクティブにしてあるので、リフレッシュする場合はプリチャージしてからリフレッシュしている。それが一番上の図の青で囲まれた部分だ。
  1. 2006年07月03日 18:19 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

プール

久しぶりに息子にリハビリを兼ねて昨日下妻のジャグジーつきプールに行ってきた。大人は500円子供は200円で安い。脇がごみ焼却場でその熱を利用した温水プール、風呂がある。
久しぶりで楽しかったが、息子ははしゃぎすぎて今日は腰が痛くて座れもしないといっている。早く良くなってほしいものだ。
  1. 2006年07月02日 11:00 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ESEC

今週の金曜日はESECに行ってきた。目的はひたすらただ1つ手にはらない2.5VのモバイルSDRAMが手に入るかどうかを聞くため。
初めの大手某社に行くが個数が90個というとけんもほろほろに追い返される。
次にY氏つながりのI氏がXilinxのブースで説明しているので挨拶をしながら2.5VのモバイルSDRAMがない話をしたら、即電話してくれて、後日購入できることになった。これで基板が作れる。。。本当に感謝。。。
今度CQで基板つきのVerilog本を出すそうだ。VerilogでナイトASICがつくれないのでVHDLではだめだそうだ。私はいままでVHDLがメインだったが、DDR SDRAMのモデルを検索してもVerilogモデルしかないことが増えた。少なくともVHDL,Verilog混在環境を研究してだんだんとVerilogに乗り換えることを考えよう。以前はVHDLの方が少なくともインプリメントはVerilogよりも高機能と思っていたが、Verilog2001が完全準拠となると逆転するかも知れない。
後、Xilinxの2次代理店の方とお会いしてお話した。ざっくばらんに代理店の方とお話したことがないので良かった。
モバイルSDRAMの情報は大体収集したので早々に帰った。

やはり誰かと行かないとシャイなのでいろいろ見て回れない。関係ないと思われるところで声をかけられると思わず逃げてしまう。今度は誰かと行くことにしよう。誤解のないように言っておくとFPGA関連は行って質問して、情報をもらってくる。今回もVirtex4のPCI Expressに関して有益な情報をいただいた。やはり展示会に行くと実際にやっている方から生の情報が聞けてとてもよいのだ。。。
  1. 2006年07月02日 08:53 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:4

Spratan3E Starter KitのDDR SDRAMコントローラまとめ

Spratan3E Starter KitのDDR SDRAMコントローラがとりあえず動いてきた。
クロックはSpratan3E Starter Kitの50MHzクロックを2倍にした100MHzだ。
以前、Internal Errorで落ちると言っていたが、少なくともODDR2とIDDR2、IOBUFの組み合わせを使うとInternal Errorで落ちるようだ。
それ以前に同じIOパッドのODDR2とIDDR2のセット・リセット信号を完全にあわせないと下図のエラーで落ちるようだ。セット・リセット信号は完全にあわせないとだめなようだ。1つだけGNDにつながっていてもだめで、完全に一致しなければだめな様である。
DDRtest_1_060624.png

そのため、以前はs(セット)で制御していたIOバッファのイネーブル用DDRレジスタだが、それを止めてDの入力信号に組み合わせ回路を加えて対処し、セット・リセット信号を完全にあわせた。

    -- Insantiate three-state DDR registers
    dq_tri_d0 <= dqs_reset_2d_dqtri or not_dqs_enable_2d;
    dq_tri_d1 <= not_dqs_enable_2d;
    
    WRDATA_DDR_TRI_INST : for i in DDR_DATA_WIDTH-1 downto 0 generate
        WRDATA_DDR_TRI : FDDRRSE port map(
            q => out_tri(i),
            d0 => dq_tri_d0(i/8), -- DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
            d1 => dq_tri_d1(i/8),
            c0 => clk,
            c1 => clkx,
            ce => vcc,
            r => reset,
--            s => not_dqs_enable_2d(i/8)
            s => gnd
        );
    end generate WRDATA_DDR_TRI_INST;


ちなみにSpartan3EでもFDDRCPE,FDDRRSEも使用できた。ODDR2でもどっちでも良いようだが、Internal Errorの危険があるので、今のところFDDRCPE,FDDRRSEの方がいいだろう。
DDR SDRAMはいままでいろいろ書いてきたが、今回のタイミングダイアグラムは以下の図のDDR SDRAM Read timing 1のタイミングチャートでCL=2で出てきたリードデータを配線とIOB内のDELAYで3/4クロック(7.5nsもしくはセットアップ時間を確保するためにもう少し短く)ずらしてFPGA内部100MHzクロックで受ける予定だ。
DDR_timing_chart_rw1_060129.png

やっと近頃バグが取れたようなので依然作ったロータリーエンコーダ入力のLCD表示回路(下図)に接続してテストした。
Rotary_Encoder_1_060518.jpg

LCD表示器の上の4桁はロータリーエンコーダで設定することが出来る。そのデータをeast押しボタンスイッチを押すとDDR SDRAMのオール0番地に書き込むことが出来る。次にwest押しボタンスイッチを押すとDDR SDRAMのオール0番地から読み出して下の4桁の表示する。
押しボタンを押すとかなりの回数連続的に読み書きするが、とりあえずDDR SDRAMにアクセスできるかどうかはわかる。
いろいろIOB内のDELAYを変更してやった結果が下である。

IFD_DELAY_VALUE=0 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=1 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=2 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=3 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=4 正常に表示できるときもあるがミスる(△)
IFD_DELAY_VALUE=5 正常に1番目のデータを表示(○)
IFD_DELAY_VALUE=6 正常に1番目のデータを表示(○)


IFD_DELAY_VALUE=6がよさそうである。まだちょっと遅延が足りない可能性もあるが、とりあえずこれで行くことにした。
遅延量を評価してみる。
1.まずはFPGAのチップ内配線での遅延はIOパッドのクロック出力をフィードバック・パッドに戻してFBかけているので0とする。(異論もあるだろうが。。。)
2.FR-4基板の遅延量を75ps/cmとし、大体往復で6cmとすると450ps
よってDDR SDRAMのデータを受けるIOBのDDRレジスタへのクロック配線のスキューは大体0なので、データをIOBのDELAYで7.5ns - 0.45ns=7.05ns遅延させると良い。
Spartan3Eの入力用プログラマブル遅延素子を参照すると、一番近いのは”IFD_DELAY_VALUE=2 の時rot_aデータパス遅延は6.930ns”のようだが、実際にはDDRの逆側のデータが見えてしまっている。これは遅延量が少ないため次のデータがサンプルされているものと思われる。(DDR SDRAMは常に2つのデータの組でデータを出力するが、現在は最初のデータだけを使用しているため)
IFD_DELAY_VALUE=5以降は正常にデータが読めている。初めにこれはものすごく荒い計算だということを断っておかなければならない。あえて言うと、これは何を意味しているかというとTiming Analyzerの遅延値はかなり余裕を持った値かもしれないということだと思う。以前Spartan3ではTiming Analyzerの遅延値よりも実測値は70%ではないかという結果が出た。(FPGAの性能)
Timing AnalyzerでIFD_DELAY_VALUE=6 の時rot_aデータパス遅延は9.983nsなので、これの70%は約7ns。この性能の推定は大体あっているのかもしれない。
DDR SDRAMコントローラの公開をどうするかはこれからの課題だが、とりあえず、iMPACTでダウンロードできるようにBITファイルと本当にDDR使っているよということを示すためにFPGA EditorのファイルであるNCDファイルをここにおいて置くので、試したい方は試してください。例によって保証はありません。うちのキットでは動いていますが、回路が間違っているかもしれませんので、その場合はボードにダメージを与える場合も0ではありません。

一応動作するようだが、まだ腑に落ちない部分があるのでもう少しチューニングすることにする。

そういえばBIT,NCDファイルのやり方わかるだろうか? Windowsのスタートのすべてのプログラムから"Xilinx ISE 8.1i"の"アクセサリ"の中のiMPACTやFPGA Editorを使用してほしい。使い方のわからない方はコメントで問い合わせください。
  1. 2006年07月01日 20:20 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:2