FC2カウンター FPGAの部屋 DDR SDRAMのDQS信号でデータをサンプルする方法1
FC2ブログ

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

FPGAの部屋

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

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

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

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

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

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


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

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


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


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


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

#PACE: Start of Constraints generated by PACE

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

#PACE: Start of PACE Area Constraints

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

#PACE: End of Constraints generated by PACE


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


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


これでVHDLファイルの

architecture RTL of ff_test is
begin



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


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


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


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


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


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


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

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

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

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

コメント

MIXIではお世話になりました
ここのPageはいつも、すごく勉強になります
今はなんとか133MHzで動作しそうです
(8バースト中の6バーストは読み取りOK)
目標まであと+33MHzガンバリマス
  1. 2006/04/10(月) 03:35:27 |
  2. URL |
  3. よっしー #SFo5/nok
  4. [ 編集 ]

こんにちは。書かせていただきました。
DDR SDRAMコントローラもう少しのようですね。
よろしければ、DQSを使ってリードデータを受ける際に、どれがリードデータかを確認する方法を教えてください。
  1. 2006/04/10(月) 05:35:11 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/192-acbf73f9
この記事にトラックバックする(FC2ブログユーザー)