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

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

FPGAの部屋

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

大晦日スキーに行ってきました

今日は大晦日スキーに新車で行っていました。
いったのは例によって、ハンターマウンテン塩原。快調に行って、8時20分ころ着きました。最初は雪は降っていないで曇りでしたが、だんだん雪が降ってきました。リフトに乗っていると雪ダルマになりました。眉毛に雪がついて、凍って痛くなったりと大変でした。
Hunter_071231.jpg

うちの奥さんは寒くてだめと午前中でダウン。息子も突き指があって痛くてだめとやはりダウン。娘たちと滑っていました。雪がひどくなってきたので、午後3時ころ上がって帰りました。帰りは鬼怒川温泉の岩風呂で温泉に入るために、鬼怒川温泉側に下りました。降りる途中までしっかり雪道でした。新品のスタッドレスタイヤを履いていたので、問題なくクリア。
鬼怒川温泉の岩風呂に着いたら臨時休業。がっくり。年末年始は休みかな?
宇都宮の山岡やで年越しそばならぬ年越しラーメンを食べて、下妻の温泉に行きました。
車は良かったです。乗りやすいし、高速で安定していました。大晦日だと車も少なく、帰りが楽ですよ。
  1. 2007年12月31日 22:25 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ステップワゴン

stepwagon_071230.jpg

これが12月28日に納車になった。ステップワゴンの赤です。赤と言っても深い赤です。
ナンバーは6809です。後ろと前に2つ6809があるのでFM-8号と名づけました。(ナンバーまで公開してしまうとまずいかな?)
まだ新車の匂いがくさいです。今、窓全開で換気中です。(新車の匂いが苦手)
ステップワゴン、下のグレードなのに装備が満載です。左だけですが、オートドアとか、とまると間欠になるワイパー、ワイパーももしかしたら寒冷地用?カバーに覆われているみたいです。オートエアコンなどなど。
  1. 2007年12月30日 16:30 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4

2007年の軌跡

2007年に何をブログに書いてきたかを振り返ってみたいと思う。

1月:
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションをやった。VerilogのModelSimシミュレーションを失敗しながら、Verilog構文の疑問に突き当たりながらも、何とか突破。慣性遅延にも引っかかったし、Verilogでのステートマシンのシミュレーション時のステート表記方法にも引っかかった。(いろいろ教えてくれた方、ありがとうございました。)

2月:
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションが完成して、Verilogファイルを公開。ぽっぽファクトリーさんとたっくさんからVeritakシミュレータでシミュレーションできないという指摘を頂いた。いろいろご指導いただいてありがとうございました。Verilogの勉強になりました。
次に、Verilog2001版DDR SDRAMコントローラーをインプリメントしてスパルタン3スタータキットで動作確認した。動作して一安心。

3月:
Veritakシミュレータを購入して使ってみた、大きなシミュレーションはModelSimよりも早くなった。
PSoCセミナにも行ってきたな~。
Virtex5のお勉強を始めた。使ってみたかったPLLを使ってみた。
Virtex5, Virtex4, Spartan3EのDDR SDRAMコントローラのインプリメント(MAP)結果を比較してみた。
Spartan3E Starter KitのVGAコントローラをVerilogで書こうとしたが、これは難しい(面倒)なので挫折。モチベーションが足りなかった。

4月:
【ザイリンクス PCI EXPRESS ソリューション & ISE 9.1i 解体新書】ウェブセミナを見てPartitionとSmartGuide、SmartPrevieを試してみた。
そういえば息子の中学校の入学式もあった。このころは腰が痛くなっていけなくなったが、大分学校に行けるようになってきたので良かった。
ISEのTest Bench Waveformでの複数クロックを使用するISEシミュレーションをやったみたい。これなんでやったか忘れてしまった。
ChipScopeからの波形保存の方法とその波形をModelSimで見る方法も書いたっけ。
日経エレクトロニクスの組み込み速習キットの記事も書いたが、その後まったく使っていない。
初めての遊戯王カード、親子タッグデュエルもやったっけ。緊張したな~。

5月:
MIPSプロセッサコアPlasmaをやってみようということで、MIPS用binutils, gcc, gdbのビルドをしたが、どうしてもgdbのビルドが出来なかった。もう一度やってみたい。Plasmaが動くと良いな。
いろいろ雑多なブログを書いている。20万アクセスも達成した。ESEC2007。
そういえば家の近くで強盗致傷事件があった。何事かと思ったな。
スパルタン3スタータキットのキャラクタ・ディスプレイ・コントローラを公開
5/26 自転車で転んで右腕を骨折(ひび) キーボードが打てなくてつらかった~。

6月:
キーボードは骨折のためまだ打てない。
奥さんの新車が来た(ダイハツ ビーゴ)
骨折した腕が痛くてもディズニーランドも行った。同じくX-fest2007も。
6/21 腕のリハビリ終了。大分良くなったが、まだ本調子ではない。
キャラクタ・ディスプレイ・コントローラもVerilog2001に出来たので、Veritakでシミュレーションをしてみた。
PCI Express Fair 2007も行ってきた。このころは腕は大分大丈夫になって来た。
Verilog2001版キャラクタ・ディスプレイ・コントローラを公開。VHDL版は残念ながら実験の課題なので非公開。
PCI-Xテスト・モジュールを作っている。
アサーションに興味を持ってきた。

7月:
PCI-Xターゲット・モジュールのシミュレーションをした。大分出来てきた。
PCI-Xバスのセットアップ時間などの規格に対応するためにIOBに入出力用FFを入れるのに苦労した。
キーボードの話もあったな~。皆さん、良いキーボードを使っていらっしゃるようだ。私は古い富士通のキーボード。
PCI-Xターゲットモジュールが出来てきたので、インプリしてChipscopeでコンフィギュレーション・アクセスやターゲット・アクセスの動作チェック。
そういえば洗濯機を買ったんだった。今年はいろんなものを購入してお金が飛んでしまった。
夏休み自由研究サポート企画もやったな。

8月:
息子が小学校の時の修学旅行に行けなかったので、江ノ島・鎌倉に良好に行った。久しぶりの鎌倉、良かった。江ノ島の生シラスおいしかった。また食べたい。
PCI-Xマスタ・モジュールのテスト。
FFをIOBに入れるためのVHDLの書き方(Synplify Pro編)。この辺は私にとって重要。
ディズニーシーにも行った。今年は結構行っているな。
一番下の娘の自由研究のために、化石のクリーニングや石の自由研究のために那珂川に行った。
PS/2キーボードをキャラクタ・ディスプレイ・コントローラにつないだ。これは実験用。
USBひんやりクッションを買った。これはしばらく使用したが、寒くなってやめた。当然。
8月の最後にぎっくり腰になった。今年はいろいろ怪我をしている。歳かな?

9月:
たーぼ のハードウェア設計記録さんのブログに触発されて、ブロック文を使って、1つのファイルの中に2つのステートマシンのステート名を同一にできた。
小学校、中学校の運動会もあった。息子が出られたのがうれしかった。
やはり、たーぼ のハードウェア設計記録さんを見てVHDLの共有変数のシュミレーションでの使い道を検討した。
VALID制約もやったな。
そういえば、カテゴリの目次を作った。最近、目次への追加をサボっているので、追加しようと思う。

10月:
初めてVHDLのprocedure文を使って見た。結構スマートにテストベンチを書くことができた。
カテゴリの目次だけでは、使い勝手がいまいちだったので、目次の目次も作った。
アサーションも勉強したっけ。これはVHDLコードでのアサーション。
VHDLのprocedure文に対して、Verilogのtask文を使用してシミュレーション。
たっくさんから $timeformat を教えてもらった。
キャラクタ・ディスプレイ・コントローラのシミュレーションをした。テキストの*でアスキーキャラクタを表示。
@eleのオフ会に参加
電子系自営業者の開発日誌さんのブログが消えてしまって、とてもさびしかった。
Virtex5, Virtex4, Spartan3AはFloorplan Editorについて書いた。
FPGA Editorで配置と配線を割り当てる方法をやってみた。

11月:
上の娘の高校説明会に行ったな~。
下の娘にマフラーを編んでもらったり、毛糸玉の一日を書いてもらった。うれしかった。
ET2007に行ってきた。
Suzaku-VのためにVirtex4のISERDESのお勉強を本格的に始めた。
12年乗っていたエスティマ・ルシーダが壊れてステップワゴンを注文した。
ほかの暗黙のwire宣言を使っているその他のVerilogコードをコンパイルするとエラーになってしまう。そのためにテストベンチの最後に必ず`default_nettype wireを書いておく。これは今も肝に命じないと。。。たっくさん、ありがとうございました。
glbl.vの注意点もある。この辺は忘れないようにしないと、と言っても忘れてしまう。
引き続きISERDESのお勉強。

12月:
そして今月。
学研の真空管アンプとWii Fitを買った。真空管アンプ用には後でスピーカーを購入した。Wii Fitは毎朝やっている。毎日の習慣になった。
FPGAの同期リセットの方が有利とのhypermacさんから教えてもらって検証してみた。その結果XSTは同期リセットの方が良いとの結果だった。SynplifyでPCI-Xを論理合成したときには、IOBのFFの関係で非同期リセットの方が良いようだった。
System Verilogセミナー(アサーションコース)に行ってきました。
PCI-Xテストモジュールのスプリット完了のテストをした。
後はクリスマスか。。。
28日にステップワゴンが来た。

こうして1年を振り返ってみると、ずいぶんブログを書いた。ブログに図がいっぱいあるという感じがした。また、いろいろな方にも助けられている。ありがとうございます。
Verilogについては、今年初めよりもだいぶ経験値が上がった気がする。やはり、皆さんに教えて頂いたおかげと思っています。
来年もよろしくお願いいたします。
  1. 2007年12月30日 09:22 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

祝40万アクセス

access_400000_071227.png

今日、FPGAの部屋が40万アクセスを記録しました。皆さん、ありがとうございます。
これからもブログを書いていきたいと思います。よろしくお願いします。
#今日、自分のブログを見てみたら399,99?アクセスだったので、自分でカウンタを進めちゃいました。
  1. 2007年12月27日 20:31 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

今後の目標

お仕事のほうは、PCI-Xバスのプロトコル部分は出来たので、今度はデータパスを作る予定。SDR SDRAMコントローラは出来ているので、PCI-XバスとSDR SDRAMコントローラをつないで133MHzバスで動作するかを見る予定である。
Suzaku-VのDDR2-SDRAMコントローラの方はとりあえずインターフェースとして、7セグLEDやスイッチの動作確認用回路を作っているところだが、朝は寒いしなかなか進んでいない。正月休み中にやろうと思っている。

あと1日、12月28日に新車がいよいよ納車だ。楽しみ。車は赤のステップワゴン。でも、新車のにおいがひどくないと良いのだけれど。。。年末スキーに行く予定なのだが、長時間乗っていられないかもしれない。
そういえば、今は代車で14万キロ走ったシビック何だけど、結構調子が良い。これならばホンダも古くなっても大丈夫かな?
  1. 2007年12月27日 05:12 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:4

クリスマス・イブ2007

今日はクリスマス・イブだ。奥さんは今日お仕事なので、カスミ(スーパー)でオードブルを買ってきた。ケーキは例によって、守谷のもみの木のケーキ。今年はアンパンマン・イチゴムースとモンブラン。
食事メニューはオードブルとチーズホンデュ。本当はチーズフォンデュ用のパンを買ってくるように私が奥さんに頼まれたのだが、ブロッコリーは買ってもパンを買うのを忘れてしまった。でも、オードブルでいろんなものがあるので、これをチーズをつけて食べることにした。なかなかおいしかった。やみなべみたいでいける!!!
Xmas_1_071224.jpg

真ん中にあるのが生協のお手軽なチーズフォンデュ。
さらに、かにの炊き込みご飯もある。結構満足した。
さて、今日の本命のケーキ登場。アンパンマンの口の両端と額にろうそくをグサリ。モンブランにも2本刺して。。。
Xmas_2_071224.jpg

火をつけました。
Xmas_3_071224.jpg

なんか、ちょっと不気味な気がしますが、みんな相当うけていました。
その後切り分けて、ケーキを食べました。アンパンマンはイチゴムースがおいしかったです。モンブランはクリームにかなり洋酒が効いていて、大人はおいしかったです。(子供はまだ食べていません)
今日は、サンタさんからのプレゼントです。明日はどうかな?
  1. 2007年12月24日 22:07 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ジャンプフェスタ2008に行ってきました

今日は急遽、息子と一緒に幕張メッセで開かれているジャンプフェスタ2008に行ってきました。
今日は、奥さん仕事なので、お昼ご飯を食べさせてから、息子と一緒にTXと武蔵野線を乗り継いで幕張メッセに行きました。
目的は、OCG デュエルモンスターズ PREMIUM PACK 11を購入することです。
行ってみると、遅く行ったせいか、あまり待ち時間なく買えました。1人5パックなので、2人で10パック買いました。合計3,000円です。
大人も買っていますが、これは買って転売すると儲かるということもあります。Yahooオークションとかでカードをまとめたものとか、PP11パックで売っています。カードによって価格は違いますが、カードをまとめると10倍以上で売っていることもあります。10パック全部転売すると結構な値段になります。まあ、私は売りませんが。。。儲ける気ならば、もう3回くらい買いに行っていました。
会場に入って、息子がお目当てのカード・デュエル会場にいきましたが、整理券も配布が終わって出来ません。がっくり。これもやるとカードをもらえます。こういうカードが高いようです。
ちょっと会場を見回って、帰ってきました。
junp_fes_1_071223.jpg
junp_fes_2_071223.jpg
  1. 2007年12月23日 22:38 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

学研の真空管アンプ用のスピーカーとエンクロージャー

vt_amp_speaker_071222.jpg

”学研の真空管アンプ用のスピーカーとエンクロージャーを注文”で、学研の真空管アンプ用にコイズミ無線に頼んだスピーカーとエンクロージャーが来て、組み立てました。とはいっても、スピーカーをエンクロージャーにねじ止めしただけです。
エンクロージャーは木ねじで裏蓋が外れると思っていたのですが、外れませんでした。しまった。すろ~り~さんが言ってらしたのはこれだったのか?裏側から当て木をして付けようという目論見が外れてしまいました。しょうがないので、表からつけることにしました。
スピーカーが浮いているので、たいした音はしないかな?と思って聞いてみたのですが、それがどうして、すごくいい音で鳴ってくれています。感激。
少し低い音のダンピングが甘い気がしますが、十分オーケー。スピーカーが浮き上がっているところの隙間を紙粘土か、何かでふさごうと思いましたが、やめました。
いつも、朝、布団を畳む時とかに、携帯の音楽プレーヤーで聞いています。買ってよかった~。
  1. 2007年12月22日 11:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

FPGA同期リセット変更(PCI-Xテスト・モジュール)

FPGAの非同期リセットと同期リセットの比較は終わって、同期リセットの方がよいということになった。PCI-Xテスト・モジュールも大体完成したので、これを同期リセットに直すことにした。
それで、直したのだが、どうもタイミング制約が満足できない。
まずはADが満足できない。それは、出力バッファのイネーブル制御がIOBのFFに入らなくなってしまったためのようだ。元の(非同期リセットの)ADの宣言や関係している部分を抜き出すと、下のようになる。
ちなみに使っている論理合成ツールはSynplify Pro 8.5, ISEは9.1SP3。

        ad : inout std_logic_vector(63 downto 0); -- アドレスとデータ

signal pcix_dout_ena, master_dout_ena : std_logic;

attribute syn_useioff of pcix_dout_ena : signal is true;

    process(reset, pcix_clk) begin -- ADのイネーブルをIOBに入れる
        if reset='1' then
            pcix_dout_ena <= '0';
        elsif pcix_clk'event and pcix_clk='1' then
            pcix_dout_ena <= target_dout_ena or master_dout_ena;
        end if;
    end process;
    process(pcix_dout, pcix_dout_ena) begin -- PCIX_ADへの出力トライステート・バッファ
        if pcix_dout_ena='1' then
            ad <= pcix_dout;
        else
            ad <= (others => 'Z');
        end if;
    end process;


1行目はADの入出力ポート宣言、2行目はpcix_dout_enaの宣言、3行目はsyn_useioffを宣言して各ADのIOBに出力バッファのイネーブル制御用FFをインスタンシエーションするように指定している。4行目からはVHDLコード。これで各ADのIOBに出力バッファのイネーブル制御用FFをインスタンシエーションすることができている。
PCI_AD10_IOB_AR_071221.png

Timing Analyzerでみた遅延も規格内に収まっている。

Timing constraint: COMP "pcix_ad(10)" OFFSET = OUT 3.8 ns AFTER COMP "pcix_clk";

 2 items analyzed, 0 timing errors detected.
 Minimum allowable offset is   3.086ns.
--------------------------------------------------------------------------------
Slack:                  0.714ns (requirement - (clock arrival + clock path + data path + uncertainty))
  Source:               pcix_inst/pcix_dout[10] (FF)
  Destination:          pcix_ad(10) (PAD)
  Source Clock:         clk_dcm rising at 0.645ns
  Requirement:          3.800ns
  Data Path Delay:      2.715ns (Levels of Logic = 0)
  Clock Path Delay:     -0.274ns (Levels of Logic = 3)
  Clock Uncertainty:    0.000ns

  Clock Path: pcix_clk to pcix_inst/pcix_dout[10]
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tiopi                 0.921   pcix_clk
                                  dcm_pcix_inst/CLKIN_IBUFG_INST
    net (fanout=1)        0.431   dcm_pcix_inst/CLKIN_IBUFG
    Tdcmino              -4.145   dcm_pcix_inst/DCM_INST
    net (fanout=1)        1.185   dcm_pcix_inst/CLK0_BUF
    Tgi0o                 0.057   dcm_pcix_inst/CLK0_BUFG_INST
    net (fanout=681)      1.277   clk_dcm
    ----------------------------  ---------------------------
    Total                -0.274ns (-3.167ns logic, 2.893ns route)

  Data Path: pcix_inst/pcix_dout[10] to pcix_ad(10)
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tiockp                2.715   pcix_inst/pcix_dout[10]
                                  pcix_ad_iobuf[10]/OBUFT
                                  pcix_ad(10)
    ----------------------------  ---------------------------
    Total                 2.715ns (2.715ns logic, 0.000ns route)
                                  (100.0% logic, 0.0% route)



これを同期リセットに修正すると、どうもADのイネーブル信号が1つにまとめられてしまうようだ。下のようにpcix_dout_enaをバスにしてみたが、それでもだめなようだ。

signal pcix_dout_ena : std_logic_vector(63 downto 0);

attribute syn_useioff of pcix_dout_ena : signal is true;
attribute syn_keep of pcix_dout_ena : signal is true;

    process(pcix_clk) begin -- ADのイネーブルをIOBに入れる
        if pcix_clk'event and pcix_clk='1' then
            for i in 63 downto 0 loop
                if reset='1' then
                    pcix_dout_ena(i) <= '0';
                else
                    pcix_dout_ena(i) <= target_dout_ena or master_dout_ena;
                end if;
            end loop;
        end if;
    end process;
    process(pcix_dout, pcix_dout_ena) begin -- PCIX_ADへの出力トライステート・バッファ
        for i in 63 downto 0 loop
            if pcix_dout_ena(i)='1' then
                ad(i) <= pcix_dout(i);
            else
                ad(i) <= 'Z';
            end if;
        end loop;
    end process;


Timing Analyzerでの解析結果はこれ。

Timing constraint: COMP "pcix_ad(10)" OFFSET = OUT 3.8 ns AFTER COMP "pcix_clk";

 2 items analyzed, 1 timing error detected.
 Minimum allowable offset is   3.946ns.
--------------------------------------------------------------------------------
Slack:                  -0.146ns (requirement - (clock arrival + clock path + data path + uncertainty))
  Source:               pcix_inst/pcix_dout_ena[0] (FF)
  Destination:          pcix_ad(10) (PAD)
  Source Clock:         clk_dcm rising at 0.645ns
  Requirement:          3.800ns
  Data Path Delay:      3.588ns (Levels of Logic = 1)
  Clock Path Delay:     -0.287ns (Levels of Logic = 3)
  Clock Uncertainty:    0.000ns
  Timing Improvement Wizard
  Clock Path: pcix_clk to pcix_inst/pcix_dout_ena[0]
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tiopi                 0.921   pcix_clk
                                  dcm_pcix_inst/CLKIN_IBUFG_INST
    net (fanout=1)        0.431   dcm_pcix_inst/CLKIN_IBUFG
    Tdcmino              -4.145   dcm_pcix_inst/DCM_INST
    net (fanout=1)        1.185   dcm_pcix_inst/CLK0_BUF
    Tgi0o                 0.057   dcm_pcix_inst/CLK0_BUFG_INST
    net (fanout=687)      1.264   clk_dcm
    ----------------------------  ---------------------------
    Total                -0.287ns (-3.167ns logic, 2.880ns route)

  Data Path: pcix_inst/pcix_dout_ena[0] to pcix_ad(10)
    Delay type         Delay(ns)  Logical Resource(s)
    ----------------------------  -------------------
    Tcko                  0.374   pcix_inst/pcix_dout_ena[0]
    net (fanout=64)       0.629   pcix_inst/pcix_dout_ena_1(0)
    Tiotp                 2.585   pcix_ad_iobuf[10]/OBUFT
                                  pcix_ad(10)
    ----------------------------  ---------------------------
    Total                 3.588ns (2.959ns logic, 0.629ns route)
                                  (82.5% logic, 17.5% route)


V2proを使用したPCI-X 133MHzでは、IOBにFFを入れないとタイミングを満足できないので、FFがIOBに入らないのは致命的だ。
Synplify proを使用するときは、とりあえず非同期リセットで行くことにした。
  1. 2007年12月21日 16:44 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:0

PCI-Xスプリット完了(その後)

PCI-Xスプリット完了のバグが解決した。
1つ目の”ホストPCがNMIを受信してしまい、You probably have a hardware problem with your RAM chipsと表示が出る”というのは、パリティが間違っていて、パリティエラーが起こると、この表示が出るようだ。パリティのHDLコードを見直したところ、バグがあったので修正したら、このメッセージは出なくなった。
2つ目の”ダンプデータが0番地(ボードのアクセス番地は4)は0、4番地(ボードのアクセス番地は0)は6、8番地は0、C番地は8。1つおきにデータが取れていない”というのは、スプリット完了の際にアドレスフェーズのAD[6:0]でスプリット応答したときのLow Addressを返していたのだが、よくよく仕様書を読んでみるとDWORD読み出しのときのアドレスフェーズのAD[6:0]は0にしろと書いてあった。それで0のときしかだめだったのか?AD[2]は何か他の事に使っているようだ?0に修正したところ、全部データが読めるようになった。
下の図は、ちゃんと読みだせたときの波形。
pcix_split_completion_071220.png

XカーソルがホストPCからのDWORDリードのアドレス、D8000004だけど、Oカーソルの位置のスプリット完了のアドレスフェーズでは0にした。ちなみにOカーソルのところのデータのうち、Fはタグ番号。

# 1つ目のバグ(パリティ)は、昨日、お風呂に入っているときに思いついた。何気なくしているときやお風呂掃除などをしているときに、ふと解決法について思いつくことがあるのだ。
  1. 2007年12月20日 14:33 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

PCI-Xスプリット完了

ホストPCからPCI-Xターゲット・アクセスをしてきたときに、内部レジスタ以外はスプリット応答で返すことにした。その際に、PCIマスタ・モジュールを用いて、スプリット完了を64ビットアクセスで返したところ、ホストPCがNMIを受信してしまい、You probably have a hardware problem with your RAM chipsと表示が出てしまった。
ダンプデータも0番地(ボードのアクセス番地は4)は0、4番地(ボードのアクセス番地は0)は6、8番地は0、C番地は8。1つおきにデータが取れていない。
これがChipscopeで撮った波形。
pcix_split_completion_071218.png

最初のアクセスがTRDY#='0', DEVSEL#='1', STOP#='1'で応答しているのでスプリット応答、その次のアクセスのC/BE#が"C"で始まっているのでスプリット完了である。
最初のアクセスのリクエスタ・ファンクション番号は0、リクエスタ・デバイス番号は0、リクエスタ・バス番号は0。タグ番号は14。
ボードのファンクション番号は0、デバイス番号は2、バス番号は4。

スプリット完了時のアドレスフェーズのC/BE#はC。Split CompletionなのでOK。タグ番号は14、リクエスタの3つの番号は、0,0,0、ローアドレスも4でOK。(14000004)
アトリビュートフェーズのC/BE#は0。ファンクション番号は0、デバイス番号は2、バス番号は4。ビット29,30,31も0でOK。(00041004)
その後、データフェーズでC/BE#が0になっていて、オール1に保持されていないのは問題だ。(修正予定)

やはり、データフェーズでC/BE#をオール1にしても、ホストPCがNMIを受信してしまい、You probably have a hardware problem with your RAM chipsと表示が出るのは変わらない。
pcix_split_completion_071219.png


どうやら、Memory read DWORDに64ビットアクセスでスプリット完了を返すのは問題があるのかもしれない。そうではないようだ。32ビットアクセスでやってみたが同様にだめ。
1つバグがあった、下の図で、pcix_req_b_cがピンクの矢印で、いったんリクエストが解除されている。これは、PCI-Xマスタ転送メイン・ステートマシンがバグでバス・パーキングの状態になってしまったためである。このバグのためにスプリット完了トランザクションがなくなってしまっていた。
バグは解消できたが、まだNMIがかかってしまう。
pcix_split_completion_2_071219.png
  1. 2007年12月19日 13:44 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:0

FPGAの非同期リセットと同期リセットの比較(DDR-SDRAMコントローラ)

FPGAの非同期リセットと同期リセットの比較(Verilog)でどたばたしてしまったが、無事にスパルタン3EスタータキットでDR-SDRAMコントローラが非同期リセットと同期リセットでインプリメントできたので、比べてみようと思う。(使用ツールはISE9.2iSP3、使用デバイスはスパルタン3E、xc3s500e-4fg320)
まずは非同期リセットのマップリポートは以下のようになった。

Design Summary
--------------
Number of errors:      0
Number of warnings:    2
Logic Utilization:
  Number of Slice Flip Flops:         575 out of   9,312    6%
  Number of 4 input LUTs:             512 out of   9,312    5%
Logic Distribution:
  Number of occupied Slices:                          582 out of   4,656   12%
    Number of Slices containing only related logic:     582 out of     582  100%
    Number of Slices containing unrelated logic:          0 out of     582    0%
      *See NOTES below for an explanation of the effects of unrelated logic
Total Number of 4 input LUTs:            800 out of   9,312    8%
  Number used as logic:                512
  Number used as a route-thru:          64
  Number used for Dual Port RAMs:      172
    (Two LUTs used per Dual Port RAM)
  Number used for 32x1 RAMs:            52
    (Two LUTs used per 32x1 RAM)
  Number of bonded IOBs:               66 out of     232   28%
    IOB Flip Flops:                    49
  Number of ODDR2s used:               38
    Number of DDR_ALIGNMENT = NONE     38
  Number of Block RAMs:                1 out of      20    5%
  Number of GCLKs:                     6 out of      24   25%
  Number of DCMs:                      3 out of       4   75%

Total equivalent gate count for design:  113,940
Additional JTAG gate count for IOBs:  3,168
Peak Memory Usage:  161 MB
Total REAL time to MAP completion:  20 secs 
Total CPU time to MAP completion:   19 secs 


つぎは同期リセットのマップリポート。

Design Summary
--------------
Number of errors:      0
Number of warnings:    2
Logic Utilization:
  Number of Slice Flip Flops:         576 out of   9,312    6%
  Number of 4 input LUTs:             459 out of   9,312    4%
Logic Distribution:
  Number of occupied Slices:                          576 out of   4,656   12%
    Number of Slices containing only related logic:     576 out of     576  100%
    Number of Slices containing unrelated logic:          0 out of     576    0%
      *See NOTES below for an explanation of the effects of unrelated logic
Total Number of 4 input LUTs:            747 out of   9,312    8%
  Number used as logic:                459
  Number used as a route-thru:          64
  Number used for Dual Port RAMs:      172
    (Two LUTs used per Dual Port RAM)
  Number used for 32x1 RAMs:            52
    (Two LUTs used per 32x1 RAM)
  Number of bonded IOBs:               66 out of     232   28%
    IOB Flip Flops:                    49
  Number of ODDR2s used:               38
    Number of DDR_ALIGNMENT = NONE     38
  Number of Block RAMs:                1 out of      20    5%
  Number of GCLKs:                     6 out of      24   25%
  Number of DCMs:                      3 out of       4   75%

Total equivalent gate count for design:  113,633
Additional JTAG gate count for IOBs:  3,168
Peak Memory Usage:  160 MB
Total REAL time to MAP completion:  20 secs 
Total CPU time to MAP completion:   19 secs 


Number of Slice Flip Flops:は非同期リセットが575に対して、同期リセットが576で1つ多い。
Number of 4 input LUTs: は非同期リセットが512に対して、同期リセットが459で53少ない。
Number of occupied Slices:は非同期リセットは582に対して、同期リセットは576で6少ない。
Number of Slice Flip Flops:が同期リセットの方が1つ増えているが、全体的には同期リセットのほうが使用リソースが低いという結果になった。
なお、ツールのデフォルトから、以下の項目を変更してある。
1.XSTのプロパティのOptimization EffortをHigh
2.MAPのプロパティのOptimization Strategy (Cover Mode)をSpeed
3.Place & RouteのプロパティのPlace & Route Effort Level (Overall)をHigh
4.Place & RouteのプロパティのExtra Effort (Highest PAR level only) をContinue on Impossible

最後に動作周波数の違いを比べてみようと思います。
通常は50MHzの水晶発振器を2倍の100MHzにして使っています。つまりDDR200名わけですが、これを66MHzの水晶発振器をつけたと仮定して、DDR266でいけるかどうかやってみました。
その結果、非同期リセットのP&Rリポートです。

------------------------------------------------------------------------------------------------------
  Constraint                                |  Check  | Worst Case |  Best Case | Timing |   Timing   
                                            |         |    Slack   | Achievable | Errors |    Score   
------------------------------------------------------------------------------------------------------
* TS_ddr_sdram_cont_inst_dcm_module_inst_cl | SETUP   |    -1.741ns|     9.241ns|      88|       60600
  k_node = PERIOD TIMEGRP         "ddr_sdra | HOLD    |     0.902ns|            |       0|           0
  m_cont_inst_dcm_module_inst_clk_node"     |         |            |            |        |            
       TS_dcm100_inst_CLK2X_BUF HIGH 50%    |         |            |            |        |            
------------------------------------------------------------------------------------------------------
* TS_dcm100_inst_CLK0_BUF = PERIOD TIMEGRP  | SETUP   |    -0.017ns|    15.034ns|       1|          17
  "dcm100_inst_CLK0_BUF" TS_clk HIGH        | HOLD    |     0.758ns|            |       0|           0
    50%                                     |         |            |            |        |            
------------------------------------------------------------------------------------------------------
  TS_dcm100_inst_CLK2X_BUF = PERIOD TIMEGRP | SETUP   |     0.056ns|     7.444ns|       0|           0
   "dcm100_inst_CLK2X_BUF" TS_clk / 2       | HOLD    |     1.369ns|            |       0|           0
     HIGH 50%                               |         |            |            |        |            
------------------------------------------------------------------------------------------------------
  TS_ddr_sdram_cont_inst_dcm_module_inst_cl | SETUP   |     0.298ns|     6.904ns|       0|           0
  k90_node = PERIOD TIMEGRP         "ddr_sd | HOLD    |     2.397ns|            |       0|           0
  ram_cont_inst_dcm_module_inst_clk90_node" |         |            |            |        |            
           TS_dcm100_inst_CLK2X_BUF PHASE 1 |         |            |            |        |            
  .875 ns HIGH 50%                          |         |            |            |        |            
------------------------------------------------------------------------------------------------------
  TS_ddr_sdram_cont_inst_clk1_161 = PERIOD  | SETUP   |     0.810ns|     4.952ns|       0|           0
  TIMEGRP         "ddr_sdram_cont_inst_clk1 | HOLD    |     1.431ns|            |       0|           0
  _161" TS_dcm100_inst_CLK2X_BUF * 16 HIGH  |         |            |            |        |            
  50%                                       |         |            |            |        |            


次に同期リセット。

------------------------------------------------------------------------------------------------------
  Constraint                                |  Check  | Worst Case |  Best Case | Timing |   Timing   
                                            |         |    Slack   | Achievable | Errors |    Score   
------------------------------------------------------------------------------------------------------
* TS_ddr_sdram_cont_inst_dcm_module_inst_cl | SETUP   |    -1.248ns|     8.748ns|      76|       41070
  k_node = PERIOD TIMEGRP         "ddr_sdra | HOLD    |     0.926ns|            |       0|           0
  m_cont_inst_dcm_module_inst_clk_node"     |         |            |            |        |            
       TS_dcm100_inst_CLK2X_BUF HIGH 50%    |         |            |            |        |            
------------------------------------------------------------------------------------------------------
* TS_dcm100_inst_CLK0_BUF = PERIOD TIMEGRP  | SETUP   |    -0.434ns|    15.868ns|       1|         434
  "dcm100_inst_CLK0_BUF" TS_clk HIGH        | HOLD    |     0.765ns|            |       0|           0
    50%                                     |         |            |            |        |            
------------------------------------------------------------------------------------------------------
  TS_ddr_sdram_cont_inst_dcm_module_inst_cl | SETUP   |     0.233ns|     7.034ns|       0|           0
  k90_node = PERIOD TIMEGRP         "ddr_sd | HOLD    |     2.449ns|            |       0|           0
  ram_cont_inst_dcm_module_inst_clk90_node" |         |            |            |        |            
           TS_dcm100_inst_CLK2X_BUF PHASE 1 |         |            |            |        |            
  .875 ns HIGH 50%                          |         |            |            |        |            
------------------------------------------------------------------------------------------------------
  TS_dcm100_inst_CLK2X_BUF = PERIOD TIMEGRP | SETUP   |     0.394ns|     7.106ns|       0|           0
   "dcm100_inst_CLK2X_BUF" TS_clk / 2       | HOLD    |     1.421ns|            |       0|           0
     HIGH 50%                               |         |            |            |        |            
------------------------------------------------------------------------------------------------------
  TS_ddr_sdram_cont_inst_clk1_161 = PERIOD  | SETUP   |     0.887ns|     4.959ns|       0|           0
  TIMEGRP         "ddr_sdram_cont_inst_clk1 | HOLD    |     1.382ns|            |       0|           0
  _161" TS_dcm100_inst_CLK2X_BUF * 16 HIGH  |         |            |            |        |            
  50%                                       |         |            |            |        |            


X1つまり66MHzのクリティカルパスは、非同期リセットの方が遅延が少ないが、同期リセットの方がX2つまり133MHzのクリティカルパスの遅延が少なくなっている。
やはり、LUTが少ないほうが遅延が少ないような気がするが、痛みわけだろうか?いろいろな要因で違ってくると思うし、コストテーブルを変更すると違った結果になるかもしれない。

このような結果と、いろいろ他の方からも同期リセットの方がよいと教えてもらいましたし、今度からは、すべての回路を同期リセットで書くようにしようと思います。
  1. 2007年12月19日 06:32 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:0

FPGAの非同期リセットと同期リセットの比較(Verilog)

今度はVerilogのDDR-SDRAMコントローラでやってみようと思って、非同期リセットの変えたつもりでやってみたら、使用LUTが変わらない。これはおかしいと思って、FPGA Editorで見てみたら、非同期リセットが使われていた。どうしてだろうか?
ソースコードはこれ。(だけじゃないけど。。。全部同期リセットにしたつもり)(使用ツールはISE9.2iSP3、使用デバイスはスパルタン3E、xc3s500e-4fg320)

    always @(posedge clk) begin
        if (reset) begin
            pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
            pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
        end else begin
            if (int_cnt != 0) // int_cntが0までカウント
                pre_cnt <= pre_cnt + 1;
            else begin
                pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
                pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
            end
        end
    end


Verilogに詳しい方どうでしょうか? これで同期リセット記述になっていますよね?
ちなみにこれでもだめだった。

    always @(posedge clk) begin
        if (reset) begin
            pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
            pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
        else if (int_cnt != 0) // int_cntが0までカウント
            pre_cnt <= pre_cnt + 1;
        else begin
            pre_cnt[PRE_CNT_WIDTH-1 : 1] <= 0;
            pre_cnt[0] <= 1'b1; // 最初に0だとint_cntがダウンカウントするので
        end
    end


これを論理合成して、"View RTL Schematic"で見るとこうなる。
sync_reset_FF_1_071216.png

FDCは非同期リセット付きFFで、FDPは非同期セット付きFFだ。つまりどちらも非同期セット、リセットしている。どうしたら同期セット、リセットになるのだろうか?
ちなみにXSTのプロパティのXilinx Specific Options の Use Synchronous Set と Use Synchronous Reset オプションは両方ともYes になっている。
しょうがないので、XSTのプロパティの HDL Options の Asynchronous To Synchronous オプションをチェックしたら、同期セット、リセットとなった。
これを論理合成して、"View RTL Schematic"で見るとこうなる。
sync_reset_FF_2_071216.png

FDRは同期リセット付きFF、FDSは同期セット付きFF。これで思い通りになったが、釈然としない。
Verilogコードが間違っているとか、または、何か他の情報を持っているという方は教えてください。一応、Xilinxのアンサーサーチをあさったのですが、情報がありませんでした。

2007/12/18 追記: sueさんに教えてもらった結果を見て、単純なカウンタをやってみました。これはちゃんと同期リセットになりました。そこでもう一度プロジェクトを作り直したら、FDRとFDSを使うようになりました。何かプロジェクトがおかしかったみたいです。
sueさん、ありがとうございました。
  1. 2007年12月16日 22:00 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:2

学研の真空管アンプ用のスピーカーとエンクロージャーを注文

”すろーりー ろぐ”さんの”大人の科学真空管アンプ用小型スピーカーの製作 その後4”を見ていると、ちょうど良いスピーカーが載っていたので、我慢できずに、私もコイズミ無線スピーカーを購入しました。
私はエンクロージャーまで作るつもりがなかったので、バスレス・エンクロージャーも購入。
これで、いい音が聞けると良いなと思います。
音楽ソースは適当なのが何もないかなと思っていたら、そういえば携帯が音楽聴けるのでした。これをソースに学研の真空管アンプとスピーカーを鳴らしてみようと思います。どちらも電池なので移動できますしね!
  1. 2007年12月16日 06:22 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:6

System Verilogセミナー(アサーションコース)に行ってきました

その前にfpga-lab.orgさんの2007年12月12日付の徒然日記でChipScopeのことで感謝されていたようだが、なんかやったんだっけ?覚えがない。ぼけてしまったか?BUSのことかな?
fpga-lab.orgさんのChipScopeのTokenのやり方のほうが役に立つ気がする? それでも面倒なので、ステート名にしたことはないのだけれども。。。

System Verilogセミナー(アサーションコース)に行ってきました。
最初の日は4時起きでしたといっても、いつもその30分くらい遅い時間に起きているんですが。。。その日もWii Fitをやってから、6時40分ころ家を出て、7時15分のTXに乗っていきました。そうしたら、9時15分ころ新横浜についちゃいました。少し迷ったんですが、無事にHDラボにつきましたが、ちょっとまだ始まるには早いです。中に入って待たせてもらいました。
セミナの受講者は8人、うち2人が若い女性でした。これにはびっくり、女の人がいるとは思いませんでした。(女性蔑視ではありません。女性が極端に少なく、展示会などでも、呼び込みの人を除いて、あまり女性を見たことがなかったからです)
いよいよ、アサーションの講義が始まりました。本を読んでいたので、大体アサーションの概念については予習が出来ているつもりです。でも、本を読んでいると眠くなってしまうので、構文が頭に入りません。セミナに行けば、いやでも頭に入るだろうと思ったのですが、眠くて仕方がありません。誤算でした。。。
でも、薄れ行く意識をかろうじてつなぎとめながら聞いてきました。
結局、PCIインターフェースなどで、FRAME#をアサートしたら、4クロック以内にDEVSE#をアサートするというルールを書いて、それをVerilogファイルの動作と比べるもののようです。こんな感じで、 !FRAME |-> ##[1:4] !DEVSEL (自信ないですが。。。)
こういうのを入れておいて、修正したときに、今までうまく行っていた所が、修正してもすべてうまく行っているというの確認したいと常々思っていました。こちらを直したは良いが、ほかのところに影響が及んでいないかをチェックするのが目視では大変すぎます。
結局、いい勉強になったと思っています。
そういえば、エディタはVIでやれとのことでしたが、VIを使ったのは遠い昔、コマンドはかろうじて、i, a, o, O, A, :w, :q ! 位は覚えていたので、何とかなりましたが、使いづらいのなんのって。。。 QuestaSim(ModelSimの上位版?)のエディタでやってしまいました。操作は基本的にModelSimなんで慣れていたので良かったです。アサーションも見えますし、なかなか良いですね。(持っていないですが。。。)
QuestaSimを買えない場合は、PSLででもやろうかなと思っています。
感想は、SystemVerilogのアサーションの片鱗を見ただけでも良かったと思っています。演習もかなりあったし、これは眠気防止にとても役立ちました。
演習では、アサーションを書いたのですが、昔のUNIXのsedやawkの正規表現みたいだし、私は、これが苦手でしたね。でも、大体感じはつかめたからやってみたいと思っているんですが、入れるのに時間がかかりますね。まだ、テスト段階では入れられないですね。
まずはやるとしたらPCI-Xのプロトコル部分に入れようと思っています。

仕事では、いろいろな事情で休んでいたPCI-Xのボードのスプリット応答とスプリット完了に手をつけ始めまして、いまやっていますが、今のやり方ではどうもだめなようです。また、近いうちにレポートしたいと思います。
趣味の方ではDDR2ですね。これは意外とDDRに近いので、そんなに苦労しないで出来るのかな?と思っています。それでもテストする周辺をSUZAKU上に作らないといけないし、それからですね。
それより前に、もう一度非同期リセットと同期リセットのインプリメントの違いを検証してみたいと思っています。

なんか、乱文になってしまったようです。疲れているので平にご容赦を。。。(家から往復6時間でした)
  1. 2007年12月14日 22:26 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

System Verilogセミナー(アサーションコース)

明日から、HDLab社System Verilogセミナー(アサーションコース)に行ってきます。
新横浜まで、2日間通うのがきついのですが、がんばって行ってこようと思っています。問題は、帰りが遅くなるとバスがなくなることですね。タクシーで行くという手を使うか?帰りが遅くならないように新幹線を使うか?迷っています。
SystemVerilogを使ったこともありませんが、どんなものか覚えてきたいと思っています。アサーションを書いたことがない人でも大丈夫だそうですので、大丈夫でしょうという希望的観測の元に行ってきます。
  1. 2007年12月12日 05:27 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

FPGAの非同期リセットと同期リセットの比較(ダイナミック点灯回路)

FPGAの非同期リセットと同期リセットの比較をSpartan3 Starter Kitのダイナミック点灯回路でやってみることにした。
最初にそのまま、インプリメントしてみた。その次に非同期リセットを同期リセットに変更してインプリメントしてみた。
どうやって直したかというと、こういうのを

    process(reset, clk) begin -- Lighting frequency is 1KHz
        if reset='1' then
            lcnt <= (others => '0');
        elsif clk'event and clk='1' then
            if lcnt = conv_std_logic_vector(clk_frequency, 16) then
                lcnt <= (others => '0');
            else
                lcnt <= lcnt + 1;
            end if;
        end if;
    end process;


こうした。

    process(clk) begin -- Lighting frequency is 1KHz
        if clk'event and clk='1' then
            if reset='1' then
                lcnt <= (others => '0');
            elsif lcnt = conv_std_logic_vector(clk_frequency, 16) then
                lcnt <= (others => '0');
            else
                lcnt <= lcnt + 1;
            end if;
        end if;
    end process;


この結果、非同期リセットのMAPの結果は以下の通り。

Design Summary
--------------
Number of errors:      0
Number of warnings:    2
Logic Utilization:
  Number of Slice Flip Flops:          22 out of   3,840    1%
  Number of 4 input LUTs:              72 out of   3,840    1%
Logic Distribution:
  Number of occupied Slices:                           46 out of   1,920    2%
    Number of Slices containing only related logic:      46 out of      46  100%
    Number of Slices containing unrelated logic:          0 out of      46    0%
      *See NOTES below for an explanation of the effects of unrelated logic
Total Number of 4 input LUTs:             87 out of   3,840    2%
  Number used as logic:                 72
  Number used as a route-thru:          15
  Number of bonded IOBs:               19 out of     173   10%
    IOB Flip Flops:                     5
  Number of GCLKs:                     1 out of       8   12%

Total equivalent gate count for design:  750
Additional JTAG gate count for IOBs:  912
Peak Memory Usage:  135 MB
Total REAL time to MAP completion:  10 secs 
Total CPU time to MAP completion:   6 secs 


次に、同期リセットに修正したMAP結果は以下の通り。

Design Summary
--------------
Number of errors:      0
Number of warnings:    2
Logic Utilization:
  Number of Slice Flip Flops:          22 out of   3,840    1%
  Number of 4 input LUTs:              33 out of   3,840    1%
Logic Distribution:
  Number of occupied Slices:                           27 out of   1,920    1%
    Number of Slices containing only related logic:      27 out of      27  100%
    Number of Slices containing unrelated logic:          0 out of      27    0%
      *See NOTES below for an explanation of the effects of unrelated logic
Total Number of 4 input LUTs:             48 out of   3,840    1%
  Number used as logic:                 33
  Number used as a route-thru:          15
  Number of bonded IOBs:               19 out of     173   10%
    IOB Flip Flops:                     5
  Number of GCLKs:                     1 out of       8   12%

Total equivalent gate count for design:  507
Additional JTAG gate count for IOBs:  912
Peak Memory Usage:  135 MB
Total REAL time to MAP completion:  11 secs 
Total CPU time to MAP completion:   7 secs


Number of Slice Flip Flops:は22で同じだけれども、Number of 4 input LUTs: は非同期リセットが72、同期リセットが33で、同期リセットのほうが半分以下になっている。
さらにFloorplanerでも比較してみた。右が非同期リセット、左が同期リセットだ。
dinadisp_test_fp_071211.png

やはり、明らかに同期リセットのほうが使用SLICEが少ない。
こんなに違うのは、なんかおかしい気がするが、同期リセットのほうがかなり有利ということになるのだろうか?一応、ちょっとは双方の回路ともシミュレーションしてあるが、実機に入れて確かめてはいない。
もう少し検証してみようと思う。
  1. 2007年12月11日 22:58 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:12

FPGAの非同期リセットと同期リセットの比較

hypermacさんに教えていただいたXcell Journal Issue 55の”デザインパフォーマンス向上のためのHDL コーディング法”を見ると非同期リセットを使うと論理合成ルールでの推論(SRL16、BRAM)やロジックの最適化を妨げる場合があるとのことだった。
私は、SRL16やBRAMはプリミティブをインスタンシエーションしているので問題ない。しかし、ロジックの最適化は気になるところである。
とりあえず、デザインパフォーマンス向上のためのHDL コーディング法のVerilog Sample #2をSuzakuに載っているVirtex4FXでやってみることにした。Xell Journal のVerilogコードと同一だが、一応、コードを載せておく。

`default_nettype none
`timescale 1ns / 1ps

module reset_test(clk, reset, a, b, c, d, e, q);
    input clk;
    input reset;
    input a;
    input b;
    input c;
    input d;
    input e;
    output q;
    wire clk, reset, a, b, c, d, e;
    reg q;
    
    always @(posedge clk)
        if (reset)
            q <= 1'b0;
        else
            q <= a | (b&c&d&e);
endmodule


論理合成すると下のようになった。
sync_reset_1_071209.png

ここでは普通の論理合成結果になった。”デザインパフォーマンス向上のためのHDL コーディング法”の”図2 より柔軟なLUT の推論”とは違っている。これをインプリメントして、FPGA Editorで見るとこうなった。


入力aがFFのREVに入っていて、その他のロジックは1つのLUTですんでいる。よって、”図2 より柔軟なLUT の推論”と同様になった。これはMAPでやっているのだと思う。1つのSLICEのみ使用している。ちなみに、デフォルトのままだとOLOGICのFFを使ってしまうので、IOBのFFを使わないようにUCFに書いた。

INST "q" IOB = FALSE;


比較のために非同期リセットにしてやってみた。Verilogコードのうちのalways@ をこう変更した。

always @(posedge reset, posedge clk)


論理合成の結果は、同期リセットと変化がなかった。その後、インプリメントして、同様にFPGA Editorで見てみた。
async_reset_1_SLICE_071209.png

同期リセットの時には、1つのLUTとFFのみ使用したが、非同期リセットの時には2つのLUTとFFを使用している。
”デザインパフォーマンス向上のためのHDL コーディング法”で言われているように同期リセットだとロジックと遅延を低減する効果があるようだ。

hypermacさん、教えていただいて、ありがとうございます。SLICE内のFFに同期リセットオプションがあるのを知りませんでした。これだったら、もしクロックが安定しなくて、変なステートに行っても確実にリセットがかけられますね。
もうちょっと複雑な回路を同期リセットと非同期リセットでどうなるか?比べてみようと思います。
  1. 2007年12月09日 20:14 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:4

FPGAのリセット

hypermacさんからFPGAのリセットの方法についてコメントがあったが、私はリセットについては余り考えていなかった。うちのボードのリセット方法については、”うちのボードのリセット回路とFPGAのコンフィギュレーション”を見てください。
ModelSimでリセットしないと不定になるので、非同期リセットを必ずつけて、シミュレーションしていたし、そのリセットを外部から制御して非同期リセットにしていた。
同期リセットにしない理由のひとつは、水晶発信器も発振開始時間があって、電源ONからすぐに安定して動かないことだ。例えば、使用しているEG-2121CAは10ms だ。この時間は発振が安定する保証はないから、同期リセットをアサートしていても安定するとは限らない。ステートマシンも不正ステートに行っているも知れないので、同期リセットをつけるとすると回路規模が大きくなってしまう。
うちでは、製品じゃないので、リセットしてだめだったら再立ち上げすれば良い。頻繁にだめにならないのだったら、それでOKということで非同期リセットにしている。
一応、リセットの外れるタイミングの違いは気にはしていて、非同期リセットラインの遅延の差をFPGA Editorで確認はしていた。その結果は、V2pro(xc2vp30-6ff896)では大体2.?ns~3.9ns 位の間に収まっているようだ。一度も非同期リセットの関連ではおかしくなったことはない。(気がついてないだけかもしれないけども。。。)おかしくなったら考えようと思っている。
とりあえず、うちはこれで良いと思っている。下はリセットラインのFPGA EditorのWorldの図。
logic_reset_071207.png


もしやるとしたら、こうするかも? DFFを2段くらいにしておいて、そのDFFの非同期リセット端子または非同期セット端子に外部からの非同期リセットを入れておく。そのDFFのD入力に外部からの非同期リセットを入れて、2段目のDFFの出力でその他の回路を非同期リセット。非同期リセットのネットには遅延の制約をかけておく。 果たしてうまくいくでしょうか?
  1. 2007年12月07日 19:23 |
  2. FPGAのリセットについて
  3. | トラックバック:0
  4. | コメント:2

FPGA開発テクニック、チューニングの心得

@ITの組み込み開発にアルティマの方が、QuartusⅡでのFPGA開発テクニック、チューニングの心得を書いている。今回のは、FPGAの動作スピードを改善するポイントとは?ということだったが、こういうノウハウを書いてくれるのはとても良いと思った。
QuartusⅡのTimeQuest Timing AnalyzerはXilinxのTiming Analyzerに比べて、Waveformでスラックを表示してくれるのが良いと思った。解説していることは、チューニングでは基本的なことだとは思うが。。。
それでも、アルテラのFPGAを使っている人には必見のサイトではないだろうか?
Xilinxもこういうのをやってほしい。ノウハウを惜しみなく見せてほしいと思っているのは私だけ?

近頃、@ITの組み込み系連載は面白いのが多いと思った。
連載記事「触って学ぼう FPGA開発入門」
連載記事「バラして納得! 電子部品入門」
とか。
FPGAのカテゴリもある。
  1. 2007年12月06日 09:13 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:5

2007年度の技術報告書(PCIバス・インターフェース回路)

昨日、2007年度の技術報告書が一応書きあがった。今年は、私の自作したPCIバスのインターフェース回路について書いた。64bit, 66MHzのPCIモジュールだ。
ターゲット機能としてはシングル転送だけをサポートしている。ホストPCからのコマンドを受け取るだけといったところだ。バースト要求が来てもディスコネクトする。つまりバースト転送するときは、ホストPCのDMAコントローラは使用しないということだ。
マスタ機能は、バースト転送が出来るようになっている。FPGA内部バス(64ビット幅)からのデータを64ビット、66MHzでホストPCのメモリにバースト転送する。(当然逆もできる)FIFOにデータをためてから、FIFOに入っている分だけ、PCIマスタで転送するようになっていて、最大のバースト長は256ロングワード(64ビット幅)だ。DMAチャンネルは2チャンネル。ブロック図はここ。(ブロック図が間違っているところがあるが、ご愛嬌)
PCIマスタ機能は、PCIの仕様によると、相手が32ビット幅のトランザクションにしか対応していないときは、32ビット・アクセスに切り替えなければならないが、私のPCIモジュールはそんなことはしない。そうだと、どうせ性能が出ないので、ホストPCの方を64ビット、66MHz対応に変更する。
PCIマスタはリードとライト機能が同時に使えて、(つまりFPGA内部バスから同時に対応FIFOに読み書きが出来る。FPGA内の内部バスは2本ある。)PCIモジュールでアービトレーションを行い、出来るほうから処理を行う。実はもう1本PCIモジュールを使うパスがあるので、合計3つのFPGA内部デバイスから同時に使うことが出来る。
いまさらPCIということだが、PCI-Xはまだ出来かけなのでしょうがない。
問題は、同じようなことをやっている人がいないので、発表は技術報告書の内容で発表しても、誰もわからないということだ。したがって、もっと一般的な内容にしようと思っている。
パソコンのBIOSがどうやってPCIボードを認識して立ち上がるか?どうやって、プラグ&プレイしているか?といったような一般的な内容にしようと思っている。一部推測が入ってしまうが。。。
なかなか、ほかの分野の人も聞いて、わかったような気になってもらう内容にするのが難しい。

DDR2-SDRAMの方は、Spartan3E Starter Kit用のDDR-SDRAMコントローラをVirtex4に載せ換えて、性能を見ているが、今のところクリティカルパスが6ns程度になっている。ということは166MHz動作なので、DDR332しか動作しないということだ。チューニングをしながら、DDR2の勉強をしてDDR2用に変えていこうと思っている。
2007/12/07 追記:クリティカルパスはPicoBlazeの部分でした。DDR-SDRAMコントローラ本体は問題ありませんでした。
なにかDDR2-SDRAMコントローラが出来たときに、つなげるIPはないかな?PowerPCがEDKなしでつかると良いんだけど。どうやればよいか調べてみよう。
  1. 2007年12月06日 05:35 |
  2. PCI
  3. | トラックバック:0
  4. | コメント:4

学研の真空管アンプを作りました

昨日、学研の真空管アンプを作った。製作時間は45分くらいか?
プリント基板は、出来ていたので、乾電池の端子と外装をつけただけだ。スピーカーもホーンの部分を組み立てた。
真空管の写真。1B2と2PSという2つの中国製電池管(真空管)だ。
vt_amp_1_071204.jpg

2P3のほうには北京と書いてある。
下が、組み立て途中の写真。トランスと真ん中に単一2本の電池ボックスが見える。
vt_amp_2_071204.jpg

これが、完成品。スピーカーがちゃちいが値段を考えるとこの辺か?
vt_amp_3_071204.jpg

スピーカーは40mm口径のマイラーコーンだそうだ。
早速、パソコンにつないで、Yahoo動画を見てみた。音が出た。出来たーと言っても、自分でハンダ付けしていないし。。。
音は、それなりの音かな?音を大きくすると高音がうるさい。やはり、当然だけれどおもちゃのレベル。もうちょっと本格的なスピーカーをつければいけるかしら?フルレンジスピーカーとかが似合いそう。とりあえず、あまっているパソコン用のスピーカーをつけてみようか?
真空管は、暗いところでも明るくない。やはり電池管?
インテリアとしては、なかなか良いかもしれない?
今度、真空管アンプを作るならば、ハンダ付けする本格的なものを作ってみたい。
  1. 2007年12月04日 05:32 |
  2. 日記
  3. | トラックバック:1
  4. | コメント:4

ALWAYS 続・三丁目の夕日

今日も京都で、忙しかった。
朝、7時30分から、地区のみんなで小学校の廃品回収。トラックに乗って、各家々を回って、古新聞、古雑誌、ビール瓶、ダンボールなどを回収。みんな重いものなので、運ぶのが疲れる。各地区ごとにやるので、馬鹿にならない金額になるらしい。それで学校の備品などを購入するようだ。これが9時ころ終わった。疲れた。。。
その後の午前中は娘が塾に入りたいというので、(中3のこんな時期にとも思ったが)塾に行って、塾に入ろうとしたら、扉が閉まっていた。そういえば、電話をしてもつながらなかったのだった。えー!!、この塾つぶれたのかーといいながら、娘に聞いたら、私も知らないとのこと。
友達の紹介とのことで、娘が携帯メールで聞いてみるとのことで、一旦帰ることになった。(後から、その塾は日曜日は休みということがわかった)
帰ったら、すぐにALWAYS 続・三丁目の夕日の映画を見るとのことで、映画館に車で行った。行ったのは下の娘と私たち夫婦。上の子達はお留守番。
映画を見る前に、映画館のところのラーメン屋でお食事。私のは、とんこつだったでちょっとしつこかったが、焼きゴマすりつぶしたのがかかっていたので、風味が良くおいしかった。でも、あまりスープはしつこくて飲めない。
映画はなかなか良かった。私らが子供のころ(よりちょっと前かな?)の風景が懐かしい。洗濯板も、ローラーの搾り機のついた洗濯機も久しぶりに見た。こだまも昔のまま、と言っても私は、たぶん絵本でしか見ていないが。。。
ストーリーもなかなか良かった。家の奥さんは、ずーと、お涙頂戴だったようだ。
映画から帰ったら、テニスコートを予約していたので、テニスへ。暗くなるのが速いので、30分ほどテニスをして、今度は買い物へ。
ホームセンターで買い物。大きいものも買ったのだった。
その後、ガソリンスタンドで灯油を購入。灯油も高くなった。1リッター82円くらいか。。。このままどこまで行くのか?60円台が懐かしい。やっとこれで終わった。。。
急がしい一日でした。
  1. 2007年12月02日 19:31 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Wii Fitと学研の真空管アンプ

今日、Wii Fitと学研の真空管アンプが来た。
Wii Fitはバランスボードとソフトのセットだ。
バランスボードでは体重も量れるし、量った体重を記録できる。バランス感覚のテストや、ヨガ、筋力を鍛える運動、バランスゲームなどができる。バランスゲームはサッカーのヘディング、スキーの大回転、スキージャンプなどなどがあって、なかなか面白い。これで、楽しみながら体力増強が出来ると良い。でも、なかなかテレビが空かない。今も、奥さんが、ドラマの後、バレーボールを見ている。なかなか、私の番が回ってこないのだ。。。
wii_fit_071201.jpg


頼んであった、学研の真空管アンプも来た。
FPGAの部屋ならぬ、真空管アンプの部屋にしようかな?とも思ったが、真空管アンプ基板も作ってあるし、外装を組み立てるだけのようだ。拍子抜け。。。
しかし、電池管という真空管があるとは知らなかった。単一電池2本並列で20時間くらい動くそうだ。出力は0.1W/CHということだ。作るのが楽しみ。。。
vt_amp_071201.jpg


今日は、イエーローハットにも行って、新しく買うステップワゴン用のスタッドレス・タイヤを買ってきた。ブリジストンのREV1がアルミホイール込みで約10万円だった。サイズは205/65R-15だ。セールで205/60R-16の方が安かった。なんか、納得がいかなかった。
スタッドレスはスキーに行くためでもあるが、子供の受験の日に雪が降ったらしゃれにならないので、雪が降る前に速めに購入した。ブリジストンの発砲ゴムスタッドレスのほうが、ほかのメーカー品より1年長く、つまり4年持つと思うので、いつもスタッドレスを買うときには、ブリジストンだ。

V4のISERDESの方は、NETWORKINGで使うのは便利なようだが、DDR2-SDRAMのデータ受けとして使うのは、仕様も良くわからないし、難しいかも?
とりあえず、スパルタン3Eのバースト長を4にして、IDELAYを入れて、動くかどうか確かめてみようか。。。
  1. 2007年12月01日 22:10 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:7