FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2005年05月

昨日、東京エレクトロンデバイスのDDR2 SDRAM 高速メモリインターフェイスデザインのセミナーに行ってきた。http://ppg.teldevice.co.jp/m_event/memory/なかなかためになったんだけど、会場が新しくてくさすぎ。(新車のにおいの強いみたいな) 頭が痛くなったので、3時ころ帰宅した。
内容は良かった。DDR1やDDR2の注意点や実装方法などを説明してくれたが、時間の関係もあって、肝心な所の話はなかった。その辺はかね払わないとだめかも? 何はともあれためになった。
特にVirtex4は、DDRのために遅延素子を内蔵していて、自動的にDQSの位相を検出して、DQをシステムクロックでサンプルできる所まで、遅らせてくれるそうな。。。
にわかには信じられない高機能だが、本当だとしたらとてもうれしい。おまけに全部のIOのその機能が入っているそう。何か、無駄のような気もするが、とてもうれしい機能なのはたしか。
スパルタン3EもIOBに遅延素子が入っているそう。それだけでもうれしい。
現在、Virtex2でDDRコントローラを作成中だが、リードの時にDDR SDRAMからのデータをサンプルするのが問題。
配線遅延によって、相当サンプルポイントが変わるし、そこまでDCMでフェーズシフトして、データをサンプルしても、(もしくはDQSをデレイして、データをサンプルしても)また、システムクロックにあわせなくちゃならない。
Virtex4かSpartan3Eにすれば、こんな苦労はしなくても良いのにと思った。
でも、セミナー行ったので、ひらめいて、大変だけど良さそうな方法が見つかったので、試してみる。

VHDLとVerilogHDLどっちがすきですか?
VerilogHDLは、簡単に書けて、記述量が少なくなります。
VHDLは記述量が多くなるけど、for generateやarrayがつかえます。
やはり、パラメータを与えて回路規模を変更できるように書くとすると、VHDLが断然有利です。
下位モジュールのインスタンス数をパラメータによって変えたいという時はVHDLでなければ出来ません。
その際には、arrayが使えないと下位モジュールでstd_logic_vectorを使えなくなってしまいます。
lower_moudleという下位モジュールを4つインスタンスするサンプルを書くと。

architecture RTL of .... is
component lower_module
 din : in std_logic_vector(7 downto 0);
 enable : in std_logic;
 dout : out std_logic_vector(7 downto 0)
end component;
type d_array is array (3 downto 0) of std_logic_vector(7 downto 0);
signal din_array : d_array;
signal dout_array : d_array;
begin
lower_module_4 : for i in 3 downto 0 generate
 lower_module_inst : lower_module port map(
  din => din_array(i),
  enable => enable,
  dout => dout_array(i)
 );
end generate lower_module_4;
.
.
.
end RTL;

VHDLだと、ちゃんとインスタンス出来ます。VerilogHDLもSystem Verilogだとできるのかな?

XilinxのFPGAが使用できるRAMには分散SelectRAMとブロックSelectRAMがあります。http://direct.xilinx.com/bvdocs/userguides/j_ug002.pdf
分散SelectRAMはCLB内のルックアップテーブルを16X1のRAMとして使用するもので、シングルポートとデュアルポートがあります。分散SelectRAMは同期書き込み、非同期読み出しです。
ブロックSelectRAMはデュアルポートの専用メモリで、FPGA内にあらかじめ決められた個数が入っています。同期書き込み、同期読み出しです。
Core GeneratorのFIFOのIPを生成するときに、分散SelectRAMを使用するか、ブロックSelectRAMを使用するか聞いてきます。
私は始めは分散SelectRAMを使用するとは、知らないで、CLB内のフリップフロップを使用するものだと思っていました。ですから、相当数のFFを使ってしまうものだと思っていましたが、CLB内のLUTを使用するためそんなことはありません。
256Depth X 64bitの分散SelectRAMを使用したFIFOのコアで、LUTは1,632、Flip Flogは82使用します。
XC2V3000だと5%位なので、割とくわない。

Logic Utilization:
Number of Slice Flip Flops: 82 out of 28,672 1%
Number of 4 input LUTs: 608 out of 28,672 2%
Logic Distribution:
Number of occupied Slices: 817 out of 14,336 5%
Number of Slices containing only related logic: 817 out of 817 100%
Number of Slices containing unrelated logic: 0 out of 817 0%

* See NOTES below for an explanation of the effects of unrelated logic

Total Number 4 input LUTs: 1,632 out of 28,672 5%
Number used as logic: 608
Number used as Shift registers: 1,024

FPGAのメーカであるXilinx社のFPGAチップ内に組み込めるロジックアナライザがChipscopeです。
Chipscopeは、FPGA内のBlockRAMにプローブしたい信号を溜め込んで、そのため込んだデータをFPGAに組み込まれているバウンダリスキャン(JTAG)を使用して、パソコンに取り込んで表示する、ロジックアナライザです。
BGAパッケージで、プリント基板の内層にプリントパターンがあるとロジックアナライザやオシロスコープでプロービングができません。そう言う時に、Chipscopeで希望の信号が見れると助かります。これ以外に見る方法がありません。
Chipscopeで信号を見る時に、どの信号を見るか指定しますが、その指定する方法には2つあります。1つはCore GeneratorでChipscopeのコアを生成して、そのコアに見たい信号をつなぐ方法です。この方法は、本体の回路を改造しないといけないので、なるべくやりたくありません。しかし、論理合成で信号が消えてしまって、どうしても見たい時は、この方法を使用するしかありません。ちなみに、私は使ったことがありません。
もう1つは、Core Inserterで論理合成した後のネットリストにChipscopeを接続するやり方です。この方法は、お手軽で、手間要らずなんですが、論理合成でネットがなくなってしまうことがあるので、確実に目的の信号があるとは限りません。あと、論理合成ツールでKeep HierarchyをONにしておかないと、階層がなくなってしまうので、希望の信号がわかりにくいです。私はこの方法を使用しています。
Core InserterでChipscopeをかけたら、その後、インプリメンテーションをします。Translate,Map,Place and Routeをしてビットファイルにして、FPGAに流し込んで、信号を見ます。これが結構長時間かかってめんどくさいです。FPGA Editorでつなぎかえればいいんでしょうが、今の所やり方がわかりません。
ともかく、160位の信号を2048サンプルとか見る方法がないので、ChipscopeがないFPGAデバックは考えられません。

↑このページのトップヘ