FC2カウンター FPGAの部屋 2008年02月
fc2ブログ

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

FPGAの部屋

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

新版ISEのチュートリアル

新版ISEのチュートリアルを書こうと思っている。Spartan3E Starter Kitを使用して、LCDをステートマシンで実装し、シリアルインターフェースを作って、パソコンのターミナルソフトからLCDに文字を表示する過程をブログに書こうかと思っている。
今回のInterface(2008年4月号)誌のようにPlasmaを入れても良いんだけれど、それでやることないし。。。
キャラクタ・ディスプレイ・コントローラもあるし、PicoBlazeを使ってピンポンゲームかブロック崩しでも良いか?
チュートリアルなので、回路製作過程も詳しく書こうと思っているので、あまり複雑な回路は向かないか?(説明が膨大になるから。。。) ただいま考慮中。

今回のInterface(2008年4月号)誌の座談会でFPGA内部バスのアーキテクチャの話があったが、今回の設計している、お仕事のFPGA内部バスは超過激な仕様だ。スプリット転送をサポートしようと思っている。FPGA内部バスも最大の性能が出るように独自仕様なのだが、いささかオーバースペックぎみという感じもしている。現在、仕様策定中だ。PCI-Xのモジュールを作り始めながら、FPGA内部バスの仕様を策定している。

DDR2 SDRAMコントローラはデータを読めてはいる。しかし、2個書き込んでいるはずなのだが、読んでくるときに1個少ない。クロックがずれているのか?書き込むときに1個しか書き込んでいないのかはまだ不明だ。
  1. 2008年02月28日 21:11 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

動かす!!初めてのPCI-Expressセミナに行ってきます

東京エレクトロンデバイスで開催される動かす!!初めてのPCI-Expressセミナに行ってくることにした。日にちは3月27日に申し込んだ。今はもう満員のようだ。今現在、4月は残っている。
東京エレクトロンデバイスオリジナルのVirtex5搭載PCI-Expressボードを使って、Endpoint Block Plusの簡単なデザインを設計して、PCとの実機動作を確認できるとのことだ。このPCI-ExpressボードはDWMなどにも記事が載っている。実際にやってみるのが楽しみだ。
実際にVirtex5をインプリメントして、ビットファイルを流し込んで動作させたことがないので楽しみにしている。

DDR2 SDRAMコントローラはインプリメントして実機動作を確認中だが、今のところうまく動いていない。忙しくてなかなかやっていられないのだが、順次デバックしようと思っている。
シミュレーションでは動いているのだが、何でだろう。ピンアサインが間違っているのかな?
  1. 2008年02月27日 05:22 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Virtex4のDCM

私はDCMを使用する際に、IPではなくDCMプリミティブを使用している。DDR2 SDRAMコントローラもSpratan3EのDDR SDRAMコントローラをベースに作り直しているので、DCMプリミティブもそのまま使用していた。
今回、インプリメント時にDDR2 SDRAMコントローラ用のDCMのDLL_FREQUENCY_MODEがLOWだとだめだとDRCが言ってきたので、HIGHに変更した。その後、シミュレーションをしていなかったのだが、スイッチや7セグLEDを上につけてシミュレーションを行ったところ、動作しなかった。
なんだなんだと思って、詳細に見てみたところCLK90が出ていなかった。そういえばVirtex2ではDLL_FREQUENCY_MODEがHIGHだとCLK90とCLK270はでなかった。
Virtex4ではDCMが変更になっているので、DCMプリミティブも変更になっているはずだと思って、ユーザーズマニュアルを見てみた。そうすると、DCM_BASE, DCM_PS, DCM_ADVの3つのプリミティブを使うようだった。(Virtex-4 ユーザーガイド UG070(v1.4)2005年9月12日の56ページから転載)
Virtex4_DCM_080224.png

これを使わないとVirtex4用のDCMは使えないようだ。ちなみにDCM_ADVのVerilog HDLソースコードを読んでみたらDLL_FREQUENCY_MODEがHIGHでもCLK90とCLK270は出力されるようだった。
やはり、CoregenでDCMのIPを使ったほうが安全だと思った。ちょっとやってみたが、DCM_ADVが出てきた。
DCM_ADV_080224.png
  1. 2008年02月24日 15:18 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

竹とんぼ

先週、フリーマーケットに行った際にユニーで駅弁大会をやっていたので、ますのすしを購入した。その日のうちにおいしくいただいたのだが、すしが入っている桶?を挟んでいる竹の板が残ったので、下の娘から竹とんぼを作ってくれといわれた。
それじゃ、今日作ろうと言って作り始めたが、これがまた結構大変だった。
最初にテーブルの上で大きいカッターで削ったが、削る際に指がテーブルに当たってうまく削れない。ある程度削ったが大変なので、ドリルに砥石をセットして削ってみようとしたが、やはり削れない。
外に出て木のブロックを探してきて、その上で削るようにしたら、やっと手が当たらずにうまく削れるようになった。
削った後に、3mmの穴をドリルで開けて竹ひごを入れた。
やっとできて、飛ばせると思ったら、竹とんぼのプロペラのピッチ方向を間違ってしまった。つまり、上から見て右回りで飛ぶように作ってしまった。普通とは逆に左手を前に出す方向で飛ばす必要がある。大失敗。
ここまで作ったのに、娘に泣かれてしまった。ほらこうやれば飛ばせるよ。と見本を見せたところ、やってみるということになって、飛ばせるようになってきたようだ。一安心。
しかし、回転方向を間違うとは情けない。それも考慮に入れたはずだったが、なぜか間違ってしまった。昔も、間違ったことがあったっけ。。。昔作っているときは、切り倒したばかりの青竹だったので、作りやすかったのだが、今回は硬かったのだった。
taketonbo_080223.jpg
  1. 2008年02月23日 20:55 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

2008年2月21日の近況

趣味のDDR2 SDRAMコントローラはSuzaku-Vの7セグLEDやスイッチをつないでテストしようとしている。インプリメントは大体できた。動作周波数も200MHzで動作するようだ。まだ試しにインプリメントしただけで、回路が動作するかどうかがわからない。そこで今はテストベンチを作っている。まあ、Suzaku-Vはあまり持っている人がいないだろうから、試して見られる人は少ないと思うが。。。

仕事はFPGAの内部回路をまったく新しくしている。前に作ったPCI-Xテスト回路を使えるように直している。FPGA内部のバスの定義から作っているので仕様作成が大変だ。
その関係もあるが、アサーションに興味がある。アインさんのOVL(Open Verification Library)のWebページを見て、ModelSimでも動作するOVLに興味が出てきた。うまくいけばアサーションを使っていきたいと思っている。
後、発表会もあるので、発表用のPowerPointも作っている。

私生活では、今日上の娘の中学最後の授業参観に行ってきた。中学も終わりだなと思うと感慨深いが、まだ県立高校受験も終わっていない。。。
  1. 2008年02月21日 19:25 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラのインプリメント結果

DDR2 SDRAMコントローラのインプリメントも大体終わったのだが、まだSuzaku-Vに入れて確かめてはいない。確かめるためには入出力回路をつける必要がある。
でも、その前に”DDR2 SDRAMコントローラのインプリメントテスト(IOB)”、”DDR2 SDRAMコントローラのインプリメントテスト(終わり)”、”ISE9.2iでのTiming Analyzerの起動方法”を確かめてみるのに、ISE9.2iSP4でインプリメントしたプロジェクトをダウンロードできるようにしておく
例によって保証はありません。プロジェクトやファイルは個人的に実験するのみで、商用に使用することや再配布は禁止します。ダウンロードして試してみた方はコメントしていただけると非常にうれしいです。

DDR2 SDRAMのピンは固定してあるが、反対側はピンを固定していない。こっち側はSuzaku-Vのスイッチや7セグLEDにアサインする予定だ。
  1. 2008年02月18日 21:16 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

昨日の一日

昨日は、今日も京都でいろいろありました。昨日一日を日記に書きます。
昨日は午前中に下の娘の小学校の友達が、小学校の総合の時間でreuseを考えるというテーマをやっているそうだ。その一環として、守谷市の立沢公園というところでフリーマーケットに参加するという企画があった。下の娘は、お友達にフリマに会に行くと約束したそうで、奥さんと下の娘と私で守谷まで行くことになった。
freema_070217.jpg

場所は新守谷駅のユニーの近くなので、ユニーの駐車場にとめて行ったら、本当にユニーの入り口の近くでやっていた。風が強く寒かったので、他に出展している人は2組くらいしかいない。寒風に吹きさらされてやっていたので、本当に先生も娘のお友達もご苦労様である。行って品物を見ていると、娘の友達が商売上手で、言葉に載せられて私もひざ掛けを購入してしまった。商売向きだと思った。娘も2つくらい購入していた。
隣に、本格的なお店があって、本当にお店に並んでいるようなものを売っていた。娘は見ていると欲しくなって、リロ&ステッチの財布を買った。750円なので結構安かった。
小学校の活動でフリマをやっているので、担任の先生も来ていたが、車はなんとスープラだった。金あるな~。なんと、F1のファンで鈴鹿も富士も毎年F1観戦に行っているそうだ。富士は帰るのにバス待ちで5時間待ったそうだ。今年はF1、TRCなしになりましたね~、というような話ができて楽しかった。
その後、家に帰って昼食。奥さんはさっさとバスタオルで草履を作るという講座に行っちゃった。
私と上の娘は2時から高校の説明会に。進学コースの説明を聞いてきた。S1合格だと月に3万円くれるそうだ(当然授業料は払いますが。。。)。
帰ってきて1時間ほどほっとしたら、息子の迎えに。石下で遊戯王カードやっているのだ。家に帰ってきたら、すぐ、上の娘を塾に送っていく。
その間に、奥さんが草履作り講座から帰ってきたようだ。草履を自慢している。結構良くできているようだが、そんなのをやっているようならばISEいじっていたほうが良い?
その後、塾の迎えに行った。午後8時20分ころやっと晩御飯。ビーフストロガノフだった。結構おいしかった。
忙しい1日だった。DDR2 SDRAMコントローラをやっている暇がなかった。
今日も窓の修理をしなくちゃいけないし、今週はDDR2 SDRAMコントローラ、お休みか?
いろいろ忙しい。。。皆さんもそうだろうけど。。。
DDR2 SDRAMコントローラ終わったら、久しぶりにISE9.2iでチュートリアルを書いてみようかな?それともそろそろ次のISEが出るのだろうか?
  1. 2008年02月17日 08:16 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ISE9.2iでのTiming Analyzerの起動方法

ISE9.2iでのTiming Analyzerの起動方法を解説しようと思う。ISE8まではTiming Analyzer単体で起動していたが、ISE9.2iではISEに統合されて起動する。
ISE92_Timing_Analyzer_1_080215.png

1.最初にISE9.2iでImplement Designを行う(ダブルクリックする)。
2.ProcessesペインのImplement Designを展開して、その中のPlace & Routeを展開する。
3.Generate Post-Place & Route Static Timingを展開して、Analyze Post-Place & Route Static Timingをダブルクリックする。

そうするとTiming Analyzerが立ち上がる。
この状態では、すでに静的にタイミングを解析した結果を表示する。エラーがあるときは、タイミングパスを表示する。
ddr2_implement_5_080211.png

しかし、タイミングが満足しているときにはタイミングパスを表示しない。
ISE92_Timing_Analyzer_2_080215.png

上の図では

TS_dcm_module_inst_clk_node = PERIOD TIMEGRP
"dcm_module_inst_clk_node" TS_dcm_module_inst_clk200_node HIGH 50%;


という制約は、9413 items タイミング解析してエラーなしで、最小クロック周期は 4.948ns だと書いてある。しかし、クリティカルパスがどこなのかはレポートがない。
そういうときには、Analyze against Timing Constraints アイコンをクリックすると、静的タイミング解析を行う。デフォルトでは3つのタイミングパスを解析する。
ISE92_Timing_Analyzer_3_080215.png

表示されたら、Sourcesペインの四角+をクリックするとタイミングパスを表示する。それをクリックするとタイミングの内訳が右のペインに表示される。
ISE92_Timing_Analyzer_4_080215.png

なおデフォルトが3なので、3つしかタイミングパスを表示しないが、メニューからAnalyze against Timing Constraints...を実行すると、解析するタイミングパスの個数を指定できる。
やり方は、AnalyzeメニューからAnalyze against Timing Constraints...を選択する。
ISE92_Timing_Analyzer_5_080215.png

Analyze against Timing Constrainsダイアログが開くので Options タブをクリックする。
ピンクの四角のところの3を任意の数字に変えると、その数分だけタイミング解析をしてくれる。たとえば10と入れれば、10個のタイミング解析をしてくれる。
ISE92_Timing_Analyzer_6_080215.png

下の図は10でやってみたところ。
ISE92_Timing_Analyzer_7_080215.png

さらに、Analyze against Timing Constrainsダイアログが開くので Options タブをクリックした状態で、Report fastest paths/verbose hold paths をチェックして解析をするとセットアップ時間と一緒にホールド時間も解析される。
ISE92_Timing_Analyzer_8_080215.png

結果はこれ。
ISE92_Timing_Analyzer_9_080215.png


皆さん、ご存知かもしれませんが、いろいろタイミング解析をやってみてください。
  1. 2008年02月15日 20:06 |
  2. Timing Analyzerの使い方
  3. | トラックバック:0
  4. | コメント:0

今、読んでいる本、読んだ本

今日読み終わったのは、栗本薫さんのグイン・サーガ119巻 ランドックの刻印
栗本薫さんが胆管癌になってしまったようだ。作家の健康も本当に心配だが、グイン・サーガが終わるかどうかも心配だ。
今、中3の娘に面白そうな本を紹介している。私の読んでいるのはSFが多い。笹本祐一さんが好きなので、ARIELを進めたが、あまり好きじゃなさそう。小娘オーバードライブは1巻は読んだようだ。
今は、田中芳樹さんの銀河英雄伝説を貸したのだが、ちまちまと読んでいるようだ。彼女は、他にいろいろ読んでいるので、銀河英雄伝説が進まない。私も銀英伝を久しぶりに読み返してみた。これで10回くらい読んだろうか?
FPGAのインプリメントの間とかに読んでいる。
  1. 2008年02月14日 21:22 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

DDR2 SDRAMコントローラのインプリメントテスト(終わり)

DDR2 SDRAMコントローラのインプリメントテスト(IOB)”で、まだdqs_enable_3dがクリティカルパスになっていたので、例によってmax_fanoutを1にした。その後、もう1つ、FFのmax_fanoutを1にしたところタイミングが収束した。
ddr2_implement_8_080213.png

これで大体大丈夫だと思う。最終的にはセットアップ時間、クロックからの出力時間の制約をUCFに書く予定だが、これでだめならばやれることは少ない。
なお、前回、Floorplannerで配置したDQSのトライステートバッファの配線遅延は以下のとおりだ。
最初にddr2_dqs<0>とddr2_dqs<1>が1.230ns 。
ddr2_implement_6_080213.png

ddr2_dqs_n<0>とddr2_dqs_n<1>が1.534ns と1.545ns で少し大きい。まだ、精査していないが、このくらいだと大丈夫だと思う。
ddr2_implement_7_080213.png


これでddr2 controllerのインプリメントは終わったので、以前テストした表示部とあわせて、Suzaku-Vにインプリメントして動作確認をする予定だ。
  1. 2008年02月13日 21:57 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラのインプリメントテスト(IOB)

DDR2 SDRAMコントローラのシミュレーションまとめで公開したVerilog HDLコードでは、インプリメントが厳しい。入力のFFがIOBに入らなかった。
やはり、IOB入出力関連はトップに持ってきてリード用、ライト用を統合したほうがPartitionをかけたときを考えてもよさそうだ

    // ddr2_dqのIOBをプリミティブでインスタンシエーション
    generate
    genvar i;
        for (i=DDR2_DATA_WIDTH-1; i>=0; i=i-1) begin: WRDATA_INOUT
            ODDR #( // data output DDR
                .DDR_CLK_EDGE("OPPOSITE_EDGE"), // SAME_EDGEモードにするとMAPでエラー。ISE9.2iSP4
                .INIT(1'b0),
                .SRTYPE("ASYNC")
            ) WRDATA_DDR2_OUT (
                .Q(ddr2_out[i]),
                .C(clk),
                .CE(dqs_enable_3d[i/8]),
                .D1(wrdata_3d[i]),
                .D2(wrdata_4d_half[i]),
                .R(reset),
                .S(1'b0)
            );
            
            ODDR #( // data tristate enable
                .DDR_CLK_EDGE("OPPOSITE_EDGE"),
                .INIT(1'b1),
                .SRTYPE("ASYNC")
            ) WRDATA_DDR2_TRI (
                .Q(out_tri[i]),
                .C(clk),
                .CE(1'b1),
                .D1(dq_tri_d0[i/8]), // DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
                .D2(dq_tri_d1[i/8]),
                .R(reset),
                .S(1'b0)
            );
            
            IDELAY #(
                .IOBDELAY_TYPE("FIXED"),
                .IOBDELAY_VALUE(0)
            ) RDDATA_DDR2_IDELAY (
                .O(ddr2_dq_idelay[i]),
                .I(ddr2_dq_in[i]),
                .C(1'b0),
                .CE(1'b0),
                .INC(1'b0),
                .RST(1'b0)
            );
            
            IDDR #( // input DDR
                .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // 位相あわせまでIOBのDFFで行う
                .INIT_Q1(1'b0),
                .INIT_Q2(1'b0),
                .SRTYPE("ASYNC")
            ) RDDATA_DDR2_IN (
                .Q1(dq_fall_1d[i]),
                .Q2(dq_rise_1d[i]),
                .C(clkx),
                .CE(1'b1),
                .D(ddr2_dq_idelay[i]),
                .R(reset),
                .S(1'b0)
            );
            IOBUF DDD2_DQ_BUF (
                .O(ddr2_dq_in[i]),
                .IO(ddr2_dq[i]),
                .I(ddr2_out[i]),
                .T(out_tri[i])
            );
        end
    endgenerate
    
    IDELAYCTRL WRDATA_IDELAYCTRL (
        .RDY(),
        .REFCLK(clk),
        .RST(reset)
    );


ODDR, IDDR, IDELAY, IDELAYCTRLプリミティブを使用している。
以前ODDRプリミティブを使用したときにMAPでエラーになるというブログを書いたが、ODDRを"SAME_EDGE"モードを使用するとそうなるようだ。"OPPOSITE_MODE"を使用するとMAPは通った。(ISE9.2iSP4)
IDDRは"SAME_EDGE_PIPELINED"で使用している。これで以前のクロックの位置合わせをする dq_fall_1d, dq_rise_1d までもIDDRに取り込める。
この結果、インプリメントしてFPGA Editorで見てみると、ちゃんとIOBに入っている。下の図はddr2_dq<0>のIOB。
ddr2_implement_1_080211.png

そのILOGICを下に示す。
ddr2_implement_2_080211.png

IDDRを"SAME_EDGE_PIPELINED"で使用して、IDELAYを使用しているのが見て取れる。
次にOLOGIC内のODDRを見てみよう。
ddr2_implement_3_080211.png

Outputバッファのイネーブルと出力用のODDRを使用している。これでDQは大丈夫そうだ。
次にDQSはトライステート・イネーブル用FFと出力用のODDRのクロックが違うので、OLOGIC内には入らない。そこで、Floorplannerで、すぐ近くに配線することにした。
ddr2_implement_4_080211.png

これでインプリメントしてみたが、controller.vのパスとdqs_enable_3dがクリティカルパスになっている。
ddr2_implement_5_080211.png

dqs_enable_3dは”DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)”の方法で回避するが、controller.vのパスはRouterにさらにがんばってもらおうと思う。今でもプロパティは最高なので、コストテーブルを変えてみることにする。
このFPGAで、このcontroller.vでは限界が近そうだ。どうしてもだめだったら、アーキテクチャを変えるか、さらに速いデバイスにする必要がありそうだ。
  1. 2008年02月11日 21:25 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

カメレオンUSB FX2

オプティマイズに新しい基板が増えた。カメレオンUSB FX2だ。
おなじみCypress EZ-USB FX2にアルテラのMAX2 CPLD(EPM570T100)がついている。
MAX2はメモリは載っていないようだが、USB2.0にFPGAという使えそうな構成なので興味がある。
今のところ、私にはニーズがないが、MAX2のコンフィギュレーションもUSBからできるようだし、いろいろ使えるんじゃないだろうか? 4,980円だし、一つ買ってもいいかな?
  1. 2008年02月08日 19:51 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラのシミュレーションまとめ

DDR2 SDRAMコントローラのシミュレーションで、とりあえずVerilogコードを公開しようと思う。まだインプリメントまではうまくいっていない。リードデータを受ける際の入力ディレイもインプリメントしていないし、IOBにも全部入っていない。ちゃんとインプリメントするには書き直しが必要かもしれない。
DDR2 SDRAMコントローラはほとんどDDR SDRAMコントローラと同じだ。Posted CASもODTも使用していない。修正箇所はプリフェッチ4に対応して4バーストにしたのと、初期化ルーチンをいじったくらいか?
使用しているシミュレータはVeritak Basicだ。これはたっくさんの作られたVerilogシミュレータだ。ModelSim Staterでも良いのだが、1万行の制限にかかると遅くなるので、以前購入したVeritak Basic(現在の最新バージョンはVer3.41K、このブログではそのバージョンを使用して説明している)を使用している。
ちなみにVeritakはPro版もBasic版もダウロードページからダウンロードできて16日間試用できる。私は、Veritak BasicをVectorのページから購入した。今は4,830円だそうだ。

さて、DDR2 SDRAMコントローラのシミュレーション用のファイルはここからダウンロードすることができる。
例によって保証はありません。プロジェクトやファイルは個人的に実験するのみで、商用に使用することや再配布は禁止します。ダウンロードして試してみた方も動いたどうかコメントで教えてください。

まずはダウンロードして、展開すると"ddr2_controller"というフォルダが出てくると思う。その下に"simulation"フォルダがあるはず。"simulation"フォルダには、DDR2 SDRAMのモデルがないので、Micron社からダウンロードさせてもらうことにする。DDR2 SDRAM(Micron MTH16M16-37E)のモデルをMicron社のMT47H16M16BG-37Eのページからダウンロードする。
それを展開すると"256Mb_ddr2"フォルダがあるので、その中の"ddr2.v"と"ddr2_parameters.vh"を取り出して、"simulation"フォルダに入れる。さらに、"ddr2_parameters.vh"をエディタで開いて、コメントの後に"sg37E"と"x16"を定義する。

`define sg37E
`define x16


ddr2_simlation_1_080205.png

これでファイルは全部そろったので、Veritakのプロジェクトを作る。
Veritakを起動する。起動したらVerilogプロジェクトメニューの新しいプロジェクトの作成を選択する。
ddr2_simlation_2_080205.png

ダイアログが開くので、simulationフォルダに移動する。次に、ファイル名に適当なプロジェクト名をつけて保存する。ここではDDR2_SDRAMtest_tb.vtakprj というプロジェクト名をつけた。
ddr2_simlation_3_080205.png

コンパイルするファイルを選択するダイアログが開くので、ddr2.v と DDR2_SDRAMtest_tb.v を選択して、Addボタンをクリック。
ddr2_simlation_4_080205.png

そうすると左下のペインに入力される。さらにddr2_contorllerフォルダに移動して、そこにあるすべてのVerilogファイルをAddしよう。
ddr2_simlation_5_080205.png

次にISEインストールフォルダの下のverilogフォルダの下の src フォルダを開く。そこにあるglbl.v を Addする。その後、unisims フォルダをダブルクリックして開く。
ddr2_simlation_6_080205.png

unisims フォルダの中に入ってAdd Lib Dir ボタンをクリックし、ライブラリとして登録する。
ddr2_simlation_8_080205.png

これでプロジェクトへのVerilogファイルの登録は終了なので、Save Project ボタンでプロジェクトをセーブする。その後 Exit ボタンを押して登録画面を終了する。
ddr2_simlation_9_080205.png

Verilogプロジェクトメニューから Load Verilog プロジェクトを選択する。
ddr2_simlation_10_080205.png

DDR2_SDRAMtest_tb.vtakprj を開く。
ddr2_simlation_11_080205.png

コンパイルが始まり、Verilog Simulation Ready.. が出たら、ピンクの枠で囲ったシミュレーション開始をクリックする。
ddr2_simlation_12_080205.png

シミュレーションが終了し、$stop; でシミュレーションが一時停止する。
ddr2_simlation_13_080205.png

VerilogファイルのウインドウをXで消す。ピンクの枠で囲ったScope Tree View を前面にするというアイコンをクリック。
ddr2_simlation_14_080205.png

Scope Tree View ウインドウと Waveform Viewer 1 ウインドウが開く。Scope Tree View ウインドウで左のペインからDDR2_SDRAMtest_tb をクリックすると、右のピンに信号が表示される。それをすべて選択して、そこで右クリックする。そうすると 選択信号をWaveform Viewerに追加 が出るので選択する。
ddr2_simlation_15_080205.png

そうすると、Waveform Viewer 1 ウインドウに選択した信号が表示される。ピンクの枠で囲った全体波形を表示するアイコンをクリックする。
ddr2_simlation_16_080205.png

そうすると、全体波形が表示される。
ddr2_simlation_17_080205.png

左クリックで黒いカーソルがでる。右クリックで赤カーソルがでます。上の図で右端の図の位置あたりに黒、赤カーソルを表示して、ピンクの枠で囲ったアイコンをクリックするとその間をズームする。
ddr2_simlation_18_080205.png

ズームしたら、その中の上の図辺りをもう一度ズームする。
ddr2_simlation_19_080205.png

ズームされたのが、DDR2 SDRAMへの書き込みだ。ddr2_dq_sdramがDDR2 SDRAMでのデータ、ddr2_dqs_sdramが同じくDQSだ。CASレイテンシ=3、Posted CAS=未使用、ODTも未使用となっている。あまりDDRと変わらない。

シミュレーションの一番最初のメッセージがワーニングになっている。

DDR2_SDRAMtest_tb.MT47H16M16_inst.cmd_task at time 10626000.0 ps WARNING: 200 us is required before CKE goes active.


これはCKEをアクティブにするまでに200us 経過していないというワーニングだ。シミュレーション時間が長くなるので、短くしてある。これがいやな方は、simulationフォルダの ddr2_cont_parameters.vh ファイルの14行目をコメントアウトして、13行目のコメントをはずしてください。

2008/02/07:訂正
DDR2_SDRAMtest_tb.vにバグがあったので、ダウンロードファイルを修正しました。ModelSimでの動作も確認しました。
たっくさん、ご指摘ありがとうございました。ModelSimではシミュレーションをしていませんでした。
  1. 2008年02月07日 04:36 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

肩こり+首こり

私は肩こり+首こりだ。少なくとも1ヶ月に1回はマッサージを受ける。そうしないと頭が痛くなってしまう。マッサージに行く前は頭が痛くなって、医者に行ったこともあったが直らずに困っていた。しかし、マッサージにいったら良くなった。
そういう症状の人が増えているようだ。
ZAKZAKでも”うつむき族は要注意! 下ばかり見て生活すると…“クビ”は万病のはじまり!?”という記事があった。うつむいているといろんな症状が出るそうだ。
それによると”予防はPC作業であれば、15分に1回ぐらいは30秒ほど頭を後ろに反らせて首の筋肉を緩めてやること。”だそうだ。
確かにそうすると首の筋肉が緩む。皆さん気をつけましょう。
  1. 2008年02月04日 20:56 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:9

ステップワゴンのヘッドライト

去年の12月末にホンダのステップワゴンが納車になったが、どうしても1つ気になることがあった。
それはヘッドライトが時々またたく事だ。走っていると、たまに、ちかっと瞬間的に暗くなってすぐに戻る。あれなんだろうと気になっていた。トラブルシュートしてみると、どうやらオートエアコンなので、エアコンをつけっぱなしなのだが、コンプレッサーがONすると、一瞬暗くなるようだ。電磁クラッチの電気の食いすぎか?、もしくは、メイン・ハーネスが細いのか?
私はCRTのリフレッシュレートでいうと60Hzはちらついて我慢できないので、人より敏感(神経質)なのかもしれない?、どうも、気になる。
ディーラーにクレームしてみたが、直らず、これで正常といわれる。。。が、どうも気になる。
ちなみにヘッドライトはハロゲン。HIDはそれほどひどくないとディーラーが言っていた。。。
HIDつきを買えばよかったか?迷ったが、PIAAのHIDユニットをオートバックスで買って今日つけてもらった。

結果はものすごく良かった。もうヘッドライトはまたたかないし、すごく明るい。とても満足している。やはりHIDは良い。しかし、対向車は迷惑じゃないのかな?
  1. 2008年02月02日 20:39 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4

DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)

DDR2 SDRAMコントローラのインプリメントテスト(動作周波数の確保)で1つクリティカルパスをつぶしたが、まだ動作周波数を満足しない。
IOBのDDRレジスタを使う際に180度位相が異なったクロックでサンプルするので、周期の1/2になるところが痛い。
そのような場合は下の図のように、FF(フリップフロップ)が一番下で4つのファンアウトを持っていると、どうしてもルーティングが厳しくなる。
max_fanout_1_080201.png

IOBの位置が離れているときには、なおさらだ。
実際に最初にインプリメントしたときには、そうなっていた。
ソースファイルはこれ。

    always @ (posedge clk90) begin
        if (reset==1'b1) begin
            dqs_reset_2d <= 0;
            dqs_reset_3d <= 0;
            dqs_reset_d3d <= 0;
        end else begin
            dqs_reset_2d <= dqs_reset_1d;
            dqs_reset_3d <= dqs_reset_2d;
            dqs_reset_d3d <= dqs_reset_2d;
        end
    end


    // Instantiate DQS_N DDR registers(DQSと逆極性)
    generate
    genvar p;
        for (p=DDR2_DQS_DM_WIDTH-1; p>=0; p=p-1) begin: WRDATA_DQS_N
            FDDRRSE WRDATA_DDR2_DQS (
                .Q(dqs_n_out[p]),
                .D0(gnd),    // DQSとDO,D1が逆
                .D1(vcc),
                .C0(clk90),
                .C1(clk270),
                .CE(vcc),
                .R(dqs_reset_d3d[p]),
                .S(gnd)
            );
        end
    endgenerate


dqs_reset_d3d は90度クロックでサンプルされていて、FDDRRSEの同期リセット入力 (R) に入力されているので、クリティカルパスは2.5ns以下でなければならない。
下がTiming Analyzerのレポート。スラックが -0.820nsになっている。
max_fanout_3_080201.png

下がFPGA Editorの画面。ファンアウトが4なので、だいぶネットが伸びている。
max_fanout_4_080201.png

これでは、だめなので、なるべく下のようにツリー状にネットを分散していけば、リソースは食うがネットは短くなるはず。
max_fanout_2_080201.png

本当はそれを見越して、宣言部でIOBの分だけFFを宣言してあるのだが、XST(論理合成)で消されてしまう。
宣言部はこれ。

reg [DDR2_DQS_DM_WIDTH-1 : 0] dqs_reset_d3d;


これを、消されないように max_fanout ディレクティブを使用して、XSTに消さないようにお願いする。(本当はもうちょっと多くの信号を消されないようにmax_fanoutを設定している)

(* max_fanout="1" *) reg [DDR2_DQS_DM_WIDTH-1 : 0] dqs_reset_d3d;


これでインプリメントすると、負荷が分散されて制約が満足するようになった。(動作周波数の制約が満足できた)
これがTiming Analyzerのレポート。
max_fanout_5_080201.png

制約を満足している。
FPGA Editorで見てもファンアウトが1になって、距離も短くなっている。
max_fanout_6_080201.png

まだ、動作周波数の制約しかかけていないので、IOのセットアップ時間(tsu)、クロックからの出力時間 (tco) は考慮されていない。
少なくとも、主力用FFと出力のトライステートバッファのイネーブル信号用FFはIOBに入れないとtsuとtcoは満足できないと思う。まだ、それらのFFはすべてIOBに入っていない。IOBの物理的な構造を考慮してVerilogファイルを書かないとだめそうだ。
  1. 2008年02月01日 22:32 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:2

思いがけなく中島誠之助講演会に行く

昨日、6時ころ職場から帰ろうとしたら先輩が急いで帰ろうとしていました。そんなに急いでどうしたんですか?と聞いたら、テレビ番組の”開運!なんでも鑑定団”の中島誠之助さんの講演会があって、すぐ行かなくちゃ行けないということでした。おまけに奥さんがいけないので一枚チケットが余っているから、よかったら行くか?というありがたいお言葉がありました。一瞬迷いましたが、私は”開運!なんでも鑑定団”を開始当初から見ている大のファン!ぜひ、お願いしますということで行くことにしました。
場所はつくばの国際会議場。いってみたら生命保険会社の宣伝を兼ねた講演会でした。
はじめに生命保険会社のお偉いさんがご挨拶。その後、中島誠之助さんの講演が始まりました。
番組開始当初のエピソードや島田紳介さん、石坂さん、アシスタントの吉田さんの話とかがあって、楽しめました。鑑定品の話も大体どんなものかわかりました。
一番、なるほどと思ったのは、中島さんは同業者に嫌がらせを受けたということです。そういえば、同業者が売ったものを”これはにせものです”とかいうわけですものね。うらまえれないはずはありません。いろいろ苦労があったんですね~!
トレードマークの着物も3回目からだそうです。最初はスーツだったとのこと。。。
先輩のおかげで楽しいときを過ごせました。ありがとうございました。
  1. 2008年02月01日 05:53 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0