FC2カウンター FPGAの部屋 2007年02月

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

FPGAの部屋

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

Virtex5のお勉強

Virtex5のユーザーズマニュアルの日本語版がXilinxのサイトにあったので、Virtex5のお勉強をしようと思って、ちらちら読んでいる。
Virtex5にはPLLが実装されているが、やはりジッタが少なくてよいようだ。ジッタフィルタにもなるそうである。これでPCI Expressカードの時に必要だったジッタフィルタ用のICはなくて済むようになるのかもしれない?
CoregenでPLLを作ってやってみているが、DUTYが50%に設定できないところがある。どうしてだろう? おいおいやってみることにする。
実はこの過程で”ISE9.1iのツール群”で書いたように、Constrains Editorを使ったらISEに統合されていて、”えー”こんなになってしまったのかと知ったのだった。
PLLだけテストするといっても、どんな設定があるのか、しかないだろうが、どのようなものなのかテストしてみようと思う。

しかし、ISE9.1iはメモリを食う。今のところメーラー、Firefox、ISE9.1i、Coregen、Acrobat Readerくらいしか動かしていなくて、1.43GByteメモリを食っている。どっかでリークしているのか? 物理メモリは1GByteしか入っていない。。。

やはり、今ISE9.1iを落としても、_pn.exeが残っていて、1.05GByteくらいメモリを消費していた。_pn.exeを強制終了したら、パソコンのメモリ消費量は500MByte程度になった。
  1. 2007年02月28日 06:16 |
  2. Virtex5のお勉強
  3. | トラックバック:0
  4. | コメント:4

ISE9.1iのツール群

ISE9.1iでは、今まで独立に立ち上がっていたツールが、ISEから実行するとISEのウインドウ内に統合されるようになった。
Constraints Editor, PACE, Timing Analyzer, iMPACTなどがそうだ。これはこれで見やすくてよいかもしれない。
Timing AnalyzerをISE上で動作させると、表示の仕方も変化している。下の図のように3ペインでかっこよくなっている。

追加:どうやら3ペインになるのはVirtex4とVirtex5だけみたいです。Spartan3EとVirtex2proは今までどおりに別にツールが起動しました。ただし、Spartan3EでiMPACTだけは統合されているのを確認しました。どうしてこうなっているのでしょうか? 皆さんのところでも同じですか?

ISE91i_tm_ana_1_070227.png

でも、WindowsのスタートメニューからTiming Analyzerを単体で起動すると、以前の表示のままである。ここは変わらないようだ。
ISE91i_tm_ana_2_070227.png

当ブログとしては、ブログに貼り付けやすいので、以前の表示のほうが良いと思っている。古いほうも残っていて良かった。
さて、CTRL+ALT+DELでタスクマネージャーを出してプロセスを見てみると、単体で立ち上げたTiminig Analyzerは_timingan.exeとして起動しているが、ISEに統合されたTiming Analyzerは_timingan.exeとしては起動していないようだ。完全にISEに統合されて、その機能はDLLとして使われているのだろうか?
  1. 2007年02月27日 06:25 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:0

電気めっき実験(ニッケルめっき、6年生の科学)

今日は、学研の6年生の科学3月号の実験付録、ニッケル電気鍍金をやってみた。これで息子の6年生の科学も最後になる。毎回、面白い付録があって楽しめた。といっても、作ったのは半分くらいか。最後ということで、やってみた。
+電極にニッケル版、-電極にめっきする銅板をつけて、硫酸ニッケルの水溶液につけて単三電池1本の電圧を加える。
そうすると3分から5分くらいでニッケルめっきができる。
銅板の表面にマジックで文字や模様を書くと、そこだけめっきが載らないので、文字がかけるという寸法だ。
うちの息子は、渋くドリフのメンバーを書いた。下の写真がいろいろな部品と文字を書いた銅板、ブー、いかりや、加藤茶と書いてある。
Plating_1_070225.jpg

+電極にニッケル版、-電極にめっきする銅板をつけて、硫酸ニッケルの水溶液につけて単三電池1本の電圧を加える。
Plating_2_070225.jpg

最初は、銅の色をしている。(当たりまえ)めっき液はうすーい水色。
Plating_3_070225.jpg

3分後くらいに、銀色になってめっきが出来る。
Plating_4_070225.jpg

ハード型の銅版だけがめっき終了している。その他はまだ。
Plating_5_070225.jpg

全部めっきして、マジックで書いたのを消しゴムで消したところ。マジックを消すとコントラストが落ちるので見にくい。
Plating_6_070225.jpg


6年の科学は私もずっと取っていて、いろいろな実験をやった。つまり親子2代でやっていることになる。
私が子供の頃実験した中で、一番印象に残っているのは、二酸化マンガンに過酸化水素水を加えて酸素を発生させる実験だ。実験終了後に二酸化マンガンを捨ててしまって、悔しい思いをした。触媒ということがわからなかった。今思えば、それも何か石を入れても変わらなかったのでは?と思う。
望遠鏡を作るのも面白かった。作った望遠鏡で見た月は格別だった。
もう終わってしまうので残念だ。
  1. 2007年02月25日 20:02 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Verilog2001版DDR SDRAMコントローラーのISE9.1iSP1によるインプリメント

Verilog2001版DDR SDRAMコントローラーのインプリメントでISE9.1iSP1でインプリメントするとロータリーエンコーダと設定値を表示するLCD表示回路は動作するが(下の写真のピンクで囲んだ部分)、DDR SDRAMのリード値を表示するLCD表示回路(下の写真の緑色で囲んだ部分) は "0000" のままで表示が変化しない。
DDR_Verilog_ISE91i_Config_2_070224.jpg

ISE9.1iSP1 がおかしいのかと思って、.ngc を何とかテキストに変換して ISE8.2iSP3 のものと比較しようかと思ったが、うまく行かない。Translate終了後のVerilogシミュレーションモデルも比較してみたが、まったく違っていて比較が出来ない。
その時に、ふとFPGAインフォメーションBBSConfiguration Rateを変更したらコンフィギュレーションが安定したという記事を見たのを思い出した。

これ以下の記述は間違っています。コンフィギュレーションレートを変更して正常動作したのではなくて、何度もコンフィギュレーションすると正常動作するようです。

もしかしてと思って、"Generate Programming File" の Properties の Configuration Options の Configuration Rate の Default(1) を 3 に変更してみたら、今まで動かなかったDDR SDRAMのリード値を表示するLCD表示回路も動くようになった。
DDR_Verilog_ISE91i_Config_070224.png

Help を見ると Spartan3E のデフォルトの clock configuration rate は 1MHz だそうだ。ヘルプの文章を引用する。

Configuration Rate

Specifies the clock configuration rate in MHz. Select a value from the drop-down list. For Spartan™-3 devices, the default is 6 MHz. For Spartan-3E, the default is 1 MHz. For Spartan-3A and Spartan 3A Extended, the default is 25 MHz. For all other devices, the default is 4 MHz.


コンフィギュレーションのクロックをあげると、動作するようになるということはなぜなのだろう?
またナゾが増えたが、動作するようになったのはうれしいことだ。

ISE8.2iSP3 の設定を見てみたが、Default(1) で同じだった。ISE8.2iSP3 では問題なくて ISE9.1iSP1 では問題があるということだろうか? またナゾが。。。

補足:新しいプロジェクトを作成して、最初にコンフィグするときに正常動作しない状態になりやすいようでした。5回中2回再現しました。(iMPACTでコンフィグが成功しても、上記のように正常動作しませんでした)いずれの場合も、もう一度コンフィグすると正常になります。
それとはまた別にプロジェクトを作成する場合にISEが反応しなくなる、または落ちる状況が発生しました。

また1回は上の条件でなくても発生しました。やはりiMPACTを立ち上げて最初の一回目です。やり直せば問題ありません。
  1. 2007年02月24日 08:22 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:20

Spartan3E Starter Kit用DDR SDRAMコントローラへのリンク

このブログでは記事をカテゴリ分けしているがカテゴリを分けていくと、どっちに入れていいか悩む記事も出てくる。
Spartan3E Starter Kit用DDR SDRAMコントローラも”DDR SDRAMコントローラ”というカテゴリに入れないで”Spartan3E Starter Kit”のカテゴリに入れてしまった。やはり”DDR SDRAMコントローラ”に入っていないのはおかしいのでリンクを入れることにした。”DDR SDRAMコントローラ”カテゴリをご覧の方はリンクを置いておきますので興味がありましたら飛んでください。
Spartan3E Starter KitでのDDR SDRAMコントローラのテスト
DDR SDRAMコントローラ回路の途中経過
Spartan3E Starter KitのDDR SDRAMコントローラについての疑問
Spartan3E Starter KitのDDR SDRAMコントローラについての疑問2
Spratan3E Starter KitのDDR SDRAMコントローラまとめ
Spratan3E Starter KitのDDR SDRAMコントローラまとめ2
Spratan3E Starter KitのDDR SDRAMコントローラまとめ3
Spratan3E Starter KitのDDR SDRAMコントローラ(プロジェクト)
Spratan3E Starter KitのDDR SDRAMコントローラの説明

更に不完全ですがFree Model Foundryのモデルを使用してDDR SDRAMコントローラのシミュレーションをしてみたのがこちらです。
DDR SDRAMシミュレーションモデル
DDR SDRAMコントローラのシミュレーション(FMFライブラリを作る)
DDR SDRAMコントローラのシミュレーション1(コンパイルスクリプト)
DDR SDRAMコントローラのシミュレーション2(シミュレーションスクリプト)

2006/12/19 : Spartan3E Starter KitでのDDR SDRAMコントローラのブログを読んでいると整合性が取れないと思います。それは最初はDDR SDRAMコントローラ作製予定のようにDCMの動的位相シフトを利用してクロックをシフトしてリードデータを受けるクロックをうまい位置にあわせようとしていたからです。そのうちにVirtex4やSpartan3EのIOBの遅延素子のことをテストするうちに、Spartan3Eでもこれを利用してリードデータそのものを遅延させればOKでは?と考えて、そうしてみたらうまくいったようだというのがSpratan3E Starter KitのDDR SDRAMコントローラまとめです。

2007/02/22: Verilog 2001版DDR SDRAMコントローラへのリンクを追加します。
Verilog 2001版DDR SDRAMコントローラは、以前作ってあったSpartan3E Starter Kit用VHDL版DDR SDRAMコントローラをVerilog2001に書き直したものです。VHDL版では秘密だった controller.vhd も controller.v としてソースを入れてあります。
Verilog2001版DDR SDRAMコントローラーのインプリメント
Verilog2001版DDR SDRAMコントローラーのインプリメント2

2007/09/02:追加
Verilog2001版DDR SDRAMコントローラーのシミュレーションについてのやり方をリンクしました。
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ2
  1. 2007年02月22日 19:22 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

不可解な ISE6.3i

今、一番信用しているISEのバージョンが6.3iだ。しかし、この前ディスクが壊れたのでISE6.3iもインストールし直したのだが、以前にインプリメントできていたプロジェクトが出来なくなってしまった。
Place & RouteでUnroutedになってしまう。
ハードディスクが壊れる前はインプリできていて、その時に圧縮してあったプロジェクトを戻して、インプリメントにチェックが入っているのを再インプリメントするとルートできない。何でだろう?
BUFGMUXとDCMのロックをはずすとインプリメントできるのだが、今度は回路が動作しない。何で、以前出来ていたのが出来ないのだろう?
同じようにSP3かけてあるし。。。ナゾである。
  1. 2007年02月20日 21:01 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:4

これからの展開

これからのやりたいことを書こうと思う。

(1) Verilog2001版DDR SDRAMコントローラがなぜISE9.1iで動かないかを調べる。
これはNGC2EDIFコマンドを実行してEDIFにして、ISE8.2iとの違いを調べてみようと思ったが、このコマンドは6.3iまでで、もうサポートされていないようだ。どうもコンペアする方法が見つからない。
もしかすると、ローカル変数をつかっているところがだめなのだろうか? generate文に変えると直る?

(2) Verilog2001版DDR SDRAMコントローラをSynplify Proで論理合成。
まだ探していないが、インクルードパスを指定する方法がわからない。

(3) Spartan3A Starter Kitを買ったので(まだ届いていない) DDR2 SDRAMコントローラを作る。
基板が来てから出ないと、意欲がわかない。

(6) ディスプレイに文字をだす。
これは、何らかのCPUを入れることになるかな?
でもDDR SDRAMコントローラをフレームバッファに使って、ピンポンゲームをオールハードで作っても良いか?
DDR SDRAMコントローラのデバックにもなるし。。。

(5) お仕事のFPGAの内部バスの変更。
出来れば汎用チップ内バスを使いたいが、そのままではだめなので、独自に規格を策定することになると思う。

(6) お仕事用、SDR SDRAMコントローラを作る。
こっちはいままでのDDR SDRAMコントローラのように単純ではないので、作るのが面倒だ。内部バス及びアーキテクチャの規格を決めないとだめだし。。。

(7) お仕事用、PowerPC MPXバス・インターフェースを作る。
これも内部バス及びアーキテクチャの規格を決めないとだめだし。。。

(8) お仕事用、PCI-Xインターフェースを作る。
以下同文。

お仕事用も家でもやっていることがある。半分趣味なんだね。
お仕事用は全コードをブログに載せられないけど。経過とかは書けると思う。
  1. 2007年02月20日 06:07 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:4

医療費控除

今日は、午後から所得税の医療費控除の申請のために、医療費の集計をした。
今年は息子が入院したので医療費が約100万円かかってしまった。だいぶ戻って来ているが、医療費にびっくりした。総額で300万円以上かかっていることになる。
午後一杯かかってしまったが、大体、申請書類も作成できた。今は国税庁のWeb上から申請書類を作成できるので便利だ。PDFに落ちるので、毎年ファイルをセーブしてある。
これを税務署に郵送すればOKだが、相当大きな封筒が必要だ。
  1. 2007年02月18日 21:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

画像ファイル・フォーマットの違い

ブログに画像を貼るときにどのフォーマットにするか悩むことはないだろうか?
私は画像の加工にはPixiaを使っている。使いやすくフリーなので気に入っている。作者の方、いつも使わせていただいて、ありがとうございます
私は最初の頃はISEなどのツールをキャプチャした画像を、JPEGにしてブログに貼っていたが、これだと容量が大きい割りに字の周りにノイズが載っている。例えばこのFloorplannerの画像は825×585ピクセルの大きさで163KByteの大きさがある。
ISEなどのツールをキャプチャした画像はJPEG圧縮はあまり向かないようなのでPNGにすることにした。最近のこのISE8.2iの画像は865×705ピクセルで73.2KByteだ。PNGの方が画質も良いようだ。
でも写真はやはりJPEGの方が良いのでJPEGを使っている。
  1. 2007年02月18日 08:45 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

シミュレーション時とインプリメント時でのインクルードファイルの使い分け

Verilog2001版DDR SDRAMコントローラーでDDRtest_verilog/DDRtest_synth フォルダにある ddr_cont_parameters.vh とDDRtest_verilog/simulation フォルダにある ddr_cont_parameters.vh の内容が違うのに気がつかれただろうか?
両者は MAX_INITIAL_COUNT_VAL の値だけが違っている。
DDRtest_verilog/DDRtest_synth フォルダにある ddr_cont_parameters.vh は

// 電源ONの時に200us間、ckeをlowにして、DQ,DQSをハイ・インピーダンスにする。そのためのカウンタ用の最大値
parameter MAX_INITIAL_COUNT_VAL = 11'b10011100010; // 1250


だが、DDRtest_verilog/simulation フォルダにある ddr_cont_parameters.vh は、

// 電源ONの時に200us間、ckeをlowにして、DQ,DQSをハイ・インピーダンスにする。そのためのカウンタ用の最大値(シミュレーション用に時間を極端に短縮してある。)
parameter MAX_INITIAL_COUNT_VAL = 11'b00000000100; // 4


になっている。
これは、本当はDDR SDRAM では、電源ONから 200us 後に初期化を始めなければならないが、シミュレーションでは 200us 待っていたら日が暮れてしまうので、それを大幅に短縮している。それをISEでのインプリメントに適用してしまうと、まずいため正規のインプリメント用 ddr_cont_parameters.vh を使用している。
こうするとシミュレーションとインプリメントでVerilogコードを書き換えなくてもすむので、インプリメントしてからシミュレーションをしても、ISEにインプリメント結果が残るというメリットがある。
  1. 2007年02月17日 05:44 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:9

Verilog2001版DDR SDRAMコントローラーのインプリメント2

Verilog2001版DDR SDRAMコントローラーのインプリメントの続きです。
ProcessesペインのSynthesizeを右クリックして Properties... を選択します。
DDR_Verilog_15_070215.png

Process Propertiesダイアログが出るので、Synthesis Options を選択。ダイアログの Verilog Include Directories の右端の "..." ボタンをクリックすると”フォルダの参照”ダイアログが出るので、"DDRtest_verilog/DDRtest_synth" を選択する。その後、”フォルダの参照”ダイアログの OK ボタンをクリック。
DDR_Verilog_16_070215.png

Process Propertiesダイアログに戻るので Verilog Include Directories にパスが入ってることを確認して OK ボタンをクリック。これで .vh のインクルードファイルのパスを指定する。
DDR_Verilog_17_070215.png

これで設定は終わったので、Processesペインの Generate Programming File をダブルクリックして、プログラミングファイルを作る。
DDR_Verilog_18_070215.png

全部チェックがついてインプリメント、プログラミングファイルが出来たら今度は Configure Deviceをダブルクリックして iMPACT でFPGAをコンフィギュレーションしてみよう。
DDR_Verilog_19_070215.png


これから先は特に説明しないので、スパルタン3スタータキットでのISE8.1iのチュートリアル7(コンフィギュレーション編)などを見ながらやってみよう。Spartan3E Starter Kitでは3つ出てくるが最初の xc3s500e にだけDDRtest.bitを読み込ませて、右クリックで Program を選択してコンフィギュレーションしてみよう。
うまくコンフィギュレーションできれば、下の写真のように表示される。(といっても、LCDの上下行の 931B が表示されているところの初期値は 0000 です)
DDR_CONT_Verilog_060204.jpg


LCDの上の最初の4桁の数字 (931B) をロータリーエンコーダで入力できる。その次の3桁 (13C) のキャラクタの最初の'1'は値を変更する桁を表す。'1'だとLCDの上の最初の4桁の数字 (931B) のうちの2桁目の'1'のところを表す。'0'だと1桁目 (B)、'3'だと4桁目 (9) を表す。
(13C) のうちの'3'はステータスを表す。つぎの'C'はChangeモードを表しているChangeモードでは、ロータリーエンコーダを回すと、その桁の値が増減する。(チャッタリングがあるので、うまくアップダウンしないことがあるかもしれない)。ロータリーエンコーダのつまみを一回クリックすると'C'で表されるChangeモードから、'M'と表示される。Moveモードに移行する。これでは値を変更できる桁が、ロータリーエンコーダをまわすと移動する。ロータリーエンコーダをもう一度押すとChangeモードに移行する。
上の最初の4桁の数字 (931B) を設定する時には、Moveモードで変更する桁まで移動してから、Changeモードにして値を変更する。
ロータリーエンコーダの右のボタンを押すと、値を設定した最初の4桁の数字 (931B) を DDR SDRAMコントローラーでDDR SDRAMに書き込む。ロータリーエンコーダの左ボタンを押すとDDR SDRAMから読み出して、下の行の4桁の数字で表示する。
上の写真は 931B をDDR SDRAMへ書き込んで、DDR SDRAMから読み出したところ 931B が読めたということだ。

なお、現在のところISE8.2iでインプリメントするとSpartan3E Starter Kitで正常に動作するようだが、ISE9.1iでインプリメントすると動作しないので、注意してください。

2007/06/24: 追記
ISE9.1iでもインプリメントして動作しました。詳しくはVerilog2001版DDR SDRAMコントローラーのISE9.1iSP1によるインプリメントをご覧ください。
  1. 2007年02月16日 21:11 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

Verilog2001版DDR SDRAMコントローラーのインプリメント

Verilog2001版DDR SDRAMコントローラーのインプリメントの仕方をちょっとだけ。。。

インプリメントに使用するVerilogファイルはシミュレーションに使用したものと同じものです。Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1からダウンロードしてください。

最初にWebPACK ISE8.2iを起動する。
File -> New Project... を選択する。
DDR_Verilog_1_070210.png

New Project Wizard - Create New Projectウインドウが開くので、Project Nameを DDRtest_Synth と入力する。Project Location の脇の”...”ボタンをクリックすると"フォルダ参照”ダイアログが開くので、 DDRtest_verilogを選択する。
DDR_Verilog_2_070210.png

New Project Wizard - Device Propertiesウインドウが開くのでFamily, Device, Package, Speed, Simulatorの部分を入力する。Next>ボタンをクリック。
DDR_Verilog_3_070210.png

New Project Wizard - Create New Sourceウインドウが開く。Next>ボタンをクリック。
DDR_Verilog_4_070210.png

New Project Wizard - Add Existing Sourcesウインドウが開く。
DDR_Verilog_5_070210.png

Add Source ボタンをクリックするとファイルを選択するダイアログが開くので "dcm100.xaw" と "DDRtest.ucf" を選択する。
DDR_Verilog_6_070215.png

”開く”ボタンをクリックすると、"dcm100.xaw" と "DDRtest.ucf" が Add Existing Sources に追加される。
DDR_Verilog_7_070215.png

もう一度、Add Source ボタンをクリックする。ファイル選択のダイアログで1つ上のフォルダ (DDRtest_verilog) に移動して、下の図の通りにファイルを選択して”開く”ボタンをクリック。
DDR_Verilog_8_070215.png

今、プロジェクトに入れたVerilogファイルは、Add Existing Sources の Copy to Project がチェックが入っていると思う。このままだとプロジェクトフォルダにコピーされてしまうので、チェックをはずそう。
DDR_Verilog_9_070215.png

次にもう一度、Add Source ボタンをクリックする。ファイル選択のダイアログで DDRtest_verilog/ddr_controller に移動し、下の図の通りにVerilogファイルを選択する。そして”開く”ボタンをクリック。
DDR_Verilog_10_070215.png

やはりここでも、プロジェクトに入れたVerilogファイルは、Add Existing Sources の Copy to Project がチェックが入っていると思う。このままだとプロジェクトフォルダにコピーされてしまうので、チェックをはずそう。
DDR_Verilog_11_070215.png

New Project Wizard - Project Summary が出るので Finish ボタンをクリックして終了。
DDR_Verilog_12_070215.png

Adding Source Files... ダイアログが出るので、OK ボタンをクリック。
DDR_Verilog_13_070215.png

これでプロジェクトが完成。
DDR_Verilog_14_070215.png

今日はここまで。
  1. 2007年02月15日 21:27 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:2

目が赤い

何か火曜日あたりから目が赤くなってしまった。目やにも出る。

Verilog2001版DDR SDRAMコントローラのインプリメンテーション編をやる予定だったが、一時お休み。
ま、大体やり方はわかると思う。
インクルードファイルのパスを指定するのを忘れずに。。。
  1. 2007年02月14日 18:45 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Verilog2001版DDR SDRAMコントローラのバグ

mixiの方からModelSimとは違うシミュレータでVerilog2001版DDR SDRAMコントローラがシミュレーションできないという報告をもらった。

最初のバグは、ontroller.v 724行目のendcaseの後に ; を入れてしまったことだ。こう書いてもModelSimではエラーを出さないようだ。VHDLだと ; を書くので思わず入れてしまったようだ。

もう1つは write_data_module.v でグローバル変数 j を定義してその j を2つのalways @* 内で使用してしまったのでレース状態が発生してしまったらしい。ModelSimはそれでも動作するがシミュレータによっては無限ループになるらしい。必ずしもシミュレータが悪いのではなく、記述が悪かった。
元のVerilogコードは、(途中を抜いているが。。。)

    integer  j;

    // inferr the 3-State buffer
    always @ * begin
        for (j=DDR_DATA_WIDTH-1; j>=0; j=j-1) begin
            if (out_tri[j] == 1'b1)
                ddr_dq[j] <= 1'bZ;
            else
                ddr_dq[j] <= ddr_out[j];
        end
    end

    // inferr the 3-State buffer
    always @ * begin
        for (j=DDR_DQS_DM_WIDTH-1; j>=0; j=j-1) begin
            if (dqs_tri_enable_2dx[j]==1'b1)
                ddr_dqs[j] <= 1'bZ;
            else
                ddr_dqs[j] <= dqs_out[j];
        end
    end


これだとalways @*なのでイベントリストには j も入ってしまって、2つのalways @*文の間で無限ループになってしまうということだ。
シミュレータの作りとしては、

1) グローバル変数 j の値とイベントフィールドをタイムホイールに生成する。
2) 1つ目の always @* をDELTA時間で評価する。j が変化したので値とイベントフィールドを更新。
3) j の変更イベントフィールドがアップデートされているので、2つ目の always @* を同じDELTA時間で評価する。j が変化したので値とイベントフィールドを更新。
4) j の変更イベントフィールドがアップデートされているので、1つ目の always @* を同じDELTA時間で評価する。j が変化したので値とイベントフィールドを更新。

ということで、3)と4)を繰り返すことが考えられる。
間違っているかもしれないが、このようなことなのだろうと理解した。
j をグローバル変数ではなく、ローカル変数にする方法も教えていただいたのでローカル変数に変更して、この問題を逃れた。それが下のVerilogコードだ。(ちなみに本当はgenerate文で書いたほうが良いそうだ。)

    // inferr the 3-State buffer
    always @ * begin :Ddr_Dq_Gen_Loop
        integer k;
        
        for (k=DDR_DATA_WIDTH-1; k>=0; k=k-1) begin
            if (out_tri[k] == 1'b1)
                ddr_dq[k] <= 1'bZ;
            else
                ddr_dq[k] <= ddr_out[k];
        end
    end

    // inferr the 3-State buffer
    always @ * begin :Ddr_Dqs_Gen_Loop
        integer k;
        
        for (k=DDR_DQS_DM_WIDTH-1; k>=0; k=k-1) begin
            if (dqs_tri_enable_2dx[k]==1'b1)
                ddr_dqs[k] <= 1'bZ;
            else
                ddr_dqs[k] <= dqs_out[k];
        end
    end


always @ * begin :Ddr_Dq_Gen_Loop というようにbegin end に :Ddr_Dq_Gen_Loop というようなユニークな名前をつけると、その中でスコープを保証する記述になるそうです。(なお、Quartusではローカル変数を使ったVerilog記述は使用できない可能性があるそうです)

もう1つgenerateのgenvarもユニークな変数を割り当てなければだめなようです。

いろいろ問題点を指摘していただいて、ありがとうございます。

今度はインプリメントを説明してみようと思う。
もうわかっている方もいらっしゃると思うが、シミュレーションとインプリメントでパラメータを変更できるようになっている。実際のパラメータでシミュレーションすると何時間かかるかわからない。。。
  1. 2007年02月12日 18:34 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:10

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ2

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめの続きだ。
前回、コンパイルしたところで終了だったので、今度はシミュレーションをスタートする。
以前やったVerilog2001版DDR SDRAMコントローラーのModelSimシミュレーション2を参考にしてほしい。
unisim_ver ライブラリを読み込んで glbl も読み込むために以下のコマンドをtranscriptペインで実行する。

vsim -t ps -L unisims_ver work.DDRtest_tb work.glbl


Verilog_simu_15_070209.png

コマンドを実行するとインスタンスがエラボレートされて以下のような状況になると思う。
Verilog_simu_16_070209.png

Waveウインドを表示するために、View メニューからDebug Windows -> Wave を選択する。
Verilog_simu_17_070209.png

Objectペインで右クリックしてAdd to Wave -> Signal in Region を選択して DDRtest_tb の信号を全部waveウインドウに入れる。
Verilog_simu_18_070209.png

シミュレーションを実行するために、Transcriptペインで run -all とコマンドを入れる。
Verilog_simu_19_070209.png

これでシミュレーションがスタートした。ModelSim XEⅢ 6.1e Starterだとかなり時間がかかるが10分くらい待てばシミュレーションが終了すると思う。ModelSim SEだとかなり速いんだけど。。。
Finish Vsim, Are you sure you want to finish? ダイアログが出てくるので”いいえ(N)”ボタンをクリックする。はいをクリックするとModelSimが終了してしまうので注意。一度終了してしまい悔しい思いをしたことがある。
Verilog_simu_20_070209.png

シミュレーション結果を見るためにwaveウインドウのタブをクリックして前面に出す。
次にZoom Fullアイコンをクリックすると全体が見えると思う。
Verilog_simu_21_070209.png

Write波形、Read波形が見える。
Verilog_simu_22_070209.png

次にコメントで教えていただいたステートマシンのステートをステート名で表示する方法だ。
まずはWorkspaceペインのsimタブをクリックして、Instanceを見てDDRtest_tb/DDRtest_inst/ddr_sdram_cont_inst/controller_instをクリックする。
Objectsペインを見ると MAIN_STATE, INIT_STATE, STATE_DETS があるのでそこで右クリックして Add to Wave の Selected Signals を選択する。
Verilog_simu_23_070209.png

次にwaveウインドウの MAIN_STATE, INIT_STATE, STATE_DETS を選択して右クリック。
Radix から ASCII を選択するとステート名を表示できる。
Verilog_simu_24_070209.png

このようになります。
Verilog_simu_25_070209.png

さらにUndockをクリックしてwaveウインドウを外に出して大きく表示してみよう。

後は自分で確かめてみてください。
関連記事はSpratan3E Starter KitのDDR SDRAMコントローラの説明などあるのでご参照ください。
更に関連する質問のある方はコメントを使ってもらうか、もしくは、abcd_marsee101@mail.goo.ne.jp から adcd_ を除いたメールアドレスに、ご連絡ください。
  1. 2007年02月11日 08:29 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:6

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1

今までやってきたVerilog2001版DDR SDRAMコントローラーのModelSimシミュレーションのまとめだ。
今回はModelSim XE� 6.1e StarterのVerilog版でやることにする。今回はModelSimのプロジェクトを作ってみようと思う。
まずはここからVerilogファイルを興味のある方はダウンロードしてください。
2006/02/11: mixiの方から違うシミュレーターで動作しないというご指摘を受けたので一時公開を中止します。検証してから、もう一度公開したいと思います。何しろVerilog初心者なものですから申し訳ありません。
2006/02/12: 修正して再度Verilogファイルをアップしました。for(;;)ループに使う i などの変数をローカル変数にしました。generateのgenvarをそれぞれにユニークな変数にしました。
2006/02/13: wrdata_fifo.v のgenerate 文の genvar を修正するのを忘れていたので修正しました。

例によって保証はありません。プロジェクトやファイルは個人的に実験するのみで、商用に使用することや再配布は禁止します。DDR SDRAMコントローラを部品として組み込んで使う場合には何の一部として使ったかコメントで教えてください。ダウンロードして試してみた方も動いたどうかコメントで教えてください。
XilinxのアプリケーションノートXAPP253を参考に作ってありますが、自分で書き換えてあります。更にVerilog2001に変更してあります。今回はcontroller.vも公開しました。何かファイルを公開する上での問題がありましたらabcd_marsee101@mail.goo.ne.jp から adcd_ を除いたメールアドレスに、ご連絡ください。早急に対処いたします。

ZIPファイルを解凍すると DDRtest_verilog フォルダがあると思う。その中に simulation フォルダがある。このフォルダでシミュレーションをしてみよう。
まずはPicoBlazeをダウンロードしよう。Spartan3用(Spartan3Eも大丈夫のようだ)のPicoBlazeはこのページからたどってダウンロードする。
もしリンクがない場合はXilinx社のページでPicoBlazeのキーワードでサーチすれば見つかるはずだ。
詳しい入手方法はFPGA LaboratoryさんのPicoBlazeTMの入手法などを参考にしてほしい。
ダウンロードしてきたKCPSM3.zipを展開してVerilogフォルダの中のkcpsm3.vファイルをDDRtest_verilogフォルダの下にコピーする。今回はinstrom.vはアセンブル済みのものがダウンロードしたDDRtest_verilog_??????.zipに入っている。
アセンブラのファイルinstrom.psmも入っているのでPicoBlazeのアセンブラでアセンブルすることも出来る。詳しいことはFPGA LaboratoryさんのPicoBlaze�の使用法(出力編)スパルタン3EスターターキットのLCD表示回路5などに書いてある。

次に512Mb DDR SDRAM Component : MT46V32M16P-6TのVerilogモデルをダウンロードする。
ダウンロードした 512Mb_ddr.zip の中の ddr.v と ddr_parameters.vh を DDRtest_verilog\\simulation の下に入れる。
ここでスピードグレード6とデータビット幅16bitを指定するために ddr.v をちょっと変えてみた。
Verilog_simu_4_070209.png

上のように

`define sg6
`define x16


を書き込む。

最後にVerilog2001版DDR SDRAMコントローラーのModelSimシミュレーション2に書いてあるようにISE (or Webpack) のインストールフォルダ/verilog/src/glbl.v を DDRtest_verilog フォルダの下にコピーする。
Verilog_simu_11_070209.png


これで準備は終了したので、まずはModelSimのプロジェクトを作ろう。
まずは ModelSim XE� 6.1e Starter を起動する。起動したらFileメニュー -> New -> Project...を選ぶ。
Verilog_simu_1_070209.png

現在のプロジェクト閉じるけど、続けますか?というダイアログが出るのでOKボタンをクリック。
Verilog_simu_1_070209.png

Create Projectダイアログが出る。Project Nameの項にDDRtest_verilogと入力する。
Project LocationのBrowse...ボタンをクリックすると、Browse to directory home for new... ダイアログが開くのでDDRtest_verilog\simulationを指定し、OK ボタンをクリック。次に、Default Library Nameをディフォルトのworkのままで OK ボタンをクリックする。
Verilog_simu_2_070209.png

ここでAdd items to the Projectダイアログが出るので、Verilogファイルを追加しよう。まずはDDR SDRAMモデルとテストベンチを追加する。 Add Existing File をクリックする。
Verilog_simu_5_070209.png

Add file to Project ダイアログが出る。Browse... ボタンをクリックする。
Verilog_simu_5_070209.png

Select files to add to porjectダイアログが開くので"DDRtest_tb.v" "ddr.v" を選択して、”開く"ボタンをクリック。
Verilog_simu_6_070209.png

Add file to Project ダイアログが再び出て来るので OK ボタンをクリック。
Verilog_simu_7_070209.png

"DDRtest_tb.v" "ddr.v" がプロジェクトに入ってWorkspaceペインに表示される。
Verilog_simu_8_070209.png

同様に Add items to the Project ダイアログの Add Existing File をクリックして DDRtest_verilog フォルダの下の.vファイルを全てプロジェクトに入れる。(LCD表示回路、PicoBlaze、ロータリーエンコーダー制御回路など)
Verilog_simu_9_070209.png

もう一度、 Add items to the Project ダイアログの Add Existing File をクリックして DDRtest_verilog\ddr_controller フォルダの下の.vファイルを全てプロジェクトに入れる。(DDR SDRAMコントローラのVerilogファイル)
Verilog_simu_10_070209.png

更に、Add items to the Project ダイアログの Add Existing File をクリックして DDRtest_verilog\DDRtest_synth フォルダの下の dcm100.v ファイルをプロジェクトに入れる。
Verilog_simu_12_070209.png

Add items to the Project ダイアログの close ボタンをクリックして閉じる。
Workspaceペインで右クリックして Compile -> Compile All を実行して、全てのVerilogファイルをコンパイルする。
Verilog_simu_13_070209.png

全部のVerilogファイルをコンパイルして、全て成功するはず。
Verilog_simu_14_070209.png


今日はこの辺で終了。
  1. 2007年02月10日 21:58 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

サイプレスPSoC Expressセミナー

サイプレスPSoC Expressセミナーの案内が来た。
”この無料セミナーでは、PSoC及びPSoC Express設計ツールに関する概要説明と実際のツールを使って設計を体験するトレーニングを行います。
セミナー中にご提供する設計キットは、終了後にお持ち帰り頂き、すぐにご自分の設計が始められます。”
だそうです。
前回は足の指の骨折でいけなかったので今度こそと思い、申し込んだ。3月7日でパシフィコ横浜だそうだ。
今度こそ行くぞ~。
申し込みはここからだそうだ。
  1. 2007年02月08日 19:47 |
  2. PSoC
  3. | トラックバック:0
  4. | コメント:0

近況

一昨日はすすたわりさんの研究室と飲み会。すすたわりさんとお話をしたが今度メジャーな本(本屋で売っている)を出されるそうだ。出たら購入しようと思う。
FPGAを100段以上のパイプラインの演算器として使っている先生とお話をした。すごい。FPGAの内部遅延を知り尽くしている感じだった。
Verilog2001版のDDR SDRAMコントローラは整備してダウンロードできるようにしようと思っている。今度の土日で作業しようか?
仕事はデバックをしなくてはいけないし、報告書もだいぶ赤が入って戻って来た。中学生になった気分。書き直さないと。。。
FPGAの内部を作り直すので各モジュールのインターフェース仕様書を書く必要に迫られている。その後、PCI-Xモジュールも作らないといけないし。PowerPCのMPXバスインターフェースモジュールも。。。
  1. 2007年02月08日 06:15 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーション7

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーション7だ。
シミュレーションも完了し、ISE8.2iでインプリメントしてもSpartan3E Starter Kitで動作した。リードデータが読めなかったのは、コントローラ本体のステートマシンの組み合わせ回路のif文のelse項目がないのがあってGated Clockになっていたからだった。
実はISE9.1iでインプリメントもしてみたが同じプロジェクトで動作しなかった。これは非常に興味深い。両方のインプリメント結果を比較してなぜ動かないかを解明してみようと思う。
これからはシミュレーションはシミュレーションのカテゴリで、Sprtan3E Starter KitでのインプリメントはSprtan3E Starter Kitカテゴリで、ISE9.1iについてはXilinx ISEについてカテゴリで書こうと思う。
更にVerilogの疑問での疑問は、同じiを使っても問題ないという結果になった。実際にやって確かめてみた。

DDR_CONT_Verilog_060204.jpg

  1. 2007年02月05日 21:30 |
  2. 入門Verilog
  3. | トラックバック:1
  4. | コメント:0

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーション6

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションは大体終了した。
いろいろどたばたがあったどうもうまく動かないと思ったら古いバージョンのVHDLを元にVerilog2001に直してしまった。新しいバージョンとWinMergeで比較しながらVerilogを修正した。バージョン管理が出来てない、反省。
これでシミュレーションは動いたと思ったのだが、実際にISEでインプリメントすると動かない。そうしたら今度はINSTROM.Vのバージョンが古かった。
もう一度インプリメントしてもまだリードデータが出てこない状況だ。もう一度見直してみたい。
  1. 2007年02月05日 06:05 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0

130000ゲット

blog_130000_access_070202.png

昨日の夕方頃、自分のブログを見たらカウンタが130000になっていたのでスクリーンショットを取った。これはfpga-lab.orgさんのChipScope™ Proの使い方を見ていたときに自分のブログへのリンクがあるのでクリックしたみたときだった。

Verilog2001版DDR SDRAMコントローラはDDR SDRAMコントローラの部分は大体(でもまだタイミング違反がある)動いたのだが、周辺のロータリーエンコーダの辺りで動かないようだ。VHDL版と見比べてみることにする。

3月の発表練習は1通りやってPowerPointを修正。もっとグラフィカルにしたのだがハイパーリンクを多用したので本番であせるとミスりそうだ。もうちょっと修正してスライドを増やして対応したほうが良いようだ。近くの方は来て下さい。基板を作ったよという話ですけど。。。
  1. 2007年02月03日 05:38 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーション5

シミュレーションは大体終了した。と思ったらビット演算子の否定~をVHDLの否定!に大幅に間違えていた。あわててPeggyで.vを全部検索して変更した。

assign reset_ddr_cont = reset | (!dcm_locked);


エラーはでないようだ。論理的な否定では使うからか?ifの括弧の中では使えるようだ。そうすると!を前につけて否定した信号が1ビット幅だったらOKということか? つまり単項の否定演算子ということだ!
C言語を忘れているな。。。

if(!aaa)
 bbb <= ccc;


でも私はVHDLだったからこういう表現はとりあえずない。まだ指が打てないようだ。
まだバグがある。書き込む値が0001にならない。ロータリーエンコーダーを回してインクリメントしたはずなのにインクリメントしないようなので、そっちのモジュールをデバックしないと。。。
  1. 2007年02月01日 06:39 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0