goo blog サービス終了のお知らせ 

-・-・ --・-  -・-・ --・-  -・-・ --・- 

不定期更新。電子工作オタクのメモなので、おもしろくないですよ。

SP601のDDR2にアクセスする

2015-03-15 18:23:46 | FPGA
 1年ぶりの書き込みとなりました。
 いろいろ手を出しているうちに、SDRの方がおろそかになっていましたが、FPGAの勉強だけは細々と続けていました。
やっとのことで、ここ1週間ほど前から、DDR2のRead/Writeができるようになってきました。
この1年間、FPGAの勉強としては、LEDの点滅、押しボタンの検出、シリアル通信などをやってきましたが、DDR2のアクセスは参考情報が少なく、けっこうな時間を費やしてしまいました。
あまりチップメーカに限定したツールは使いたくなかったのですが、結局MIGというXilinxのツールを使って、DDR2のラッパーを作成しました(というか作成してくれました)。
全ての書き込みパターンの試験はしていませんが、一応手作業でのRead/Writeではエラーは出ていないようです。

最初の文字がWならWrite、RならRead動作となり、アドレスは簡単にするため、8ビット(2桁)にしました。
また、ポート幅を128ビットにして、マスクをかけていないので、アドレスの1桁目は0~Fの何を入れても同じ内容が読みだされています。

折角作ったFront Endの基板ですが、考慮不足の点があり、作り直そうと思っています。

FMC -> 2.54mmピッチ変換ボード

2013-12-30 23:05:11 | FPGA
やっと、SP601に触れるようになった。取りあえずマニュアルに従って、デモ機能の確認はできたが、SP601でSDRの実験をするためには、SP601についているFMC(FPGA Mezzanine Card規格)という拡張コネクタを使うことが、不可欠だ。
FMC XM105 デバッグ カードというボードも販売されているが、17,000円もするし、いらないコネクタもありそうなので、ここは自作することにした。
だが、これがなかなかやっかいないコネクタだ。コネクタはSAMTECという会社のものだが、digikey、RS、チップワンなどにもなく、結局SAMTECのサイトからオスのASP-134604-01を 直接購入した。送料を含めて、1個3,200円ほどとけっこう高くついた。
さらに、このコネクタは1.27mmピッチなので、2層基板でピン間に配線するのは、むずかしい。
ググっていたら、white cloudsさんのサイトに1.27mmのユニバーサル基板に、このコネクタをはめ込んだ記事があり、ここを参考に変換ボードを作ってみた。
なかなかすんなり、ボードにコネクタが入らなかったので、コネクタの半田側に被覆がある0.5mmの単線を通して、一旦ピンを少し広げることで、基板にさすことができた。このとき、半田付け部分についていた、半田の小さな玉がけっこう剥がれてしまったが、半田付けすれば問題なさそうだ。
一応1.27mmピッチのユニバーサル基板に取り付けられたので、実験内容に応じて2.54mmのコネクタに配線して使うつもり。
FMCピッチ変換ボード(手前が、コネクタの半田面と奥が基板に取り付けたコネクタ)

MicroBoardでFIRフィルタを作る(5)

2013-02-24 17:56:24 | FPGA
MATLABのデモ版を使う機会があって、フィルタ作成の勉強をしたが、ちょっといじっただけで試用期間が終わってしまった。SDRのフィルタ作成にはぜひとも欲しいが、アカデミック価格でも数十万円するので、とても遊びだけで個人で買えるものではない。
ということで、無償のXilinxのFIRコンパイラを使って、何とかFIRフィルタができた。
メモ代わりに設定画面を貼っておく。
まずは、FIRフィルタの係数を作成する。
フィルタ係数の算出ツールはWebで計算するものや、フリーのソフトもあるが、今回はDIGITALFILTER.COMからDSPLinks Web Editionをダウンロードして使わせてもらった。
ここのチュートリアルの中の「FIRフィルタの種類とそれらの特徴」を参考にサンプリング周波数、カットオフ周波数、タップ数、Kaiser Window Constantを設定して、フィルタ特性を確認する。

特性を確認したら、チュートリアルに従って、係数をファイルに出力する。

DSPlinksから出力された係数(右側)をFIR Compiler用に加工する。radix=10は10進数。行末は(,)を入れて、空白は削除し、ファイル名は.coeにした。


次にISE Project NavigatorのHierarchyのtopモジュールを右クリックし、表示されるリストからNew Source...を選択する。
表示されるNew Source Wizardの画面で、Select Source Type欄のIP(CORE Generator & Architecture Wizard)を選択し、file名を入れてNEXTボタンをクリック。


次にSelect Ipの画面で、Digital Signal Processing->Filters->Fir Compiler(今回は5.0を選択)を選択。
次の表示される画面でFinishをクリック。

以上で、ISE Project NavigatorのHierarchy欄にフィルタ名に対応した、.xcoファイルが出来上がるので、このファイルをダブルクリックすると、FIR Compilerの設定画面が表示される。

FIR Compilerの設定画面(1/4)


FIR Compilerの設定画面(2/4)


FIR Compilerの設定画面(3/4)


FIR Compilerの設定画面(4/4)


次に、ISE Project NavigatorのHierarchy欄で該当の.xcoを選択し、Processes欄のView HDL Instantiation Templeteをダブルクリックすると、FIRフィルタのテンプレートが表示される。


テンプレートのVHDLコード

これを、作成しているコード内にコピーして使う。

で、4KHzのサイン波をカットオフ1KHzのLPFを通した波形。振幅がほぼ0になっている。


同じ波形をカットオフ15KHzのLPFを通した波形。4KHzにピークがある。


MicroBoardでFIRフィルタを作る(4)

2012-12-11 18:05:12 | FPGA
Talkthroughは音声を聞いている分にはOKなのだが、UMB-SSM2603へのPBDAT(DAC)のデータがRECDAT(ADC)より、ちょうど1フレーム遅れでなく、BCLKの0.5クロック分進んでおり、何だか気持ち悪かった。それも1ビット目にデータビットが立っている場合は、データシートでは1ビット目はDON'T CAREにするようにとなっているにもかかわらず、1ビット目のデータがBCLKに同期して立ち上がっていた。
どうも理解できないので、mayaさんに質問したところ、BCLKの立下りでデータをセットしたらとのアドバイスをいただき、直したところRECDATのちょうど1フレーム遅れでPBDATを送出し、ノイズもなくTalkthroughができるようになった。
mayaさんThanks!です。

ChipScope Proの信号観測図


判りにくいが、PBDATのビットの中央でBCLKが立ち上がっている。

それにしても、VHDLにはクセがあるなぁ。
Cに似ているので、うっかりするとはまってしまう。

このブログに、テキストファイルがアップロードできるようになったというのは、自分の間違いだった。
VHDLコードがアップできない。


Talkthroughの構成図

FIRフィルタでは、この24ビットのデータを使って処理する予定。

MicroBoardでFIRフィルタを作る(3)

2012-12-02 14:40:50 | FPGA
ACB-BF592を使わないで、Talkthroughができるようになった。
単純なTalkthroughなら入力と出力を接続することでいけると思うが、firフィルタではパラレル変換後のデータを使うので、今回はシリアル-パラレル、パラレル-シリアル変換をやってTalkthroughができた。
MicroBoardとUMB-SSM2603でTalkthrough
talkthrough回路図

最初は下のようなエラーが出て、なかなかデバッグまで進まなかった。
ネットで検索するとヒットするも、解決方法がわからなかったが、エラーメッセージの中に、こうしろと書いてあった。
デザインツールのバージョンをあげると、エラーにはならないのかも知れないが、ここまでエラーをはくのなら、ツールを修正しておいてほしいのだが。
ERROR:Place:1136 - This design contains a global buffer instance,
   <nReset_IBUF_BUFG>, driving the net, <nReset_IBUF_BUFG>, that is driving the
   following (first 30) non-clock load pins.
   < PIN: u100/state_pb_rstpot.A3; >
....
   < PIN: u100/data_rec_buff_13_dpot.A3; >
   < PIN: u100/data_rec_buff_22_dpot.A3; >
   This is not a recommended design practice in Spartan-6 due to limitations in
   the global routing that may cause excessive delay, skew or unroutable
   situations.  It is recommended to only use a BUFG resource to drive clock
   loads. If you wish to override this recommendation, you may use the
   CLOCK_DEDICATED_ROUTE constraint (given below) in the .ucf file to demote
   this message to a WARNING and allow your design to continue.
   < PIN "nReset_IBUF_BUFG.O" CLOCK_DEDICATED_ROUTE = FALSE; >
ERROR:Pack:1654 - The timing-driven placement phase encountered an error.

上記エラーの場合は、ucfファイルに
PIN "nReset_IBUF_BUFG.O" CLOCK_DEDICATED_ROUTE = FALSE;を追加した。
その後、いろいろ修正しているうちにnReset_IBUF_BUFG.Oがあることが、エラーとなったので、削除した。

次のようなエラーも出たが、同様にucfファイルに
NET "BCLK" CLOCK_DEDICATED_ROUTE = FALSE;を追加することでOKとなった。
ERROR:Place:1108 - A clock IOB / BUFGMUX clock component pair have been found
that are not placed at an optimal clock IOB / BUFGMUX site pair. The clock
IOB component <BCLK> is placed at site <D17>. The corresponding BUFG
component <BCLK_BUFGP/BUFG> is placed at site <BUFGMUX_X2Y9>. There is only a
select set of IOBs that can use the fast path to the Clocker buffer, and they
are not being used. You may want to analyze why this problem exists and
correct it. If this sub optimal condition is acceptable for this design, you
may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this
message to a WARNING and allow your design to continue. However, the use of
this override is highly discouraged as it may lead to very poor timing
results. It is recommended that this error condition be corrected in the
design. A list of all the COMP.PINs used in this clock placement rule is
listed below. These examples can be used directly in the .ucf file to
override this clock rule.
< NET "BCLK" CLOCK_DEDICATED_ROUTE = FALSE; >
ERROR:Pack:1654 - The timing-driven placement phase encountered an error.


以下は現在のucfファイル内容。
最近気がついたが、このブログもテキストファイルがアップできるようになったようなので、他のファイルはもう少し整理してからアップすることにしよう。
いよいよ次はfirフィルタの作成に移るが、また時間がかかるだろうな。
#
# pin constraints
#
NET CLK_40M LOC = "V10"; # clock C10:100M V10:40M K15:66.7M
NET MUTE LOC = "H12";
NET CSB LOC = "G13";
NET SCLK LOC = "E16";
NET SDIN LOC = "K12" | PULLUP;
NET nReset LOC = "V4" | IOSTANDARD = LVCMOS33 | SLEW=FAST | CLOCK_DEDICATED_ROUTE = FALSE; # RESET SW5
#NET LED1 LOC = "P4"; # Running check
NET PBDAT LOC = "D18";
NET PBLRC LOC = "C18";
NET BCLK LOC = "D17" | CLOCK_DEDICATED_ROUTE = FALSE;
NET RECLRC LOC = "G14";
NET RECDAT LOC = "F16";