« 2008年12月 | トップページ | 2009年2月 »

2009.01.31

SH7750Rの回路設計

皆様、先週はEDS Fairにお越しいただき誠にありがとうございました。展示会後は何やらいろんな原稿執筆に追われていましたが、ようやく一段落ついたので、溜まっている案件にも着手しはじめました。

今日はSH7750Rという、ルネサステクノロジのSH-4を使った回路の基板設計をしています。

SH7750Rは、日本が誇る素晴らしいCPUです。
このCPUはデータバスに32bitのSDRAMをつなぐと高いパフォーマンスを発揮できるのですが、16bitのSDRAMを2個つなげるにはどうしたらよいかと、パターン設計で悩んでいました。

SH7750Rのピン配置はデータバスが、D0,D1,D2・・と連続していなくて、とても不規則に感じられます。そのうえ、データバスの間にアドレスがあったり・・

悩んだ末、ようやくこのピン配置意味がわかりました。

16bit幅のSDRAMを2個ないし4個乗せる場合のパターンを考えて、CPUのピン配置が最適化されているのですね。

SH7750Rの右下(104番ピンの角)と、左下(52番ピンの角)に、SDRAMを1個づつ配置すれば、ほとんどそのまま、バスがSDRAMにつながります。4層基板、いや両面基板でもいけるかもしれないというほど、すっきりとしたピン配置になりました。

Sh7750rsdram

左側にデータバスD0~D15を、真ん中にはアドレスバスと制御信号を、右側にはデータバスD16~D31を通せば、ほとんど交差することなくSDRAMのピンに直行です。おかげで、部品と配線領域をあわせて、SH7750Rの下側3.3cmの範囲に収まりました。

逆に、このことに気がつかないと、6層基板でも配線が難しいです。

うむ。SH7750Rはすばらしい。ますますこのCPUが好きになりました。

| | コメント (0)

2009.01.23

EDS Fairの会場から

今日は、EDS Fair2009に出展しています。会場からの更新です。

昨日よりもお客様の出足がよく、11時になる前からひっきりなしに続いています。
特殊電子回路はFPGAビレッジの中で出展しています。入り口にはかなり近い場所です。
Eds fair 2009

当社のブースはこんな感じです。
Edsfair 2009

意外と興味を持ってくれた方が多いのは、当社特製のPCI Expressボードでした。
コンプライアンステストをしていなくても、「これで十分」という声を多くいただきました。
PCI Express評価ボード

午後からは晴れると聞いているので、もっと賑わうことでしょう。
関東近辺の方はぜひともパシフィコ横浜へお越しくだされば幸いです!
特殊電子回路はFPGAビレッジの中でお待ちしております。

| | コメント (0)

2009.01.20

LatticeXP2のFPGA回路内部へJTAGで通信する

Lattice XP2のFPGA回路内部へ、FPGAのJTAGポートを使って通信したいのですが、調べても資料がないので、試行錯誤で調べました。

Jtage XP2には、JTAGEというプリミティブがあります。このプリミティブをユーザロジックにインスタンシエートすることで、FPGAのJTAG端子の信号をFPGA内部回路へ接続することができるようになります。

XILINXにはBSCAN_SPARTAN3やBSCAN_VIRTEX4といったプリミティブがありますが、それと同じような役割をするものがJTAGEです。(ちなみに、LatticeSC/MはJTAGA、LatticeECP/ECとLatticeXPはJTAGB、LatticeECP2/MがJTAGC、MachXOがJTAGDです。)

JTAGEを使うには、TCKやTDIといったJTAG信号をFPGAの外から自分でつないでこないといけない点です。

つまり、メインモジュールのポート宣言で、
entity main is port (
 ・・・
 tck_ip : in std_logic;
 tdi_ip : in std_logic;
 tms_ip : in std_logic;
 tdo_op : out std_logic;
 ・・・
というのを作って、

INST_JTAGE : JTAGE port map (
 tck => tck_ip,
 tdi => tdi_ip,
 tms => tms_ip,
 tdo => tdo_op,
 ・・
と、自分でつながなければなりません。
ただし、これらのJTAG信号はVHDLソースでは形式的につながれているだけですので、JTAGEのTCKにユーザロジックの出力をつないだり、TDIの値をユーザロジックで見たりすることはできません。JTAGEモジュールのJTAG信号はトップのモジュールの入出力端子に直結する必要があります。
(XILINXの場合は、暗黙のうちにつないでくれます)

このようにすると、JTAGEモジュールの、JTCKとJTDIからユーザロジック用のJTAG信号が出てきます。これはユーザ回路で使うことができます。JTDO1/2にはユーザロジックで作った信号を与えると、FPGAのTDOピンから出てくるというわけです。

JTAGEモジュールを有効にするには、JTAGプライベート命令のIPA(0x32)とIPB(0x38)を使います。インストラクションレジスタにIPA命令を入れるとJTAGEモジュールの信号系統1が有効になり、IPB命令を入れると信号系統2が有効になります。

JTAGEモジュールには、JTCKやJTDI以外に、JRTI1/2、JSHIFT、JUPDATE、JRSTNといった信号があります。これらはFPGA内のTAPコントローラがRuntest/IdleステートやShift-DRステート、Updateステート、TestLogicResetステートにあるときにHになる信号です。JCE1は、Capture-DRもしくはShift-DRのときにHになります。
JTAGEモジュールの入出力信号のタイミングを調べたところ、次の図のようになりました。

Xp2_jtage_timing
(クリックで拡大)


注意しなければならないところは、JTCKとJCE1、JSHIFTなどの遷移するタイミングが全く同時(5ns以下)であることです。したがって、JTCKでJCEをサンプリングすることはできません。
次のような記述ではうまくうごきませんでした。
process(JTCK) begin
 if(JTCK'event and JTCK = '1') then ・・・ ×
  if(JCE1 = '1) then

JCE1を見るならば、JTCKの反転クロックで見なければなりません。

process(JTCK) begin
 if(JTCK'event and JTCK = '0') then ・・・ ○
  if(JCE1 = '1) then

こうすることで、うまく動くようになります。

もしくは、JCE1をいったん反転クロックでサンプリングして、

process(JTCK) begin
 if(JTCK'event and JTCK = '1') then ・・・ ○
  if(JCED1 = '1) then ・・・ JCED1はJCEを反転JTCKで遅延させたもの
   SHIFTREG <= TDI & SHIFTREG(SHIFTREG'LEFT downto 1);

とします。
ユーザ回路でシフトレジスタを作ったら、JSHIFTとJTCKによってそれをシフトさせます。
ただし、JTAGEモジュールにCAPTURE信号の出力はないので、JCE1 and not JSHIFTで条件を作るか、JCE1の立ち上がりエッジでCAPTUREさせればよい(こちらが正道だが非同期回路扱いになる)でしょう。

JTDOは次のようにします。

 JTDO <= SHIFTREG(0); ・・組み合わせ回路であるべし

JTAGEプリミティブのJTDO1/2に入れられた信号は、マスターのTCKの立下りでサンプリングされ、FPGAの外に出力されます。

これで、ユーザ回路の中にJTAG通信コンポーネントを入れることができるようになります。
シフトレジスタにブロックメモリやCPUの信号をつなげば、JTAGポートを通じてFPGAの外から中へアクセスできるようになります。

ということで、あと少しで、LatticeXP2対応のJTAGロジアナが作れそうです。
Lattice_xp2_logiana


特殊電子回路はEDS Fairに出展します。詳細はこちら http://www.tokudenkairo.co.jp/edsfair2009.html
460x60_01


|

2009.01.19

EDS Fair2009に出展します

特殊電子回路㈱は、今週末に開催されるEDS Fair2009に出展します。
EDS Fairは、ASIC/FPGA/CPLDや、組み込みソフトウェア・ハードウェアの開発に特化した、エレクトロニクス専門の展示会です。

日時は、2009年1月22日 (木)と23日 (金) AM 10:00~PM 6:00です。
場所はパシフィコ横浜です。特電は、特設ステージのFPGAビレッジの中で出展します。

今回の展示会では、MITOUJTAG Proのデモンストレーションと、PCI Express評価ボードのデモンストレーションを行います。

展示会では、当ブログで紹介したような
Lattice XP2のJTAGコンフィギュレーション
DDR2 SDRAMを非常にゆっくりアクセスしてみる
PCI Express External Cabling接続
Spartan3E+DDR2メモリで400Mbps
論理合成しないでPCI Express PHYを動かす
FPGAをステップ実行させて、波形を観る
INTESTを使ってFPGAをステップ実行させる
といった、非常にキワドイFPGAの使い方も、声をかけていただければ喜んでデモンストレーションさせていただきます。
是非とも、実際に動いている実物をご覧いただければ幸いです。

また、MITOUJTAG Proの体験版CD-ROMも配布いたします。

多くの方々のご来場を心よりお待ちしております。
どうか忌憚のないご意見をお聞かせ下さい。

よろしくお願いします。

詳細はこちら http://www.tokudenkairo.co.jp/edsfair2009.html
460x60_01

| | コメント (0)

2009.01.18

Lattice XP2の書き込み対応

今日は丸一日、MITOUJTAGをLattice XP2の書き込みに対応させるための改良を行っていました。

Lfxp2

LatticeのFPGAを論理合成するには、Latticeの出しているispLEVERというツールがあります。このツールには無償のスタータ版があるので、それを利用します。

ispLEVERの画面はこんな感じです。
ispLEVER

ただし、ispLEVERには論理合成ツールがありません。
回路図やVHDL,Verilogでデザインを入力しても、その論理式を論理圧縮して合成してネットリストにすることができません。そこで、SnopsysのSynplifyというツールを使います。
幸いなことに、Lattice専用のバージョンが無償で利用できるようになっています。ただし、ダウンロードするためのキーの取得にものすごく時間がかかる(おそらく海外の人が手作業で認証していると思われるほど)ので、1日くらいの余裕を見てダウンロードしておいたほうがよいでしょう。

ispLEVERの使い方は富士エレクトロニクスさんの「ispLEVER、最初の一歩」が詳しいです。

ispLEVERとSynplifyをインストールして、VHDLでコードを書き、Generate Data File(JEDEC)というところをクリックすると、JEDECファイルが生成されます。

JEDECファイルをFPGAに書き込むのですが、標準ではispVMというJTAGコンフィグツールが用意されています。

Ispvm

しかし、ispVMは非常に使い方がわかりにくいです。iMPACTといい勝負。画面上の表で、デバイスごとにやりたい操作を登録して、GOボタンを押すというものですが、Eraseとか、Programとか、Verifyしたいと思っても、そのコマンドを発行するまでにものすごい手間がかかります。


ところが、なぜかispVMはJTAGの関連ファイルを生成する能力には非常に長けていて、SVFファイルやSTAPLファイル、ATE用のいろんなファイルをいとも簡単に出してくれます。しかも、SVFファイルの細かいバージョンが指定できたり、SVFファイルにLOOPというLattice独自の命令が追加されていたり、SVFデバッガとかが用意されています。使いやすさよりも、JTAGの細かいオプションやマイナーなファイル変換機能が優先されている感じですね。
これは、絶対にLatticeの中にJTAGマニアがいるに違いない!!


さて、コンフィギュレーションというのは、FPGAを開発する上での最重要項目だと思いますので、MITOUJTAGで対応させました。ボタン一発で、書き込み、読み出し、ベリファイ、ブランクチェック、リードバックができます。
Mj_lfxp2

とりあえず、XP2シリーズ(5,8,17,30,40)のすべてに対応させたつもりですが、確認はXP2-17Eしか行っておりません。消去に4秒、書き込み27秒、ベリファイ8秒でした。

さて、XP2の書き込みには、いくつかのモードがあります。
通常モード ・・・ 内蔵FlashROMに書き込む。書き込み時はFPGAは動作停止
バックグラウンドモード ・・・ 内蔵FlashROMに書き込む。書き込み時はFPGAは動作を継続する。
SRAMモード ・・・ SRAMに書き込む。書き込み時はFPGAは動作を停止する。無限回書き換えられる。
内蔵フラッシュROMの書き換え可能回数は、1万回とか10万回とかです。ほぼ気にしなくて良いレベルでしょう。

上記の、「動作を停止」しているときには、なんと、バウンダリスキャンのEXTESTモードになるようです。バウンダリスキャンによってI/O端子の状態を固定し、書き込み前の状態でフリーズさせるためのようです。これが後述のTransFRという書き込みモードのようです。絶対に、Latticeの中にJTAGマニアがいるに違いない!


FlashROMに書き込んだ後、そのデータをSRAMに転送することでFPGAが動作を開始するのですが、その方法には2つ(もしくは3つ)あるようです。
TransFR・・・転送時に端子の状態を、直前の状態でフリーズさせる。バックグラウンドモードでの書き込み時に使う。FPGAは本当に一瞬しか止まらない。
Refresh・・・ROMからSRAMへ転送したのち、コンフィギュレーションシーケンスを再起動する。パワーオンリセットと同じレベルで再起動する。通常モードでの書き込み時に使う。FPGAはミリ秒程度停止する。

そのほかにも、いろいろなモードがあるようなのですが、本日の改良作業では、通常のフラッシュROMへの書き込みのみ作成しました。SRAMダウンロードモードなどは機会があれば試してみることにします。

さて、Latticeのツールでは、端子のピン配置などを固定するファイルは、lpfファイルというようです。
こんな感じのフォーマットでした。
 LOCATE COMP "CLK_IP" SITE "22" ;
 LOCATE COMP "LED_OP_0" SITE "92" ;
 ・・・
このファイルをMITOUJTAGで読み込めるようにしたところ、ちゃんとピン名が出るようになりました。
JTAGロジックアナライザ

明日は、BLOGANAのLattice対応に挑んでみることにします。


| | コメント (0)

2009.01.16

PCI Express基板の修正

P板.comによると、製造している中国の工場が旧正月に入ってしまうため、19日から29日まで金フラッシュが対応できなくなるとのこと。
大急ぎで、先日作ったPCI Expressの(試作)基板を手直ししています。

大きな間違いは、
・エッジコネクタのtxp/txnとrxp/rxnを逆に作ってしまっていた問題を修正
・External CablingのTxpとTxnを逆に作ってしまっていた問題を修正
・タクトスイッチのピン配置を間違えた問題を修正
・フォトカプラのピン配置が間違っていた問題を修正
・PCIeエッジコネクタに、A1~A18、B1~B18のピン番地をシルクで入れる
・その他、シルクをいろいろ修正
どうやら、スイッチとか、フォトカプラとか、小さな部品にミスが多かったです。油断大敵。

全レイヤー重ねると、すごくぐちゃっとして良い感じの多層基板です。
Pcie_board_design


P板で金フラッシュが19日から29日までが対応できないというのが、その時期に注文を受け付けたものが対応できないのか、それとも、その時期は工場が全ストップするのか、が不明ですが、もし後者なら30日以降にならないと基板が出来てこないのでしばらく時間がかかってしまうことになります。
前者なら今月中に実装まで完了して、今月中にリリースできそうです。

| | コメント (2)

2009.01.15

LatticeのXP2をはじめます

突然ですが、LatticeのXP2をはじめようと思います。
なんだかもう、XやAのFPGAでは新鮮味や、ワクワク感、ドキドキ感がなくて・・

というわけでLatticeのXP2というのを調べていたのですが、どうやらSpartan3ANと似たような分野のFPGAで、Spartan3ANよりも高度という感じがします。

Spartan3/ANと似たような点としては、
・ブロックRAMはある → EBRという
・分散RAMもある
・ハードウェア乗算器もある
・JTAGポートをユーザロジックで使用できる → ER1というプリミティブ
・フラッシュメモリを内蔵している → Spartan3ANやMAX2のように
・LUTは十分にある(表現が曖昧ですが・・)

そして、Sp3にない嬉しい特徴として、
・DDR2入出力FFに、クロックドメインを受け渡すためのFFが入っている
(Spartan3E/Aでは、ODDR2と隣のIOBのFFを使わなければできなかった)
・DDR2メモリから受信したDQSをうまく使うための仕組みがある
(90°ずらすみたいなことが書いてあった)
・PLLがある?
・内蔵フラッシュROMをEBRでエミュレートして、さらに簡単にライトバックできる(FlashBAKという?)
・コンフィギュレーションの暗号化?

と、痒かったところに手が届く感じです。

コンフィギュレーションに関して大きな違いは、Spartan3ANはSpartan3にSPI ROMをくっつけてワンチップ化した感じでしたが、LatticeのXP2は最初からフラッシュROMを内蔵することを前提として作っています。よって、内蔵フラッシュROMとブロックRAMの間のデータ転送が超高速にできるし、使い方は自由自在。これは面白いかもしれません。

同じことをやろうとするなら、Sp3よりも安価で、よりセキュア(コピー防止などが効く)に、より小さなFootPrintでできそうです。

これはもう、MITOUJTAGで対応するしかありません!

早速、バウンダリスキャンはできました。
Xp2

論理合成ソフトをインストールして、動くようになったので、書き込みの仕組みとかいろいろ調べています。
とりあえず、3日間で、MITOUJTAGで、
 ・論理合成ツール(ispLEVER)が出力するピン定義ファイルが読み込みできること。
 ・SVFファイルを使わずに、JEDファイルから直接FPGAにコンフィギュレーションできること。
 ・BLOGANAが動くようになること。
を目指します。

うまくいけば、EDS Fairでお披露目します。
乞う期待!

| | コメント (2)

2009.01.14

DDR2 SDRAMを非常にゆっくりアクセスしてみる

今日はDDR2 SDRAMを非常にゆっくりアクセスしてみました。

規格では、DDR2 SDRAMの最低クロック周波数は125MHzとされています。

しかし、今日はその100万分の1の速度で動かそうとしています。DDR2 SDRAMの中には、DLLという内部クロックを生成する機能があります。この機能を無効にしてやると、(デバッグ用のモードとして)非常にゆっくりと動かすことができるようになります。

なぜそんなことをしたいかというと、MITOUJTAG ProのAdvanced JTAG Function Generatorを使い、C++言語で作ったスクリプトを用いてFPGAの端子を上げ下げし、DDR2へアクセスしたいがためです。

MITOUJTAGでは、次のようなスクリプトを書けばDDR2メモリへNOPコマンドを与えることができます。

 static void cmd_nop()
 {
  DDR2_RAS_OP = "1";
  DDR2_CAS_OP = "1";
  DDR2_WEN_OP = "1";
  DDR2_CS_OP = "0";
  DDR2_CKP_OP = "0";
  DDR2_CKN_OP <= "1";
  DDR2_CKP_OP = "1";
  DDR2_CKN_OP <= "0";
 }

こういうスクリプトをいっぱい作れば、DDR2メモリへアクセスするための複雑な波形も作れるというわけです。

作ったスクリプトの全体は次のようになります。
「ddr2_test.cpp」をダウンロード

次の図は、実際に、そのスクリプトでDDR2 SDRAMメモリの初期設定(MRSやEMRSコマンドの発行)を行い、64バイトの乱数データを書き込んで、それを読み出した際の波形です。メモリから読み出したデータは、画面下のウィンドウにダンプされて表示されています。
Ddr2_ajfg
(クリックで拡大)

書き込みと、読み出しの部分を拡大すると、こんな感じです。リードコマンド(RAS=H、CAS=L、WEN=H)を与えてやると、SDRAMのほうからDQSを送ってきているのがわかります。
Ddr2_ajfg_mag
(クリックで拡大)


ところで、SDRAMはリフレッシュしなければデータが消えてしまうんではないの?と思う方もいるかもしれません。実は、そんなにすぐに消えるわけではありません。

データシート上では64ms以内に8192ラインをリフレッシュしなければならない・・などとされていますが、実際には(個体差もあるのでしょうが)リフレッシュをしなくても数秒間はデータを保ってくれます。今回試したMicronの256MbitSDRAMでは、4~5秒でメモリアレイのどこか1ビットが壊れるかどうかといったレベルなので、ゆっくりアクセスしたからといって、すぐにデータが全部壊れてしまうわけではないのです。

というわけで、バウンダリスキャンを用いて非常にゆっくりとSDRAMにアクセスしても、書き込んだデータをすぐに読み出せば、エラーなく読み出せるわけです。

こんなことして何が嬉しいのかというと、FPGAとSDRAMの間の結線を調べることができることや、FPGAのアプリケーションで書き込んだSDRAMのデータをちょこっと覗いて見ることができることです。

SDRAMの内容をちょいと見てみたいからといって、FPGAの論理回路を書き換えるのはとても面倒です。そういうときは、スクリプトを使ってFPGAの端子だけ操作して覗いてみるのがいいでしょう。論理合成もしないので、スクリプトを書き換えてから5秒程度で動きます。Additive Latencyを変えてみる実験やPosted Writeの実験などが気軽に行えます。
Ddr2_dos

FPGAで本番の論理合成をする前に、スクリプトでささっと書いて、遅くてもいいからテストができれば、FPGAの開発が今よりもずっと楽になるでしょう。

| | コメント (0)

2009.01.10

MITOUJTAG Proを更新しました

MITOUJTAG Proを、バージョン2.0.4dにアップデートしました
製品版も、体験版もどちらもアップデートすることができます。

今回の更新点は以下のとおりです。

① メッセージウィンドウに時間と日付を表示した
様々なメッセージの発生時刻がわかるようにしました。
Mjpro204d_1

② FPGA/CPLD書き込みファイルが更新されるまで待機するオプションを用意した
大きなFPGAは、論理合成に非常に時間のかかります。論理合成終了を待ってから書き込みを行うのではパソコンの前に張り付いていなければなりません。しかも、XCF32Pとか巨大なコンフィグROMもかなりの時間がかかります。
コーヒーのみに行っている間に論理合成が終わって、自動で書き込んでくれたら、どんなに嬉しいでしょう・・

そこで、書き込みファイルをあらかじめ指定しておいて、更新されたら自動で書き込むというオプションも用意しました。ネットワーク上にある別の高速なPCでFPGAの論理合成をおこなって、完了されてBitファイルが出来たら自動で書き込むということもできます。
もう、パソコンの前に付きっきりで見守っている必要はありません。

Mjpro204d_2

③ プロジェクトツリーから書き込みができるようにした。
ロジアナの画面を見ながら、FPGAのデザインを新しくしたいような場合、いちいちウィンドウを切り替えるのが面倒でした。そこで、いつも表示されているプロジェクトマネージャのデバイスのアイコンを右クリックして、そこから書き込みできるようにしました。
Mjpro204d_3

④ BSDLファイルのドロップができない問題を修正
MITOUJTAGのメイン画面にBSDLファイルをドラッグ&ドロップすると、そのデバイスがチェーンに追加されるはずなのですが、前回の2.0.4bではうまくその機能が動きませんでしたので、修正しました。

⑤ デバイスを、登録済み一覧の中から選択してチェーンに追加できるようにした
これはMITOUJTAG BASICにはあった機能ですが、Proでも使えるようにしました。
今回、表示されるデバイス名一覧が昇順にソートされるようにしましたので、目的のデバイスを探しやすくなりました。
Mjpro204d_4

⑥ メッセージウィンドウを隠すことができるようにした。
最近流行りのUMPC(ウルトラモバイルPC)向けの改良です。
UMPCでは、画面の縦サイズが狭くなっています。そこで、メッセージウィンドウを隠すことで横長のデザインに対応しました。外出先や電車の中でも、バウンダリスキャンや書き込みが手軽にできます。
Mjpro204d_5

⑦ メインウィンドウやボタンの位置を記憶できるようにした。
ウィンドウの位置やサイズ、各種ツールバーの配置、プロジェクトマネージャやメッセージウィンドウの表示/非表示を(プログラム終了時に自動的に)保存できるようにしました。これで、起動するたびにいちいち好みのサイズに変更しなくてもよくなります。


ますます進化していくMITOUJTAGをよろしくおねがいします。

| | コメント (2)

2009.01.09

PCI Express External Cabling接続を試してみた(2)

PCI Expressには、External Cablingというバスを外に引っ張り出す規格があります。
しかし、秋葉原を探しても、そういう拡張ボードは見当たりません。
External Cablingはまだ日の目を見ていない規格なのでしょうか・・


ネットで見つけたのが、
コンテックさんのPCI Express Cable方式拡張バスアダプタ(EAD-CE-LPE)

ONE STOP SYSTEMSさんのPCI Express x1 Host Cable Adapter
でした。

前者は日本の会社のようなので、こちらから1つ購入しました。

そして、現在開発中の特電PCI Express FPGA評価ボードに接続。
うまく動くか・・と思いきや、動きません。

原因は、PCI Express拡張ケーブルの、SB_RTNという信号の扱いでした。
PCI Expressは、カードの抜き差しやリセットなどの信号を送るための「サイドバンド信号」があります。SB_RTNはそれらの低速信号用のグラウンドで、2つのシステムでGNDを分けたい場合が考慮されています。

本当はUpstream側(パソコン側)でSB_RTNは適切に処置がされていなければならないのですが、どうやらつながっていませんでした。特電PCI ExpressボードでSB_RTNをGNDにつないだら、ちゃんと動きました。

やっぱり、FPGAボードは、机の上に横に置いてデバッグするべきですよね。
Pci_express_external_cabling

これで、市販のPCI Express拡張ケーブルボードを使って、特電PCI Express基板に接続できることが確認できました。ようやく高速系の動作確認が全て完了しました。
あとは低速系(RS232CとかGPIO)とかの確認を行い、基板のミスした箇所やシルクを直し、販売を開始しようと思います。

特電PCI Express評価基板は、49,800円(税別)。
評価版IPコア付き。

を考えています。
1月末の出荷開始を目指します。
どうぞよろしくお願いします。

| | コメント (2)

2009.01.06

Sp3EでDDR2 SDRAMが333MHzまでな理由

Spartan3Eのデータシートで、I/Oが622MHzなのにDDR SDRAMが333MHzまでとされている理由がわかってきました。

まず、Spartan3Eの入力パッドは、本来622MHzまでいけるだけの能力を持っています。これは入力のセットアップとホールドを足した和の最小値が、1.6ns付近であることに起因しているのでしょう。これはベストな値なので、実際には2.0nsくらいになります。

しかし、DDR2 SDRAMは、クロックのエッジが入力されてからデータが出力されるまでの時間に±0.5ns程度のばらつきがあります。
あるビットは、クロックの立ち上がりの0.5ns前に出て、あるビットはクロックの立ち上がりの0.5ns後に出る可能性があるということのようです。

次の図はMicronのデータシートのものです。DQがばらばらと出てくるので、全ビットが同時に有効になる範囲はかなり減ってしまっています。
Outtiming

したがって、FPGAのデータ有効窓2.0ns + DDR2のばらつき1.0nsで、DDR2メモリのクロックの半周期が3.0nsになってしまい、333MHzが安定して動ける上限ということになるのだと思われます。
333MHzと400MHzの間には大きな壁があります。


さて、今回作ったDDR2 SDRAMコントローラの入力タイミングを次の図に示します。
以下のタイミングはXC3S1200E-5(速いほう)での計算結果です。

Ddr_timing250

クロック周期は8ns、半周期が4nsです。
制御信号やSDRAMへ与えるクロックは、FPGA内部クロックから計って3.4ns後、7.4ns後、11.4ns後・・に遷移すると考えます。
SDRAMは、7.4ns~11.4nsの間に最初のデータを出力しようとしますが、上記の理由によって、前後0.5nsは使えないので、7.9ns~10.9nsの間が実際に使えるデータとなります。

FPGAの入力は、クロックの遷移の3.975ns前から1.766ns前が有効窓なので、8.025~10.234nsのタイミングでデータが確定していればよく、今回使ったDDR2 SDRAMは250MHzでの速度ならばSpartan3Eの守備範囲内となります。

400MHzで動作させる場合は次のようになります。
Ddr_timing400_2

DDR2 SDRAMに与えるクロックは、FPGAの内部クロックから3.4ns遅れて出ます。DDR2 SDRAMが感じるクロックの遷移点は、3.4ns,5.9ns,8,4ns・・・と続きます。

SDRAMは、5.9ns~8.4nsの間に最初のデータを出力しようとしますが、前後0.5nsが減ってしまうので、有効なデータ出力期間は6.4~7.9nsとなります。
一方、FPGAは3回目のクロックエッジ(7.5ns)の2.189ns~0.152ns前にデータをサンプリングしようとするので、DDR SDRAMのデータは5.311~7.348nsの範囲で有効である必要があります。

ジッタや、配線の伝播遅延(往復で0.3nsくらい)、クロストーク、スキュも考慮していません。また、タイミングは最悪値で計算しているので、逆に早く出てきてしまったらどうなるのか・・ということも考えてはいません。

DDR2を高速に動作させるためのコツがわかってきました。

DDR2 SDRAMからのデータを取り込むには、FPGAの内部クロックを基準にするよりもDQSを使ったほうがよさそうです。クロックを基準にすると2×tAC = 1.0ns無駄になりますが、DQSを基準にすれば最悪でもtDQSQ(0.3ns) + tQH(0.4ns) = 0.7nsの無駄で済みます。

また、高速なDDR2 SDRAMを採用したほうが、tACや、tDQSQ、tQHのばらつきが小さいので、高速動作が見込めます。具体的に計算してみたところ、1066クラスのDDR2 SDRAMを使ってDQSサンプリングにすれば、最悪値で計算してもSpartan3Eで400MHz動作可能である可能性があります。

昨日の設計では、計算してみると、セットアップタイムが約1.1nsも違反していました。
しかも、実際に使ったデバイスはXC3S1200E-4(遅いほう)なので、タイミングの違反はもっと大きいと考えられます。それでも動いているということは、タイミングアナライザで出てくる数値には、温度や電圧を考慮したよほどのマージンを含んでいるのでしょう。

| | コメント (2)

2009.01.05

Spartan3E+DDR2メモリで400Mbps

XILINXのSpartan3Eデータシートには、DDRメモリは333Mbpsまでと書かれていますが、400MHzでも安定して動作しました。
データシートに記載された333MHzという根拠がいまいちわかりません。

Sp3eddr2

DDR2 SDRAM内(256Mbit)の全領域をLFSRで作った乱数で埋め、ユーザがボタンを押したときにそれを読み出して比較照合するというふうに検証しました。

DDR2を400MHzで動かすということは、FPGAは200MHzで動作しなければなりません。この速度はSpartan3Eには少々厳しいので、配置配線後のTiming Reportではいくつかタイミングエラーがいくつか起きています。しかしまあ、それでも運良く動作してしまうものなのですね。今回はインタフェースの速度を検証しているので、目をつむります。


次に、FPGAと外との最大インタフェース速度について考えてみます。
FPGAと基板上の部品と接続する際には、セットアップタイムやホールドタイムが必要になります。
Spratan3Eでは、外の信号に対しては合わせて最小で1.5ns~1.6nsくらい必要になります。クロックの位相はDCMを使えば自由自在にシフトできます。
したがって、FPGAに対して信号を送出しようとするICは、約1.6nsの間だけ有効なデータを出しておけば、あとはFPGAの中のサンプリングクロックの位相を合わせることで、正しく受信できてしまうはずです。
「1 I/O あたり 622+ Mbps のデータ転送速度」という根拠は、この1.6nsの逆数と思われます。

一方、FPGAの入力フリップフロップには遅延エレメントというのがあって、これを有効にすると、データ有効の窓が狭くなってしまいます。Spartan3Eの入力FF用遅延エレメントは、0~6までの7段階に調整することができます。
Ifddelay

遅延の段数をいろいろ変えてみたところ、データ有効窓の幅はつぎのように変化しました。
IFD_DELAY_VALUE = 0;  ・・・ 2.037ns
IFD_DELAY_VALUE = 1;  ・・・ 2.209ns
IFD_DELAY_VALUE = 2;  ・・・ 2.333ns
IFD_DELAY_VALUE = 3;  ・・・ 2.822ns
IFD_DELAY_VALUE = 4;  ・・・ 3.222ns
IFD_DELAY_VALUE = 5;  ・・・ 3.984ns
IFD_DELAY_VALUE = 6;  ・・・ 4.474ns

このように、遅延エレメントを増やすと、要求されるデータ有効窓が広くなります。それは最大受信可能データレートが下がることを意味します。遅延エレメントは単純に信号を遅らせるだけではないということが窺い知れます。

333MHzというのは、FPGAの内部クロック周波数の限界が166MHzあたりにあることに起因しているのではないかと思います。したがって、内部回路を工夫すれば、500MHzまではいけるのではないかと思っています。

どのように工夫をするかというと、
・FPGAの中の制御用ステートマシンは125MHzで動かします。
・制御信号(RAS、CAS、CS、WE、アドレス)は、ODDRを使って作ります。
・そのODDRは、表クロックでRASやCASなどの制御信号を出し、裏は常にNOPコマンドを出すようにODDRのD1入力を固定します。
・しがたって、コマンドはACT NOP NOP NOP RD NOP・・という具合に、2倍の周期で出ます。
・出力データはもちろんODDRを使って作りますが、このODDRは250MHzで動かし、しかもDCMを使って1/4クロック周期ほどタイミングを早めます。
・ODDRのD0とD1には、別々のブロックRAMからの出力をつないでおきます。なぜなら、D0とD1はサンプリングされるクロックの位相が180度違うので、それぞれ別のデータソースから出力することでクロックドメインの橋渡しをしなくて良くなり、高速動作が楽になると考えられるからです。
・ブロックRAM単体ならば250MHzで動かすのは難しくはないでしょう。
・IDDRも表と裏の2つの出力を別々のブロックRAMにつなぎ、入力したDQSを書き込み用クロックとするか、サンプリングポイントを決めうちにして取り込みます。
・バス幅の変換は、ブロックRAMの入出力ポートの幅を変えることで対処します。

というふうにすれば、FPGAの中の制御回路は125MHzで動き、データ信号だけは500MHzで動く、Spartan3E用のDDR2 SDRAMコントローラができるのではないかと思われます。ブロックRAMを4個も使ってしまうのがデメリットですが。
思いつきでアイデアだけを書いてみましたが、いつか暇ができたら試してみたいと思います。

| | コメント (5)

2009.01.03

Spartan3E+DDR2メモリの動作確認

今日は、PCI Express基板
Np1025
にのっているDDR2メモリの動作確認を行いました。

Ddr2

以前、Virtex4用に作ったDDR2メモリコントローラがあるので、これを改良してSpartan3E対応にしようと思ったら、意外とハマり箇所がありました。

まず、DDR2メモリからデータを受信するタイミングは意外と難しいことです。
本当ならばDQSを使ってソースシンクロナスの要領で受信するのがよいのでしょうが、それは面倒です。
そこで、FPGAが受信するタイミングを決めうちにします。しかし、DDRなので、FPGA内部の2倍の速度で動いているから裏クロックで決めうち、ということができません。
幸いなことにSpartan3Eの入力ピンは「入力ディレイ」というのを持っているので、これを活用します。入力ディレイ(IFD版)の遅延時間は0~6の数値で指定できるのですが、この遅延時間はかなりいいかげんです。遅延時間を微調整するようなことは難しそうでした。しかし、入力ディレイを使わないと、DDR2が送信してくるデータを適切なタイミングで受け取れません。250MHz動作の場合、幸いなことに、IFD_DELAY_VALUE = 1でぴったりのタイミングでした。

また、DDR2メモリへの書き込みデータを出力する際には、FPGAが出力するDQS信号はデータからを少し遅らせたタイミングで出力しなければなりません。しかし、Spartan3Eの出力パッドには遅延セルがなく、また90°クロックとか270°クロックを使って微妙なタイミングを作るのも面倒なので、FPGAのクロックをDCMに通して数ns遅らせて出力するようにしました。
DQSに送信するストローブ信号は、DCMの位相シフトで作れば簡単なようです。

以上のことによって、Spartan3EからDDR2メモリへアクセスできるようになりました。
書き込んだデータが正しく読み出せるかなどを試しています。
Ddr2

この基板のDDRメモリは、当初250MHzの速度で動作させることを考えていましたが、400MHzまでいくことができました。ディレイをうまく調整すれば、400MHz以上でもいけるのではないかと思います。
500MHzまでいければ、PCI Expressに対する完全なFIFOが作れるはずですのでいずれ挑戦してみたいです。

さて、この基板には、PCI Express、DDR2メモリ、SPIメモリ、PCI Express External Cablingなどが乗っていて、ようやく全ての構成要素の動作確認ができました。
そろそろ販売に向けて動き出そうと思います。

このPCI Express評価基板は今月末に出荷開始予定です。
XILINXとXIO1100の組み合わせの基板はあまり他でも見かけません。

このPCI Express評価基板に、評価用IPコアと、MITOUJTAG Pro特別版(この基板でのみ使用可能なバージョン)、サンプルデバイスドライバ、サンプルアプリケーションプログラムをつけて、●万円を切る価格で出したいと思っています。

ご希望やご意見などございましたらメールにてどしどしお寄せください。
皆様、どうぞよろしくお願いします。

| | コメント (2)

2009.01.01

あけましておめでとうございます

あけましておめでとうございます

平成21年も奇抜な製品を作っていきたいと思います。

皆様、今年もよろしくお願いします。

| | コメント (1)

« 2008年12月 | トップページ | 2009年2月 »