FC2カウンター FPGAの部屋 2009年07月

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

FPGAの部屋

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

小型カメラ(PENTAX Optio E75)を買いました

ずっと持ち運び便利な小型カメラを買おうと思っていた。あきばお~のメールで安いカメラの広告が載っていたので、購入した。値段は9,980円で、これに、4GBのSDカードと送料、代引き手数料を入れて、約12,000円だった。
PENTAX Optio E75と言って、外国仕様らしい。日本語のほかにもいろいろな言語があった。とりあえず、撮影で切れば満足。今までのデジカメは昔の12倍ズーム、300万画素(LUMIX DMC-FZ3)だったので、結構レンズ部分が大きく持ち運びするのにはあまり良くなかった。今度は、小さいので簡単に持ち運びができそう。
今回のカメラは1000万画素だけど、今までの画素数で十分なので、300万画素に設定して使うことにする。連射も付いているようだし機能的には十分だ。詳しいデータはここのサイトが詳しい
Optio_E75_090730.jpg
Optio_E75_2_090730.jpg

さて、次はいよいよ本格的に始動するつもり。。。最初は、気になっているAlteraのSOPC Builderを日昇テクノロジーのチュートリアルを見ながら体験してみようと思う。
  1. 2009年07月31日 05:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋の有用と思われるコンテンツのまとめサイトの更新

FPGAの部屋の有用と思われるコンテンツのまとめサイトを更新しました。
7月30日までの記事をFPGAの部屋の有用と思われるコンテンツのまとめサイトに追加しました。ご利用ください。

#更新するのは結構大変ですが、まとめをしないと自分でも、何を書いたかが分からなくなってしまいます。
  1. 2009年07月30日 04:41 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

動的部分再構成

Xilinx社のFPGAでは、VirtexⅡから動的部分再構成(Dynamic Partial Reconfiguration) が可能となっている。
日経エレクトロニクス 2009.7.27号やわらかくなるLSIの中の70~71ページに書いてあったのだが、いよいよ2010年春から Dynamic Partial Reconfiguration を正式にサポートするとのことだ。
今まで、Dynamic Partial Reconfiguration か 静的なPartial Reconfigurationをやってみたいと思っていたが、やり方を書いた資料が少なかった。これで、チュートリアル等の資料が出てくると思う。ぜひ、何かサンプルを作って試してみたいと思っている。
  1. 2009年07月29日 13:04 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

ハリー・ポッターと謎のプリンスを見てきました

昨日、休暇でお神輿の片付けも午前中で終わったので、午後から奥さんと下の子どもと3人で”ハリー・ポッターと謎のプリンス”を見てきました。
ハリー・ポッターシリーズ第6作目ですが、すべて映画館で見て、ビデオやDVDを買っています。ハリー・ポッターの本も全部持っています。
”ハリー・ポッターと謎のプリンス”はこれから始まるあの人との戦いの序章という感じです。映画の時間制限から原作のストーリーを完璧に再現は出来ないだろうから、これで良いと思います。第7作目は前、後編の2本に分けるそうなので、楽しみです。
  1. 2009年07月28日 19:13 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

CQ出版社のエレクトロニクス・セミナに申し込みをした

CQ出版社のエレクトロニクス・セミナ、”高性能ディジタル回路設計の基礎と最新動向”に申し込みました。8月21日に巣鴨に行ってきます。
特に”高い処理性能や小さな回路規模を達成しなければならなくなったとき,回路をどう組みかえ,HDLでどう書くかを学ぶ”、”多少複雑な処理を作ることが要求されたとき,モジュール分割や回路全体構成(アーキテクチャ設計)をどう進めるかを学ぶ”(ホームページより転載)に興味があります。
現在、低レイテンシ、高スループットが要求される大きな回路(と自分では思っている)を仕事で作っているので、一般的には機能をどのように分割して、どのように機能を検証しているのかに非常に興味があります。
今日CQからのメールが来て、即決でセミナに申し込みしました。今からどんな内容かが楽しみです。
  1. 2009年07月28日 13:10 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

お祭り終了

昨日は、午前中は仕事に行った。仕事の内容は中学生の夏休み自由研究お助け企画で、中学生を相手に、音の実験を担当。この実験は、かなり長くやっている。自分の音声がどんな形をしているかを見たことはあまりないと思うので、これだけでも興味深いかもしれない。特に母音は周期的に繰り返す波形なので、他の人との差を比べやすい。子音はいろいろなのだが音の波形を観察するのが難しい。
リコーダーやフルートなどの笛系は音が正弦波に近い。リコーダーでうまく吹くと正弦波に本当に近くなる。ギターなどの弦楽器は高調波が多い。昆虫の蝉の鳴き声は周波数が高い。
一応、中学生に受けるかな?というイベントを交えながら説明したので、喜んでくれたことと思う。

午後五時からは、またまた、うちの息子は骨折で出られないわけだが、お祭りでお神輿の付き添い。今日も人が結構出ていた。最近は、ステージが作ってあって、ステージ上からお餅やお菓子を撒いたりしている。それをステージの下に群がる人たちが拾うわけだ。今年からは、その舞台で太鼓の演奏も行っている。結構、うまいと思った。
今日は最終日なので、各地区の中学生の御神輿同士で神輿をさして(神輿を高く上げて、前の喧嘩棒を合わせてエールを交換する)いた。(説明が難しい。。。)結構これが楽しいのだ(付き添いの大人も、たぶん中学生も)。何というか集団催眠にかかっているような感じなんだろうか?お神輿を担ぐのは重いし疲れる。でも、他の御神輿がいて、一緒に担いでいるという実感が、何か興奮を呼んで疲れを忘れて、一緒に高揚状態になるじゃないだろうか? 中学生がお神輿を担いでいるのだが、付き添いの大人も結構楽しいのである。でも今日は疲れているけど。。。

昔々、私が中学生のころは大人の付き添いもなかったし、他の地区の中学生の神輿にあったら、喧嘩になっていた。喧嘩とはお神輿同士をぶつけあって、優劣を競っていた。それで、私たちの地区の御神輿は壊れてしまったという苦い思い出がある。その頃は、大人の神輿はお酒を飲んで暴れて、必ずどこかの板塀などを壊していたものだ。おおらかな時代だった。
今ではそんなことはなく、大人の神輿は礼儀正しく、中学生の神輿は大人がついて、喧嘩をしないように注意している。

ともかくお祭りは終了した。今日は午前7時から片づけをすれば終了。(今日は休暇を取ったのでお休みです)
  1. 2009年07月27日 05:33 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

お神輿渡御第1日目

昨日は、お祭り当日でした。午前中は午前6時半から集まって、お神輿の準備をして、出発点の神社にお神輿を持っていきます。小学生、中学生が集まってきて8時にスタートしました。
内もみの始まりです。小学校低学年用と小学校高学年用の2台の御神輿が出ました。中学校2,3年生は各家々をお祓いをして回ります。
下の写真が小学校低学年用の御神輿です。
mikoshi_2_090726.jpg

これが小学校高学年用。
mikoshi_3_090726.jpg

そしてこれが、中学生用の御神輿。
mikoshi_4_090726.jpg

並んでいないので、大きさの違いが良くわからないと思いますが、段々と大きくなって、担ぐ棒も太く重くなります。お神輿の上のクジャクに縛ってあるのは稲穂です。早生の稲をもらってきています。

午前中の渡御(お神輿を担いで歩くことをこう言うそうです)が11時ころ終了し、食堂で食事となりました。食事が終了したら、夜の部の為の準備です。バッテリーをタイヤチューブで固定したり、中学生用の御神輿はボルト締めなので、さらしでボルトの部分を保護したりしました。

夜の部は午後5時半開始です。お神輿を町内の中心部に持って行って、大人の神輿と並べます。そこから、6時半ころ一斉にスタートとなります。
mikoshi_5_090726.jpg

途中でおにぎり2個の夕御飯を取って、午後9時までお神輿の渡御が行われました。疲れました。
今日は、午前中は夏休み自由研究のサポートに出勤で、午後5時からまたお神輿です。ちなみに私が担ぐのではなく、付き添いで歩きます。つまり、子供のお神輿が他の御神輿と衝突したり、見物客と衝突しないように、監視し、抑えるわけです。盛り上がってくると他の地区のお神輿に突っ込んでいく(中学生)ので、行かないように抑えます。
果たして体力は持つのか???
  1. 2009年07月26日 04:56 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

御神輿の準備

昨日は午後7時から午後11時まで、中学校3年生の親たちで、子供たちが担ぐ御神輿の準備をしていました。
御神輿を担ぐ棒に御神輿本体を載せて、ボルト締め。その後、電飾の配線引き回し。中学生用の御神輿は電飾がすごいので、配線もものすごいんです。それをどうやって隠すか?ということに頭を悩ませながらやっていました。
下の写真が配線引き回しの様子です。車用のバッテリーで駆動します。
mikoshi_1_090725.jpg

子供用お神輿は3基ありまして、中学生用のが上のようにすごいですが、小学生低学年、小学生高学年の電飾は大したことはないです。配線量という意味ですけど、ですが、私にはそのシンプルな電飾の方が良く見えます。
今日は午前6時30分からもう少し準備をして、朝から内もみです。これは、町内を練り歩きながら、お祓いをして、各家々からおひねりをもらいます。これがお昼までやって、お昼から夜の御神輿の準備をします。
午後5時30分から午後9時まで夜の本番となります。本当に疲れますね。
明日は、朝早くから仕事で夏休みの自由研究お助け企画があります。それを午前中やってきて、午後からはまたお神輿準備。午後5時30分から午後9時まで夜のお神輿。
月曜日はお神輿の片づけ。それは大体午前中に終わるのですが、午後からは娘の部活のバーベキューの足として使われちゃいます。
本当にハードな3日間です。体を壊さないように気をつけないと。。。もう若くないですからね。

FPGAの方では、とりあえず、FPGAの部屋の有用と思われるコンテンツのまとめサイトをアップデートしたいです。大分アップデートしていなかったので、結構作業量がありそうです。
その後はどうしようかな?Altera のSOPC Builder もやってみたいし、Spartan-6のMBCももう少しやってみたい。Spartan3A Starter Kit のDDR2 SDRAMコントローラでmico32 を動かしてみるのも良いな。今度はVGAコントローラをビットマップで作るのもわくわくしそう。というわけで、決まっていません。
それでもやりたいことがあるのは良いことだと思います。
  1. 2009年07月25日 04:52 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

SignalTapⅡを使ってみる3(VCDファイルを出力して、シミュレーションの波形と比較)

SignalTapⅡを使ってみる2(SignalTapⅡをやってみたがエラーで悩む)”で、SignalTapⅡの波形をキャプチャすることができたので、VCDファイルを出力して、Veritakでシミュレーション波形と比べてみることにした。
Veritakの波形比較機能については、”Veritak 3.68AのChipScopeとシミュレーションの波形比較機能”を参照。

まずはSignalTapⅡからVCDファイルを出力しよう。FileメニューからExport... を選択する。
Quartus2_signaltap2_46_090721.png

Exportダイアログが開く。File name: を設定して、Export format: をValue Change Dump - (*.vcd) にする。SignalTapⅡではClock Period が入力できた。これは40ns に設定する。
Quartus2_signaltap2_47_090721.png

QuartusⅡのダイアログが表示されるのでOKをクリックする。
Quartus2_signaltap2_48_090721.png

CharDispCtrlerTest1.vcd が出力された。
Quartus2_signaltap2_49_090721.png

さてこれで、SignalTapⅡでのVCDファイルの出力は終了したので、Veritak-Basic Version3.71Cでシミュレーションを行う。
Veritakでプロジェクトを作成して、シミュレーションを行う。その際に、AlteraのIPを使用しているので、90sp1/quartus/eda/sim_lib/220model.v と90sp1/quartus/eda/sim_lib/altera_mf.v をプロジェクトに追加した。(たっくさん、教えていただいてありがとうございました)
Quartus2_signaltap2_50_090723.png

本当はVGA_VSYNCが出るところまで、20ms程度シミュレーションしたかったのだが、ディスク容量の関係で無理なので、40us シミュレーションてみた。(下の図、disp_timing_inst のすべての信号をWaveform Viewer 1に入れてある)
Quartus2_signaltap2_51_090723.png

先ほど出力したCharDispCtrlerTest1.vcd をプロジェクトに入れて、プロジェクトを再ロードし、シミュレーションを行う。
Quartus2_signaltap2_52_090723.png

Scope Tree ViewウインドウからVCDファイルのdisp_timing_inst を選択した状態で、右クリックして、”信号をWaveform Viewerに追加する”から”波形比較用の信号をこの階層以下から自動選択し追加する”を選択する。
Quartus2_signaltap2_53_090723.png

シミュレーション波形の下にSignalTapⅡの該当するVCD波形(水色の波形)が挿入される。
Quartus2_signaltap2_54_090723.png

ユーティリティメニューから”VCD波形のスタート時刻を変更する”を選択し、VCD Timestart Shift Dialog を表示する。これでシミュレーション波形の位置とVCDファイルの波形の位置を合わせてみた。
Quartus2_signaltap2_55_090723.png

AlteraのVCDファイルはバスの信号のビットの並びが逆順になっているようだ。よってバスは比較が難しいが、1ビットの信号同士は比較ができた。


2009/07/24 追記
Veritakの作者のたっくさんに、Veritakを使いやすいように修正していただきました。Veritakのバージョンは3.72Aです。このVeritak Version 3.72Aを使用してもう一度書いてみます。

SignalTapⅡのVCDファイルの信号のうちh_point[0:10] を左クリックし選択し、その上で右クリックして、右クリックメニューから”グループ化”-”選択した信号のビットを逆順にする”を選択する。
Quartus2_signaltap2_56_090723.png

すると、h_point[10:0]に変わって、赤い部分(違っている部分)がなくなった。同様にv_pointも同様の操作を行った。
Quartus2_signaltap2_57_090723.png

v_pointが赤くなっているのは、SignalTapⅡのキャプチャした波形が最初のh_sync_pulse とは限らないからだ。SignalTapⅡのトリガ条件にv_pointがオール0という条件を加えて波形をキャプチャすればv_pointの値も合うものと思われる。

そういえば、以前Spartan3 Stater Kit での”キャラクタ・ディスプレイ・コントローラのシミュレーション”よりも大幅にシミュレーション時間が延びて、使用するディスク容量が増えた。これは、たっくさんの回答によると、
”PLL(DCM)が入ると浮動小数演算と時間分解能の関係で、どのシミュレータも、遅くなります。特にVeritakの波形圧縮方法だとメモリも食います。この点は、Xilinxも同じことが言えます。(Alteraの方がより食うのかもしれませんが比較したことはありません)”
とのことだった。
そういえば、Spartan3 Stater Kit での”キャラクタ・ディスプレイ・コントローラのシミュレーション”はDCMを使用していない。
  1. 2009年07月23日 05:09 |
  2. SignalTapⅡ
  3. | トラックバック:0
  4. | コメント:2

大学説明会に東京に行ってきました

昨日は高2の娘の付き添いで、東京で行われた東北大学の大学説明会に行ってきました。
例によって、研究学園の駐車場に車を置いて、TXで秋葉原まで。秋葉原から新宿線の岩本町駅まで歩いて行きました。私、岩本町駅まで歩いたことがありません。そこで活躍したのがiPhoneのGoogleマップ、GPS、コンパス機能、今までの携帯はGPSは付いていたのですが、明るいところでは液晶画面が見えなかったです。iPhoneは明るいところでもコントラストは十分です。それに、以前は自分がどこに向かっているかという方向を見失うことが多かったのですが、iPhoneには地図に連動したコンパス機能が搭載されているので、自分が向かっている方向が分かります。とても便利でした。

途中のドトールコーヒーで昼食にしました。私はミラノサンドAを食べましたが、おいしかったです。ドリンクはアイス抹茶ラテを注文。これもおいしかったです。ドトールコーヒーに入るのは、初めてでしたが、これからひいきにしたいと思います。
さて、昼食後に岩本町駅から神保町まで地下鉄で行きました。降りてから、学術総合センターまでiPhoneがまた活躍しました。といっても、道なりなので、使いたがりなんですけど。。。

大学説明会では最初に理学部の説明を聞きました。会場では付き添いのお父さん、お母さんも多かったです。40分間のプレゼンでしたが熱心に話を聞いていました。プレゼンターは化学科の先生でした。物理学科のうちの天文専攻はやはり狭き門らしいです。

次に聴講する工学部の説明まで、1時間程度時間が空いたので、娘と一緒に神保町の本屋街に行ってきました。懐かしいです。大学のころ本屋街に良く行きました。秋葉原も近いし。。。社会人になってからはスキー用品を買いに通いました。その頃はスキー用品店がたくさんありました。ICI、石井スポーツは変わらない感じで残っていました。街をぶらぶらしながら、昔よく入った書泉グランデで文庫本を購入しました。

戻って、今度は工学部のプレゼンを聞きました。今度も、親御さんも結構入っています。東北大学の工学部はかなり学科が大きいようです。娘の希望する学科(もし東北大学に入れる?入る?とすればですが)は、情報知能機能システム総合学科です。他の大学の3つくらいの学科が一緒になっている感じでした。大学院に行くといろんな専攻に分かれるようです。どの方向に行くのかを大学に入ってから決める必要があるようですね。どの方向に行くのかが決まっていない学生さんはいろいろな方面をたくさん勉強する必要があるんでしょう?大変でしょうが、いろいろな知識が身につくかもしれません。娘の行きたいのは情報なので、専攻とすればコンピュータサイエンスコースとなるようです。
情報知能機能システム総合学科のパンフレットをもらおうと思ったのですが、まだ出来上がっていないので、後日郵送で送っていただけることになりました。親切に対応していただいた(たぶん)先生、ありがとうございました。

大学説明会終了後は秋葉原に戻って、ヨドバシに行ってきました。相変わらずの人込みですね。娘はペンタブが欲しい様子。パソコンでイラストを描いているようです。今までのペンタブは小さいので書きにくいとのことでした。やはり大きいペンタブは書きやすそうです。アマゾンの方が安いとのことでとりあえず買わないで帰ってきましたが、書き心地は試せたようです。
その後、TXに乗ってつくばに帰ってきました。
  1. 2009年07月21日 05:23 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

SignalTapⅡを使ってみる2(SignalTapⅡをやってみたがエラーで悩む)

前回、”SignalTapⅡを使ってみる1(TalkBack機能をONにしてSignalTapⅡを起動)”でSignalTapⅡは起動できた。
さてこれから、観測信号を追加して観測する。
Tutorial for Quartus’ SignalTap II Logic Analyzer”を参考にしながら、SignalTapⅡを設定していった。(実際には左の真ん中のSetupタブの白い部分でダブルクリックするとNode Finderが起動するので、そこで観測する信号を選らんだ。後は右の真ん中でクロックを設定した)
一応設定が終了して、Run Analysis アイコンをクリックしてコンパイルした。
Quartus2_signaltap2_34_090718.png

そうすると、一旦QuartusⅡに戻ってコンパイルするが、エラー発生。どうもライセンスがないのに、incremental compilation しているということらしい。
Quartus2_signaltap2_35_090718.png

どうも、incremental compilation しているつもりはないのだが。。。
いろいろ検索してみて、良くわからなかったのだが、”Error: SignalTap and incremental compilation”を見つけた。
それによると、CharDispCtrlerTest.qsf に

set_global_assignment -name INCREMENTAL_COMPILATION OFF


を追加すると、incremental compilation をしなくなるらしい。追加してQuartusⅡでコンパイルすると、今度はその部分はコンパイルが通ったが、今度はメモリを使いすぎたようだ。
Quartus2_signaltap2_36_090718.png

SignalTapⅡに入れる信号を減らすことにした。上から3つの信号を削除して、もう一度QuartusⅡでコンパイルするとコンパイルが通った。
Quartus2_signaltap2_37_090718.png

SignalTapⅡでトリガーを設定した。トリガーは一番下のv_sync_node が1の時とした。
Quartus2_signaltap2_39_090720.png

これで、一番前の図で行ったRun Analysis アイコンをクリックするがなにも反応しない。どうもコンフィギュレーションされていないようだった。それではということで、QuartusⅡに戻ってProgrammer を起動して、コンフィギュレーションした。
Quartus2_signaltap2_40_090720.png

その後、もう一度、Run Analysis アイコンをクリックすると信号のキャプチャが行われて、信号が表示された。
Quartus2_signaltap2_41_090720.png

h_sync_pulse でトリガするとこんな感じの波形になる。
Quartus2_signaltap2_42_090720.png

これでやっと波形をキャプチャすることができた。結構ハードルがあった気がする。ネットでもSignalTapⅡで検索しても、あまり情報は出てこなかったし、おまじないをする必要があるし、皆さん、あまりSignalTapⅡを使っていないのだろうか?
やはり、QuartusⅡのWeb Edition だと、インクリメンタル・コンパイルに対応していないので、.qsfファイルに”set_global_assignment -name INCREMENTAL_COMPILATION OFF”を書く必要があるのが面倒だ。。。


追記: SignalTapⅡからコンフィギュレーション
くりさんに教えていただいたSignalTapⅡからのコンフィギュレーション方法をやってみた。

右上のSOF Managerのところの... ボタンをクリックする。
Quartus2_signaltap2_43_090721.png

Select Programming File ダイアログが開く。CharDispCtrlerTest.sof を選択し、”開く”ボタンをクリックする。
Quartus2_signaltap2_44_090721.png

これで... ボタンの右の四角にCharDispCtrlerTest.sof が入ったので、Program Device アイコンをクリックして、FPGAにダウンロードする。
Quartus2_signaltap2_45_090721.png

これでFPGAにコンフィグデータがダウンロードされ、SignalTapⅡで波形をキャプチャできる準備が整った。
  1. 2009年07月20日 04:22 |
  2. SignalTapⅡ
  3. | トラックバック:0
  4. | コメント:2

SignalTapⅡを使ってみる1(TalkBack機能をONにしてSignalTapⅡを起動)

"QuartusⅡでSignalTapⅡを試してみるまでの準備7(実際に動作させてみた)”で、キャラクタ・ディスプレイ・コントローラが動作したので、いよいよSignalTapⅡを試してみることにした。
QuartusⅡのToolsメニューからSignalTap ⅡLoginc Analyzer を選択する。
Quartus2_signaltap2_28_090716.png

SignalTapⅡが立ち上がると思ったが、エラーのダイアログが出た。
Quartus2_signaltap2_29_090718.png

TalkBackをONにしないとSignalTapⅡは起動できないようだ。TalkBackは似たようなのがXilinxにもあるが、どんなプロジェクトをコンパイルしたかというのを統計を取るのが目的のようだ。
TalkBackをONにしてみる。
ToolsメニューからOptions... を選択する。
Quartus2_signaltap2_30_090718.png

Options ダイアログが表示される。General の下のInternat Connectivity を選択する。右側にTalkBack Options... ボタンがあるので、それをクリックする。
Quartus2_signaltap2_31_090718.png

TalkBack Options ダイアログが開く。
Enable タグでTurn on the QuartusⅡ software TalkBack feature にチェックを入れてOKボタンをクリックする。
Quartus2_signaltap2_32_090718.png

Options ダイアログに戻るので、OKボタンをクリックする。これでTalkBackをONに出来たので、もう一度、SignalTapⅡを起動してみよう。
一度、QuartusⅡを閉じて、もう一度起動する。その後、QuartusⅡのToolsメニューからSignalTap ⅡLoginc Analyzer を選択する。
今度はSignalTapⅡが起動した。
Quartus2_signaltap2_33_090718.png

TalkBackをONにしても、QuartusⅡを再起動しないと、SignalTapⅡは起動しなかった。これでSignalTapⅡを使うことができる。
  1. 2009年07月18日 21:06 |
  2. SignalTapⅡ
  3. | トラックバック:0
  4. | コメント:0

QuartusⅡでSignalTapⅡを試してみるまでの準備7(実際に動作させてみた)

QuartusⅡでSignalTapⅡを試してみるまでの準備6(入力、出力ピンの制約とタイミング制約2)”でQuartusⅡでのコンパイルが終了した。
次に、実際に日昇テクノロジーのボードを接続して、QuartusⅡのProgrammer でコンフィギュレーションした。
Quartus2_signaltap2_27_090716.png

スタートボタンをクリックしてコンフィギュレーションを開始した。
下が日昇テクノロジーのボード。
char_disp_ctrl_1_090718.jpg

コンフィグ後、一発で表示ができた。うれしい。。。
char_disp_ctrl_2_090718.jpg

これでSignalTapⅡを使うための準備は終了。次はSignalTapⅡを使って波形を観察してみたい。
  1. 2009年07月18日 05:17 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:0

QuartusⅡでSignalTapⅡを試してみるまでの準備6(入力、出力ピンの制約とタイミング制約2)

QuartusⅡでSignalTapⅡを試してみるまでの準備5(入力、出力ピンの制約とタイミング制約)”でTimeQuest をいじってみたが、もう少しいじってみた。

まずは、前回の続き。前回は、LocateダイアログでChip Plannerを選択したが、今度はTechnology Map Viewer を選択してみた。そうしたら、QuartusⅡ本体にTechnology Map Viewer が立ち上がり、HDLの階層構造が見え、実際のインスタンス同士の配線が見えた。
Quartus2_signaltap2_20_090716.png

さて、TimeQuest でタイミング制約を付加する方法はどうやるかなのだが、多分、Constraintsメニューから制約するんだと思う?Set Output Delay... を選択してみる。
Quartus2_signaltap2_21_090716.png

Set Output Delay ダイアログが開く。Clock name にPLLで生成された25MHzクロックを選択して、Delay value は適当に6ns くらいにする。Targets にVGAの信号を全部選択して、Run ボタンをクリックした。
Quartus2_signaltap2_22_090716.png

そうしたら、TimeQuest の背景や文字が黄色になっちゃいました。
Quartus2_signaltap2_23_090716.png

これどうするんだろう。そうかもう一度、QuartusⅡでコンパイルする必要があるな?その前にTimeQuestのConstraintsメニューからWrite SDC... をしないと、SDCファイルに制約が書き込まれていないようだ。(TimeQuest を終了するときにセーブするためのダイアログが出ました)
SDCファイルは下のように変更された。

## Generated SDC file "CharDispCtrlerTest.sdc"

## Copyright (C) 1991-2009 Altera Corporation
## Your use of Altera Corporation's design tools, logic functions 
## and other software and tools, and its AMPP partner logic 
## functions, and any output files from any of the foregoing 
## (including device programming or simulation files), and any 
## associated documentation or information are expressly subject 
## to the terms and conditions of the Altera Program License 
## Subscription Agreement, Altera MegaCore Function License 
## Agreement, or other applicable license agreement, including, 
## without limitation, that your use is for the sole purpose of 
## programming logic devices manufactured by Altera and sold by 
## Altera or its authorized distributors.  Please refer to the 
## applicable agreement for further details.


## VENDOR  "Altera"
## PROGRAM "Quartus II"
## VERSION "Version 9.0 Build 184 04/29/2009 Service Pack 1 SJ Web Edition"

## DATE    "Fri Jul 17 05:09:50 2009"

##
## DEVICE  "EP2C5Q208C8"
##


#**************************************************************
# Time Information
#**************************************************************

set_time_format -unit ns -decimal_places 3



#**************************************************************
# Create Clock
#**************************************************************

create_clock -name {clk} -period 20.000 -waveform { 0.000 10.000 } [get_ports {clk}]


#**************************************************************
# Create Generated Clock
#**************************************************************

derive_pll_clocks -use_tan_name


#**************************************************************
# Set Clock Latency
#**************************************************************



#**************************************************************
# Set Clock Uncertainty
#**************************************************************



#**************************************************************
# Set Input Delay
#**************************************************************



#**************************************************************
# Set Output Delay
#**************************************************************

set_output_delay -add_delay  -clock [get_clocks {pll_module:pll_module_inst|altpll:altpll_component|_clk0}]  6.000 [get_ports {VGA_BLUE}]
set_output_delay -add_delay  -clock [get_clocks {pll_module:pll_module_inst|altpll:altpll_component|_clk0}]  6.000 [get_ports {VGA_GREEN}]
set_output_delay -add_delay  -clock [get_clocks {pll_module:pll_module_inst|altpll:altpll_component|_clk0}]  6.000 [get_ports {VGA_HSYNC}]
set_output_delay -add_delay  -clock [get_clocks {pll_module:pll_module_inst|altpll:altpll_component|_clk0}]  6.000 [get_ports {VGA_RED}]
set_output_delay -add_delay  -clock [get_clocks {pll_module:pll_module_inst|altpll:altpll_component|_clk0}]  6.000 [get_ports {VGA_VSYNC}]


#**************************************************************
# Set Clock Groups
#**************************************************************



#**************************************************************
# Set False Path
#**************************************************************



#**************************************************************
# Set Multicycle Path
#**************************************************************



#**************************************************************
# Set Maximum Delay
#**************************************************************



#**************************************************************
# Set Minimum Delay
#**************************************************************



#**************************************************************
# Set Input Transition
#**************************************************************



QuartusⅡでコンパイルしたら、Fitterでエラーになってしまった。どうやら、このclkピンではPLLはつなげないと言っているような???どうして?
Quartus2_signaltap2_24_090716.png

Pin Planner で見てみると、clkの番号が違っていた。PIN_23に接続のところがPIN_32になってしまった。失敗。早速修正。
Quartus2_signaltap2_25_090716.png

これでもう一度コンパイル。今度は成功。Timing Analyzer からみたtco も6nsの制約をみたした。
Quartus2_signaltap2_26_090716.png

(2009/09/03 追記)
この状態ではTimeQuestのタイミング制約が使われていませんでした。SettingsダイアログでTimeQuestを使うように変更しないとだめでした。詳しくは、”SOPC Builderを使ってみる3(IOピンやタイミング制約を加えてテスト)”をご覧ください。
  1. 2009年07月17日 05:35 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:0

QuartusⅡでSignalTapⅡを試してみるまでの準備5(入力、出力ピンの制約とタイミング制約)

QuartusⅡでSignalTapⅡを試してみるまでの準備4(MWPIMでキャラクタ・ジェネレータROMを生成)”でエラーなくコンパイルすることができた。今回はまだ制約を書いていなかったので、入力、出力ピンの制約とタイミング制約を書いてみることにする。

まずは、QuartusⅡからPin Plannerを起動する。AssignmentsメニューからPins...を選択する。
Quartus2_signaltap2_9_090716.png

Pin Plannerが起動。それぞれの入力、出力ピンの位置を制約する。
Quartus2_signaltap2_10_090716.png

これで、入力、出力ピンの制約はOK。
次にタイミング制約を作る。TimingQuestは使ったことがないので、@ITの”必修! FPGAタイミング解析の基礎(5) TimeQuestによるタイミング解析を学ぶ”でお勉強。これに沿ってやってみることにした。
QuartusⅡのToolsメニューからTimeQuest Timing Analyzer を選択する。
Quartus2_signaltap2_11_090716.png

TimeQuest が起動する。
Quartus2_signaltap2_12_090716.png

”TimeQuestによるタイミング解析を学ぶ”に従って、左のTaskペインのMacros の下のReport All Summaries をダブルクリックすると、タイミング解析が始まる。
Quartus2_signaltap2_13_090716.png

上の図がその結果を表示している。たぶんPLLの設定が読み込まれて、入力周波数50MHzに対して、PLLの出力が25MHzになっていて、タイミング違反もないことが表示されている。

まずは、PLLの出力クロックを右クリックしてみると、Report Timing... があるので、これを選択してみた。
Quartus2_signaltap2_14_090716.png

Report Timingダイアログが開く。右下のReport Timingボタンをクリックする。
Quartus2_signaltap2_15_090716.png

Timing Reportが出てくる。右のペインのSummary of Pathsの一番上のエントリをクリックすると、左下にData Arrival Pathが表示される。2番目0.292が出力FFへのクロックスキューかな?データの遅延はトータルで8.916nsだそうだ。下のペインにData Required Pathが表示される。40nsが制約で、0.257nsがクロックのスキュー、セットアップが-0.046nsということは、クロックの方が遅れるのかな?右側にクロックと遅延の関係が図示されていて、良くわかる。この辺のインターフェースはXilinxよりいいかな? でも、Data Arrival Pathに表示されるアイテムはロジックセルなどの番号だけ見たいで、意味のある名前は付いていないようだ。
Quartus2_signaltap2_16_090716.png

Data Arrival PathペインでCELLを選択して、右クリックし、Locate Path... を選択する。
Quartus2_signaltap2_17_090716.png

LocateダイアログでChip Plannerを選択する。(この辺は、ほとんど、@ITの”必修! FPGAタイミング解析の基礎(5) TimeQuestによるタイミング解析を学ぶ”のパクリだが、自分のプロジェクトの結果を示したいのと、中を抜いてしまうと、あと見たときに分からないので、そのまま書いておく)
Quartus2_signaltap2_18_090716.png

Chip Plannerが立ち上がって、グラフィカルに配線が見える。Xilinxで言うとFlooorplannerのようなものなのだろう。配線遅延も見ることができる。
Quartus2_signaltap2_19_090716.png

QuartusⅡもなかなか良かった。特にTimeQuestは良いと思った。
  1. 2009年07月16日 06:03 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:0

Air SharingでPDFやExcel, Word, PDFなどを表示

どうしてもiPhoneでPDFやWord, Excelなどの書類を見たくて、どうしたらよいかいろいろ調べてみた。
Air Sharingという無線LANで共有フォルダを作れるソフトウェアを600円で購入した。以前は無料だったようだが、現在は600円だった。残念。
私のパソコンはWindows XPなので、”Web フォルダのソフトウェア更新プログラム: KB907306”を適用した。
それでもiPhoneが欲しい?”さんの”(追記2)WindowsXPに設定”を参考に設定したら、すんなり共有フォルダができた。
Air_Sharing_1_090715.png

iPhoneのPDFマニュアルを表示してみました。
Air_Sharing_2_090715.jpg

写真にモアレが出て見ずらいですがご勘弁を。
拡大するとこれくらいになります。
Air_Sharing_3_090715.jpg

老眼としては、もう少し拡大できるといいのですが、拡大できてもこれ以上は指を離すと、この解像度に戻ってしまいます。
Excelは絵が少しずれることもあるようですが、普通は大丈夫そうです。Wordも見れるし、便利ですね。文章を持ち歩けて、見たい時に見れるので便利です。
iPhone気に入りました。小さいパソコンに電話がおまけで付いている印象です。やはり無線LANにつながっている方が圧倒的にダウンロードが速いです。3Gでつながっていると地図のダウンロードでも遅いです。なるべく無線LANに登録して使うべきツールですね。
  1. 2009年07月15日 05:39 |
  2. iPhone
  3. | トラックバック:0
  4. | コメント:0

QuartusⅡでSignalTapⅡを試してみるまでの準備4(MWPIMでキャラクタ・ジェネレータROMを生成)

しかし、なふたふさんのJTAG本を申し込むのを忘れたのはショックだった。申し込み15分前にアラームを鳴らして、申し込みFAXも用意していたのだが、用事があってその後忘れてしまった。お金を払っても買いたい本だった。。。

QuartusⅡでSignalTapⅡを試してみるまでの準備3(キャラジェネROMデータをMIFに変換)”の続き。
前回でMIFファイルが出来たと思ったので、MegaWizard Plug-In Managerで1-PROTのROMを生成して、ROMパターンファイルとして、この前のMIFファイルを指定する。
MegaWizard Plug-In Managerで生成するROMの名前は、char_gen_patternとした。下の図はchar_gen_patternに、char_gen_pattern.MIFを関連づけているところ。相変わらずQuartusⅡの説明は手抜き。
Quartus2_signaltap2_6_090714.png

これでchar_gen_rom.v にchar_gen_patternをインスタンシエーションしたので、これでQuartusⅡのプロジェクトは完成。早速、コンパイルしてみることにした。
コンパイル・アイコンをクリックしてコンパイル。しかし、エラー発生。。。
エラーはMIFファイルのフォーマットがおかしいとのことだった。
Quartus2_signaltap2_7_090714.png

MIFファイルを見てみると、失敗。。。0000 : 00の後に;が付いていない!!!
正しくは 0000 : 00; のはず。。。"Memory Initialization File (.mif) Definition"参照。
Rubyのプログラムにバグがあった。修正したプログラムを下に示す。(ただ単に\n の前に;を入れただけ)

# XilinxのBRAMプリミティブのint値をMIFファイルに変換する

require 'scanf'

def usage
  STDERR.print "usage : #$0 [input BRAM Verilog file name] [output MIF file name] \n"
  exit 1
end

if ARGV.size < 2
  usage
else
    file = File.open(ARGV[0], 'r') # BRAM VerilogファイルをReadモードでオープン
    filew = File.open(ARGV[1], 'w') # MIFファイルをWriteモードでオープン
    
    # ヘッダ
    filew.print ("DEPTH = 2048;\n")
    filew.print ("WIDTH = 8;\n")
    filew.print ("ADDRESS_RADIX = HEX;\n")
    filew.print ("DATA_RADIX = HEX;\n")
    filew.print ("CONTENT\n")
    filew.print ("BEGIN\n")
    filew.print ("\n")
    
    address = 0;
    while line = file.gets # 1line読み込み
        i=31;
        while i>=0
            line_port = line
            filew.printf ("%0.4X : ", address)
            filew.print (line_port.slice!(i*2,2))
            filew.print (";\n")
            i -= 1
            address += 1
        end
    end
    filew.print("\n")
    filew.print("END;\n")
    
    file.close
    filew.close
end


これで、MIFファイルを作り直して、もう一度コンパイル。
そしたら、コンパイルが成功した!!!良かった。
Quartus2_signaltap2_8_090714.png

  1. 2009年07月14日 06:03 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:0

ChipScopeを入れたらERROR:Pack:311 - Unable to resolve the conflicts... のエラー発生

ISE10.1iSP3にChipScopeのIPを入れたら、”ERROR:Pack:311 - Unable to resolve the conflicts between two or more collections of symbols which have restrictive placement or routing requirements.”のエラーが発生。
その下のログを見るとどうやら、ChipScopeのロジックでエラーが発生しているようだ。
ChipScope_Error_090713.png

早速ネットで調べてみると、Xilinx User Community Forums の Errors when using Chipscope がヒットした。
それによると、ISE11.1では、

1.MAPのプロパティでUse RLOC Constraintsのチェックを外す。
2.Projectメニューから Cleanup Project Files を行う。


ChipScope_Error_2_090713.png

で解消されるとのことだった。
早速やってみると、MAPもPlace & Routeも問題なく通った。良かった。。。
  1. 2009年07月13日 09:49 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:0

iPhone 3GSを買いました

昨日、iPhone 3GSを買いました。
いやー、設定が難しいですね。まだMMSのメールが送れません。Webはパソコンと同様に見えます。まだ音声認識は試していません。というか、やっと電話帳が戻りました。電話帳もショップで入れ替えてもらうのではなく、ショップでサーバーにアップロードして、自分で電話帳入れ替えのアプリを落として、入れ替えるのですね。結構じいさんには負担が大きいです。おまけに老眼で目が疲れますね。
でも、そのうちに良さが分かってくるかもです。楽しみに使い続けたいと思います。
iPhone3GS_090713.jpg

やっと、MMSメールが送れました。
しかし、Googleマップのスクロールは驚くほど速いです。GPSもついているし、買ってよかったです。しかし、家の中だったからかもしれませんが、GPSの精度がだいぶいまいちのような?外でやれば違うのかな?
外でGPSを使ったら完璧でした。このGoogleマップとの連帯はすごいですね。道に迷うことなくなりそうです。外でも液晶がきちんと見えるし、(前のは外では全く見えません)これだけでも買った価値が十分にありました。
しばらくこのおもちゃに夢中かも?です。
  1. 2009年07月13日 06:02 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

小・中学生の御神輿準備

今日は、朝から小中学生の御神輿の準備で、忙しかったです。朝9時から御神輿用倉庫というか、愛宕山神社という神主さんがいない地元の小さな神社に小・中学生の御神輿がしまってあるので、それを公民館まで運搬しました。
その後は、御神輿の寄付集めの手配。地元の祇園祭は基本的に地域の家々の寄付で費用が賄われます。私は中学3年生の親なので、中心となって世話をしなくてはなりません。中学生に家々を回って寄付を集めるように指導します。
お祭りをするには、いろいろな準備が必要です。例えば、御神輿を仰ぐ大きなうちわを薄いベニヤに絵を書いて、棒を付けて作ります。このべニアを切るのに、家具作りの経験が生きました。丸のこでベニヤを切って、棒を切り、トリミングして木ねじで留めます。
トリミングするためにと言って、トリマーを買ってしまいました。前から欲しかったので、良いチャンスでした。
本体が6,980円で、6種類のビットのセットが2,580円でした。約1万円ですね。
トリミングは振動が凄いです。あまりやると手が痺れます。これをやりすぎる白蝋病になってしまうんでしょうね? でも、きれいに角が丸くなりました。

  1. 2009年07月12日 16:52 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-6のMemory Controller Block(MCB) を試してみた

Alteraの方もやりたいが、Spartan-6のMemory Controller Block(MCB) のユーザーズガイド、Spartan-6 FPGA Memory Controller User Guideを見つけたので、やってみたくなった。
15ページからのGetting Started で、CORE Generator (CORE Gen) からMIGを使用してMCBを使うやり方が書いてあったのでやってみることにした。
Memory Controller Block(MCB) のユーザーズガイドに沿ってやってみた。
下の図はMCB_testというCORE Genのプロジェクトを作ったところ。
MCB_test_1_090711.png

ユーザーズガイドではMIG3.0だが、ISE11.2のCORE GenではMIG3.1になっている。これを開いてMCBのIPを生成して行こう。DDR2-800 のMCBを生成する。選択したSparatan-6はxc6slx16-2cs324で、ユーザーズガイドの通りとした。このxc6slx16-2cs324には、MCBが2つ入っていて、そのうちのBANK3のMCBを選択して、DDR2 SDRAMの設定をした。
MCB_test_2_090711.png

ユーザーズガイドの24ページはCustom Part を作れとあるが、最初やってみたら、DDR2 SDRAMのモデルが生成されなかったので、ここはディフォルトのマイクロンのDDR2 SDRAMを使うことにしてMCBを生成してみることにする。
MCB_test_3_090711.png

ユーザーズガイドの通りにステップを進めていき、Port Configuration for MEMC 3 はこんな感じ。
MCB_test_4_090711.png

Summary Pageは下。
MCB_test_5_090711.png

mig_31のIPが生成できました。
MCB_test_6_090711.png

プロジェクト名 (MCB_test) \mig_31の下に、example_design と user_design フォルダが生成されている。そのうちのexample_design\parを開いて、create_ise.batをダブルクリックする。
MCB_test_7_090711.png

ISEのプロジェクト (test.xise, test_ise) が生成される。
MCB_test_8_090711.png

このプロジェクトをISE11.2のProject Navigator から読みこんでインプリメントしてみた。タイミング制約を見たしてインプリメントすることができた。
MCB_test_9_090711.png

DDR2 SDRAMのDQが4ビットでDDR2-800なのだから、コントローラのRead/Writeポート幅が32ビットだとすると、動作周波数は100MHzとなるはず。
次にFPGA Editorで内部構造を見てみた。
MCB_test_10_090711.png

FPGA全体に配線が回っている。赤くハイライトしたのがMCB、右側のMCBは使用されていない。
  1. 2009年07月11日 06:23 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:0

Veritak(Basic)Ver. 3.71CでVHDLファイルの変更点を表示

VHDLのプロジェクトをVHDLファイルを修正している際に、修正前と修正後でシミュレーションの波形にどんな違いがあるかを知りたいと思っている。それはModelSim単体でも出来るが、Veritak(Basic)Ver. 3.71を使うともっと分かりやすく表示することができる。
まずは、キャラクタ・ディスプレイ・コントローラのこのブログでは非公開のVHDL版をModelSimでシミュレーションしてみる。ModelSimを立ち上げ、すべてのファイルをコンパイルする。それの状態が下の図。
VHDL_VHDL_comp_1_090709.png

SimulateメニューからStart Simulation...でシミュレーションをスタートする。いつものダイアログが出る。この辺の詳しいやり方は”DDR SDRAMコントローラのシミュレーション2(シミュレーションスクリプト)”を参照のこと。ちなみにResolutionはpsとした。
VHDL_VHDL_comp_2_090709.png

これからVCDのコマンドでModelSimにVCDファイルを生成させる。”ModelSimでVHDLのプロジェクトからVCDファイルを出力する方法(覚書)”を参照。
今回はVSYNCが1個出力されるまでシミュレーション (20ms) する予定なので、全体のVCDファイルを作成すると500MBを超えてしまう。従って、disp_timing.vhdのVCDファイルを作成して比較することにする。
一番下のtranscriptウインドウにvcdのファイル名を指定するコマンドを書く。

vcd file disp_timing1.vcd


VHDL_VHDL_comp_3_090709.png

続いて、vcdのコマンドを投入する。

vcd add -r /chardispctrlertest_tb/uut/chardispctrler_inst/disp_timing_inst/*
run -all
quit -f


quit -f を実行するとModelSimが終了する。その前の状態が下の図。
VHDL_VHDL_comp_4_090709.png

これで、disp_timing1.vcd という28.1MBのVCDファイルができた。ちなみにrun -all して、20msでシミュレーションが停止するのは、そのようにテストベンチが書いてあるからだ。下参照。

    process begin
        reset <= '1';
        
        wait for 100 ns;
        reset <= '0';
        
        wait for 20 ms;
        assert (false) report "Simulation End!" severity failure;
    end process;


次に、少しdisp_timing.vhd を変更して、VCDファイルを出力してみる。disp_timing.vhdは水平同期信号や垂直同期信号、表示のタイミングなどを出力している。表示タイミングの定義はdisp_timing_pack.vhd のconstantで定義されている。下がそのVHDLファイルの内容。

-- 表示タイミングの定義

library ieee;
use ieee.std_logic_1164.all;

package disp_timing_pack is
    constant H_ACTIVE_VIDEO : integer := 640;
    constant H_FRONT_PORCH : integer := 16;
    constant H_SYNC_PULSE : integer := 96;
    constant H_BACK_PORCH : integer := 48;
    constant H_SUM : integer := H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

    constant V_ACTIVE_VIDEO : integer := 480;
    constant V_FRONT_PORCH : integer := 11;
    constant V_SYNC_PULSE : integer := 2;
    constant V_BACK_PORCH : integer := 31;
    constant V_SUM : integer := V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    constant H_DISPLAY_SIZE : integer := H_ACTIVE_VIDEO/8; -- 横80桁
    constant V_DISPLAY_SIZE : integer := V_ACTIVE_VIDEO/8; -- 縦60行
    
    constant RED_DOT_POS : integer := 9; -- 9ビット目がRED
    constant GREEN_DOT_POS : integer := 8; -- 8ビット目がGREEN
    constant BLUE_DOT_POS : integer := 7; -- 7ビット目がBLUE
end disp_timing_pack;


これらの中のV_SYNC_PULSE(垂直同期信号幅)を2から3に変更する。

--    constant V_SYNC_PULSE : integer := 2;
    constant V_SYNC_PULSE : integer := 3;


もう一度ModelSimを起動して、コンパイルを行ってから、同様にdisp_timing2.vcd を作成する。

これで2つのdisp_timingのVCDファイルがそろったので、Veritakを立ち上げてVCDファイルを比較してみよう。
Verilogプロジェクトメニューから新しいプロジェクトの作成を選択する。Veritakの使い方は、”Veritakでのシミュレーション方法1(SuzakuV DDR2 SDRAMテスト回路を使用)”、”Veritakでのシミュレーション方法2(SuzakuV DDR2 SDRAMテスト回路を使用)”、”Veritakでのシミュレーション方法3(SuzakuV DDR2 SDRAMテスト回路を使用)”を参照のこと。

Veritak(Basic)Ver. 3.71Cを起動して、disp_timing_comp.vtakprj という名前のプロジェクトを作成する。そのプロジェクトにdisp_timing1.vcdとdisp_timing2.vcdを追加する。
VHDL_VHDL_comp_5_090709.png

これで、Save Projectボタンをクリックして、プロジェクトをセーブする。Exitボタンをクリックしてダイアログを消す。
VeritakプロジェクトからLoad Verilogプロジェクトを選択して、disp_timing_comp.vtakprj プロジェクトをロードする。
Scope Tree Viewerを前面にのアイコンをクリックして、Scope Tree Viewer とWaveform Viewer を表示する。
VHDL_VHDL_comp_6_090709.png

Scope Tree Viewの最初の項目を展開してdisp_timing_inst をクリックする。VCD Structure に信号名が表示される。その信号をすべて選択して右クリックする。すると、右クリックメニューが表示されるので、そこから”選択されたVCD信号をバス化して追加”を選択する。
VHDL_VHDL_comp_7_090709.png

すると、Waveform Viewer にバス化された信号が挿入される。
VHDL_VHDL_comp_8_090709.png

次にもう1つのタイミングを変更したdisp_timingの信号を間に挿入しよう。
Scope Tree View の下のdisp_timing_instを選択して、右クリックする。右クリックメニューの中から”信号をWaveform Viewerに追加する”を選択し、サブのメニューから”波形比較用の信号をこの階層以下から自動選択し追加する”を選択する。
VHDL_VHDL_comp_9_090709.png

Waveform Viewer を見ると、同じ信号名が2つずつ入った。次にユーティリティメニューから”VCD波形の表示スタート時刻を変更する”を選択する。
VHDL_VHDL_comp_10_090709.png

VCD Timestart Shift Dialog が開く。Check by Read Marker のチェックボックスをチェックする。さらに、Waveform Viewer の一番左はじのアイコンをクリックし、波形全体を表示する。
VHDL_VHDL_comp_11_090709.png

波形を見ていくとv_addr などに赤い部分が見られる。(上下の信号を比較して違っている部分を赤く表示する)
VHDL_VHDL_comp_12_090709.png

ここを拡大してみると、上のv_addrは20aまでカウントして000に戻っているが、下のv_addrは20bまでカウントとして000に戻っているのが分かる。( disp_timing1.vcd と disp_timing2.vcd )
VHDL_VHDL_comp_13_090709.png

ここで、VCD Timestart Shift Dialog のSet Time Offset に32000 を入れて、Setボタンをクリックする。
VHDL_VHDL_comp_14_090709.png

同じ信号名が上下に並んだWaveform Viewer の信号のうち、上だけがずれて、下の信号が20bまでカウントする以外は上の信号に同じということが分かる。つまり、上の信号の20aの位置と下の信号の20bの位置を合わせたわけだ。
これで、VHDLファイルでもModelSimでVCDファイルを吐かせることによって、Veritakで検証することができた。この機能は少し回路を変更したけれど、他に副作用が及ばないかどうかを検証することができると思う。
まだ確かめてはいないのだが、動作周波数が足りない場合にロジックの間にFFを挿入してパイプライン化する場合があるが、その場合にパイプライン化する前の以前の波形と、現在の波形をlこの機能で比較しすることができると思う。Time Offset 0で比較した後、1クロックずらしたTime Offset で比較し、その他のモジュールからの信号がパイプライン化に与える影響を少しは見ることができるのでないか?と思っている。

最後に注意なのだが、この比較機能はWaveform Viewer に最初に表示された信号と次の信号を比較しているようなのだ。従って、Waveform Viewer の1番目の信号と2番目の信号の信号名が違っている場合は、かなり赤くなってもあわてずに、Waveform Viewer の1番目の信号と2番目の信号名をそろえるようにした方が良いようだ。
VHDL_VHDL_comp_15_090709.png

  1. 2009年07月10日 04:56 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

ブログのLinkを変更しました

FPGAの部屋のLinkを変更した。3つのサイトを追加した。

私の近所に結構有名な酒蔵がある。(そこの旦那は私の2つ下で小さい頃は一緒遊んだもんだ。。。)その酒蔵では毎年年末に新酒を出す。初絞りという酒なのだ。これが麹を布で絞ったばかりのしぼりたてのすこし濁っているお酒なのだ。このお酒が評判で毎年年末には買いに来る車が引きも切らない。私もお酒が飲めたころには、飲んでいたがおいしいし、飲み口が良いので、すいすいと飲めてしまう。あと、毎年の味が微妙に変わる傾向があった。今年は出来が良いとか、今年は去年に比べればいまいちかな?という感想を持ったものだ。このお酒は要冷蔵、つまり酵母が生きている生酒なのだ。それでかどうか知らないが、飲みすぎると悪酔いしやすい気がした。おいしいので、つい飲みすぎてしまう為ということもあると思うが。。。

長々と書いてしまったが、このお酒をポルトガルのY氏の依頼で毎年送っているのが、株式会社エム・アイ・エーの社長さんなのだ。お会いしたことはないが、お酒がお好きな方なのだろう。会社紹介を見るとCQ出版関係の基板を作っておられるようだ。BLANCAやY氏の付属ボード、などなど。一度お会いしてみたい。
次は、いつも大変お世話になっているVeritakのページだ。今回は3週間ほど振り回してしまって、本当に申し訳なかったが、Veritakの機能が大変素晴らしいものになったと思う。そのうちに、ModelSimを使ってVCDファイルを吐いて機能検証するやり方を書いておこうと思う。
次は、アクティブに記事を書かれているSim's blogさん。Simさんとはオフ会でお会いし、お話できて楽しかった。またよろしくお願いします。リンクしてしまったけど良かったか?まずいときにはご連絡ください。
最後は、たーぼ のハードウェア設計記録さん。VHDLの記事がとても為になった。記事を更新されないのは残念だが、VHDLのことで迷ったら参照させていただこうと思う。
後は、徒然日記さんもリンクさせてもらおうと思ったのだが、なぜかブログが見つからなくなってしまった。いろいろ有益な情報がたくさんあったので残念だ。
  1. 2009年07月08日 05:30 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:4

QuartusⅡでSignalTapⅡを試してみるまでの準備3(キャラジェネROMデータをMIFに変換)

QuartusⅡでSignalTapⅡを試してみるまでの準備2(BRAMを書き換える)”の続き。
キャラクタ・ジェネレータ・ROMはXilinxのBRAMを使用している。全ソースを下に示すが、問題は初期化ROMデータをどうするかだ?

// キャラクタジェネレータ用ROM

`default_nettype none
`timescale 1ns / 1ps

module char_gen_rom(clk, reset, char_addr, row_addr, dout);
    input clk;
    input reset;
    input [6:0] char_addr;
    input [2:0] row_addr;
    output [7:0] dout;
    
    wire clk;
    wire reset;
    wire [6:0] char_addr;
    wire [2:0] row_addr;
    wire [7:0] dout;
    
    wire [10:0] addr;
    
    assign addr = {1'b0, char_addr, row_addr};
    
    RAMB16_S9 #(
        .INIT_00(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_01(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_02(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_03(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_04(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_05(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_06(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_07(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_08(256'h0014147F147F1414000000000012243600080008080808080000000000000000), // #,",!, 
        .INIT_09(256'h0000000000081018004C322254081408002152240812254200083E483E093E08), // ',&,%,$
        .INIT_0A(256'h000808087F08080800492A1C7F1C2A4900040810101008040020100808081020), // +,*,),(
        .INIT_0B(256'h00010204081020400006060000000000000000007F0000000002040600000000), // /,.,-,,
        .INIT_0C(256'h001C22201820221C003E02041820221C001C080808080C080018244242422418), // 3,2,1,0
        .INIT_0D(256'h001010202040407E003C42423E02423C001E20201E02023E0020207E22242830), // 7,6,5,4
        .INIT_0E(256'h0004080C00000C000000000C00000C00003C42407C42423C003C42423C42423C), // ;,:,9,8
        .INIT_0F(256'h000800081020221C00040810201008040000003E003E00000020100804081020), // ?,>,=,<
        .INIT_10(256'h001C22010101221C003F41413F41413F0041417F2236141C005C2A155549221E), // C,B,A,@
        .INIT_11(256'h001C22710101221C000101013F01017F007F01013F01017F001F21414141211F), // G,F,E,D
        .INIT_12(256'h0022120A060A1222000E11101010103E001C08080808081C004141417F414141), // K,J,I,H
        .INIT_13(256'h001C22414141221C00416151494543410041414149556341003E020202020202),// O,N,M,L
        .INIT_14(256'h003C42403C02423C002111093F41413F005C26594141221C000101013F41413F), // S,R,Q,P
        .INIT_15(256'h00225555554949490008141422224141001C224141414141000808080808087F), // W,V,U,T
        .INIT_16(256'h0038080808080838003F02040810203F00080808081422410041221408142241), // [,Z,Y,X
        .INIT_17(256'h007F0000000000000000000000221408001C10101010101C0008083E083E1422), // _,^,],\
        .INIT_18(256'h0038040438000000001E22221E020200003C223C201C00000000000000180810), // c,b,a,`
        .INIT_19(256'h001C221C0C122C00000808081C081000001C021E221C0000003C22223C202000), // g,f,e,d
        .INIT_1A(256'h0024140C14240400000C1210100010000008080800080000002424241C040400), // k,j,i,h
        .INIT_1B(256'h0018242424180000002828282814000000545454542A00000018080808080800), // o,n,m,l
        .INIT_1C(256'h0018201804180000000404040C34000000202038243800000004041C241C0000), // s,r,q,p
        .INIT_1D(256'h00142A2A2A2200000008141422220000001824242424000000180808081C0800), // w,v,u,t
        .INIT_1E(256'h001008080C080810003E0408103E000000020408142200000022140814220000), // {,z,y,x
        .INIT_1F(256'h0000000000000000000000000000142800040808180808040008080808080808), //  ,~,},|
        .INIT_20(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_21(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_22(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_23(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_24(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_25(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_26(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_27(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_28(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_29(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2A(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2B(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2C(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2D(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2E(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2F(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_31(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_32(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_33(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_34(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_35(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_36(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_37(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_38(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_39(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3A(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3B(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3C(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3D(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3E(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3F(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_00(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_01(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_02(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_03(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_04(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_05(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_06(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_07(256'h0000000000000000000000000000000000000000000000000000000000000000)
    ) CHAR_GEN_ROM_INST (
        .DO(dout),
        .DOP(),
        .ADDR(addr),
        .CLK(clk),
        .DI(8'd0),
        .DIP(1'b0),
        .EN(1'b1),
        .SSR(reset),
        .WE(1'b0)
    );
endmodule


これをAlteraのMIFファイルにするためにRubyで変換ソフトを作ろうとした。一行を読んだ文字列をsplitメソッドで配列に直して、最初のINITをsliceメソッドで抽出しようとしたのだが、配列にはsliceメソッドがないようでエラーになってしまった。文字列クラスに配列を入れようとしたのだが、文字列クラスの宣言の仕方が良くわからなかった。もしかして、String.newでよかったのかな?
ともかくうまくいかなかったので、初期化データだけ取り出してMIFに直すことにした。初期化データはこんな感じ。

0014147F147F1414000000000012243600080008080808080000000000000000
0000000000081018004C322254081408002152240812254200083E483E093E08


これをMIFになおすRubyプログラムを作った。稚拙なプログラムで恥ずかしいが、それを下に示す。もう少し大きなRubyのプログラムを4年前くらいに作ったはずなのに、忘れてしまって恥ずかしい。なお、MIFファイルフォーマットに関しては、"Memory Initialization File (.mif) Definition"を参考にした。

# XilinxのBRAMプリミティブのint値をMIFファイルに変換する

require 'scanf'

def usage
  STDERR.print "usage : #$0 [input BRAM Verilog file name] [output MIF file name] \n"
  exit 1
end

if ARGV.size < 2
  usage
else
    file = File.open(ARGV[0], 'r') # BRAM VerilogファイルをReadモードでオープン
    filew = File.open(ARGV[1], 'w') # MIFファイルをWriteモードでオープン
    
    # ヘッダ
    filew.print ("DEPTH = 2048;\n")
    filew.print ("WIDTH = 8;\n")
    filew.print ("ADDRESS_RADIX = HEX;\n")
    filew.print ("DATA_RADIX = HEX;\n")
    filew.print ("CONTENT\n")
    filew.print ("BEGIN\n")
    filew.print ("\n")
    
    address = 0;
    while line = file.gets # 1line読み込み
        i=31;
        while i>=0
            line_port = line
            filew.printf ("%0.4X : ", address)
            filew.print (line_port.slice!(i*2,2))
            filew.print ("\n")
            i -= 1
            address += 1
        end
    end
    filew.print("\n")
    filew.print("END;\n")
    
    file.close
    filew.close
end


変換したMIFファイルの一部を下に示す。

DEPTH = 2048;
WIDTH = 8;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;
CONTENT
BEGIN

0000 : 00
0001 : 00
0002 : 00
0003 : 00
0004 : 00
0005 : 00
0006 : 00


これでMIFファイルが出来たので、次はMegaWizard Plug-In Manager でROMを作って、その初期化データとして、今回作成したMIFファイルを指定する。

2009/07/14:追記
MIFファイルを生成するRubyプログラムにバグがあります。詳しくは”QuartusⅡでSignalTapⅡを試してみるまでの準備4(MWPIMでキャラクタ・ジェネレータROMを生成)”を参照。
  1. 2009年07月07日 04:28 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:0

食品棚作り

昨日はすこし腰が痛かったのですが、食品棚作りの最後の仕上げにかかりました。
食品棚の上の部分です。板に溝を切って、4mm厚のシナべニアを入れます。
syokuhinndana_1_090706.jpg

あらかじめトリマーで溝を彫ってありましたが、それをノミで成形します。このようになっているのを
syokuhinndana_2_090706.jpg

こんな風にします。でもこれは汚くなってしまいました。失敗。。。
syokuhinndana_3_090706.jpg

シナべニアをぴったり(に行かなかったけど、両端1mm程度あいてしまった)に切って、溝にはめ込みボンド+一部ねじで留めます。
syokuhinndana_4_090706.jpg

後は、下と固定して、色を塗れば終了です。色は白だそうです。色を塗装してから上下をつないだ方が塗装しやすいかもしれませんね。

前回の写真は下。
syokuhindana_090620.jpg

  1. 2009年07月06日 06:33 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

Virtex-6とSpartan-6のスライス構造とパスの比較

どうもRubyプログラムに手間取っていてキャラクタ・ジェネレータのデータを移行出来ないでいるので、Virtex-6とSpartan-6のスライス構造とパスの比較をしてみたいと思う。

まずはVirtex-6から、使用する回路は以前の”ISE11.2iでのSpartan-3とSpartan-6の速度差”で使用したキャラクタ・ディスプレイ・コントローラ。
まずは、Virtex-6 (xc6vlx75-1ff484) でインプリメントした結果をFPGA Editorで見る。
V6_S6_1_090705.png

全体図はこんな感じ。SLICEを見てみよう。最初にSLICEMから、SLICEMは分散RAMにもなるSLICEだ。
V6_S6_2_090705.png

FFの数が多い。Virtex-5の倍の数が入っている。以前のVirtex-5のSLICEの図は”Virtex5, Virtex4, Spartan3Eのインプリメント結果2(分散RAM)”を参照のこと。
次はSLICEL。SLICELは分散RAMの機能がないSLICE。
V6_S6_3_090705.png

SLICEMに比べてLUTが簡素化されている。
次にクリティカルパスを下に示す。

================================================================================
Timing constraint: TS_clk = PERIOD TIMEGRP "clk" 3 ns HIGH 50%;
 2859 paths analyzed, 605 endpoints analyzed, 23 failing endpoints
 23 timing errors detected. (23 setup errors, 0 hold errors, 0 component switching limit errors)
 Minimum period is   3.754ns.
--------------------------------------------------------------------------------
Slack:                  -0.754ns (requirement - (data path - clock path skew + uncertainty))
  Source:               CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER (RAM)
  Destination:          CharDispCtrler_inst/red_node (FF)
  Requirement:          3.000ns
  Data Path Delay:      3.589ns (Levels of Logic = 1)
  Clock Path Skew:      -0.130ns (1.393 - 1.523)
  Source Clock:         clk_BUFGP rising at 0.000ns
  Destination Clock:    clk_BUFGP rising at 3.000ns
  Clock Uncertainty:    0.035ns

  Clock Uncertainty:          0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter (TSJ):  0.070ns
    Total Input Jitter (TIJ):   0.000ns
    Discrete Jitter (DJ):       0.000ns
    Phase Error (PE):           0.000ns

  Maximum Data Path at Slow Process Corner: CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER to CharDispCtrler_inst/red_node
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    RAMB18_X0Y16.DO17    Trcko_DOB             2.073   CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER
                                                       CharDispCtrler_inst/frame_buffer_inst/FRAME_BUFFER_GEN[4].FRAME_BUFFER
    SLICE_X2Y36.A6       net (fanout=2)        0.691   CharDispCtrler_inst/display_dout<9>
    SLICE_X2Y36.A        Tilo                  0.075   CharDispCtrler_inst/n0084
                                                       CharDispCtrler_inst/Mmux_n008411
    OLOGIC_X0Y36.D1      net (fanout=1)        0.240   CharDispCtrler_inst/n0084
    OLOGIC_X0Y36.CLK     Todck                 0.510   CharDispCtrler_inst/red_node
                                                       CharDispCtrler_inst/red_node
    -------------------------------------------------  ---------------------------
    Total                                      3.589ns (2.658ns logic, 0.931ns route)
                                                       (74.1% logic, 25.9% route)


3.589nsとさすがに速い。

次に同じキャラクタ・ディスプレイ・コントローラをSprtan-6 (xc6slx9-2csg225) でインプリメントして、同様にFPGA Editorで見ると。
V6_S6_4_090705.png

チップが小さいのだが、Virtex-6よりもロジックが分散しているような気がする。
SlICEMを見てみる。この回路はSLICEMは使用されていないので未使用のもの。
V6_S6_5_090705.png

Virtex-6と同じよう。
次にSLICEL。これは使用されているもの。
V6_S6_6_090705.png

これもまたVirtex-6と同じような気がする。
次にSpartan-6で新しく搭載されたSLICEX。これはSLICELからキャリーチェーンが除かれている。
V6_S6_7_090705.png

次にクリティカルパスを下に示す。

================================================================================
Timing constraint: TS_clk = PERIOD TIMEGRP "clk" 3 ns HIGH 50%;
 2859 paths analyzed, 605 endpoints analyzed, 23 failing endpoints
 23 timing errors detected. (23 setup errors, 0 hold errors, 0 component switching limit errors)
Timing constraint: TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 50%;
 2858 paths analyzed, 708 endpoints analyzed, 43 failing endpoints
 43 timing errors detected. (43 setup errors, 0 hold errors, 0 component switching limit errors)
 Minimum period is   5.638ns.
--------------------------------------------------------------------------------
Slack:                  -0.638ns (requirement - (data path - clock path skew + uncertainty))
  Source:               CharDispCtrler_inst/disp_timing_inst/v_point_1 (FF)
  Destination:          CharDispCtrler_inst/disp_timing_inst/v_point_9 (FF)
  Requirement:          5.000ns
  Data Path Delay:      5.631ns (Levels of Logic = 5)
  Clock Path Skew:      -0.007ns (0.099 - 0.106)
  Source Clock:         clk_BUFGP rising at 0.000ns
  Destination Clock:    clk_BUFGP rising at 5.000ns
  Clock Uncertainty:    0.000ns

  Maximum Data Path: CharDispCtrler_inst/disp_timing_inst/v_point_1 to CharDispCtrler_inst/disp_timing_inst/v_point_9
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    SLICE_X8Y12.BQ       Tcko                  0.628   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_1
    SLICE_X9Y13.C3       net (fanout=9)        0.780   CharDispCtrler_inst/disp_timing_inst/v_point<1>
    SLICE_X9Y13.CMUX     Tilo                  0.580   CharDispCtrler_inst/disp_timing_inst/n0065_inv
                                                       CharDispCtrler_inst/disp_timing_inst/n0065<10>_SW1
    SLICE_X9Y13.A4       net (fanout=5)        0.969   N16
    SLICE_X9Y13.A        Tilo                  0.487   CharDispCtrler_inst/disp_timing_inst/n0065_inv
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X8Y12.A4       net (fanout=1)        0.651   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X8Y12.COUT     Topcya                0.832   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>_rt
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X8Y13.CIN      net (fanout=1)        0.024   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X8Y13.COUT     Tbyp                  0.098   CharDispCtrler_inst/disp_timing_inst/v_point<7>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X8Y14.CIN      net (fanout=1)        0.024   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X8Y14.CLK      Tcinck                0.558   CharDispCtrler_inst/disp_timing_inst/v_point<10>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_xor<10>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_9
    -------------------------------------------------  ---------------------------
    Total                                      5.631ns (3.183ns logic, 2.448ns route)
                                                       (56.5% logic, 43.5% route)


上のパスと同様のパスをVirtex-6のパスから検索したので下に示す。

--------------------------------------------------------------------------------
Slack (setup path):     0.246ns (requirement - (data path - clock path skew + uncertainty))
  Source:               CharDispCtrler_inst/disp_timing_inst/v_point_1 (FF)
  Destination:          CharDispCtrler_inst/disp_timing_inst/v_point_9 (FF)
  Requirement:          3.000ns
  Data Path Delay:      2.704ns (Levels of Logic = 5)
  Clock Path Skew:      -0.015ns (0.100 - 0.115)
  Source Clock:         clk_BUFGP rising at 0.000ns
  Destination Clock:    clk_BUFGP rising at 3.000ns
  Clock Uncertainty:    0.035ns

  Clock Uncertainty:          0.035ns  ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE
    Total System Jitter (TSJ):  0.070ns
    Total Input Jitter (TIJ):   0.000ns
    Discrete Jitter (DJ):       0.000ns
    Phase Error (PE):           0.000ns

  Maximum Data Path at Slow Process Corner: CharDispCtrler_inst/disp_timing_inst/v_point_1 to CharDispCtrler_inst/disp_timing_inst/v_point_9
    Location             Delay type         Delay(ns)  Physical Resource
                                                       Logical Resource(s)
    -------------------------------------------------  -------------------
    SLICE_X12Y36.BQ      Tcko                  0.381   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_1
    SLICE_X13Y37.D5      net (fanout=8)        0.331   CharDispCtrler_inst/disp_timing_inst/v_point<1>
    SLICE_X13Y37.D       Tilo                  0.075   N16
                                                       CharDispCtrler_inst/disp_timing_inst/n0065<10>_SW1
    SLICE_X13Y37.C2      net (fanout=1)        0.501   N16
    SLICE_X13Y37.C       Tilo                  0.075   N16
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X12Y36.A2      net (fanout=1)        0.753   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>
    SLICE_X12Y36.COUT    Topcya                0.417   CharDispCtrler_inst/disp_timing_inst/v_point<3>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_lut<0>_rt
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X12Y37.CIN     net (fanout=1)        0.000   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<3>
    SLICE_X12Y37.COUT    Tbyp                  0.078   CharDispCtrler_inst/disp_timing_inst/v_point<7>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X12Y38.CIN     net (fanout=1)        0.000   CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_cy<7>
    SLICE_X12Y38.CLK     Tcinck                0.093   CharDispCtrler_inst/disp_timing_inst/v_point<10>
                                                       CharDispCtrler_inst/disp_timing_inst/Mcount_v_point_xor<10>
                                                       CharDispCtrler_inst/disp_timing_inst/v_point_9
    -------------------------------------------------  ---------------------------
    Total                                      2.704ns (1.119ns logic, 1.585ns route)
                                                       (41.4% logic, 58.6% route)


全体的にスピードが全く違う。
例えば最初のCharDispCtrler_inst/disp_timing_inst/v_point<3>のTckoもVirtex-6の0.381nsに対して、Spartan-6は0.628nsと倍近い。やはり半導体プロセスが違うのか?そうなると消費電力には大きな差が出てくるのかもしれない???

最後に、上の書いたのはVirtex-6 (xc6vlx75-1ff484)ですが、これをVirtex-6 (xc6vlx75-3ff484) スピードグレード3でインプリメントしてみると、クリティカルパスは2.959ns、最大動作周波数は338MHzとなりました。
  1. 2009年07月05日 06:15 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:2

QuartusⅡでSignalTapⅡを試してみるまでの準備2(BRAMを書き換える)

QuartusⅡでSignalTapⅡを試してみるまでの準備1(テキストエディタの日本語表示)”の続き。
キャラクタ・ディスプレイ・コントローラはframe_buffer.v とchar_gen_rom.v にBRAMを使用しているので、これをAltera用に書き換える必要がある。
まずは、frame_buffer.v から書き換えることにする。これは、Dual-Port Memoryをインスタンシエーションしている。frame_buffer.v のBRAM部分を下に示す。

    generate
    genvar i;
        for (i=4; i>=0; i=i-1) begin : FRAME_BUFFER_GEN
            RAMB16_S2_S2 FRAME_BUFFER (
                .DOA(processor_dout[i*2+1 : i*2]),
                .DOB(display_dout[i*2+1 : i*2]),
                .ADDRA(processor_addr),
                .ADDRB(display_addr),
                .CLKA(clk),
                .CLKB(clk),
                .DIA(processor_din[i*2+1 : i*2]),
                .DIB(2'b00),
                .ENA(1'b1),
                .ENB(1'b1),
                .SSRA(reset),
                .SSRB(reset),
                .WEA(processor_we),
                .WEB(1'b0)
            );
        end
    endgenerate


Alteraのプリミティブは知らないので、一番簡単な方法と思える MegaWizard Plug-In Manager でRAM: 2-PORTを使用することにする。
Quartus2_signaltap2_5_090702.png

RAMの後ろのFFは1クロックずれると思って削除してみた。これで大丈夫だと思うが、シミュレーションしてみてだめだったら調整する。
frame_buffer.v ではRAM: 2-PORTをインスタンシエーションした。

    frame_buffer_altera    frame_buffer_altera_inst (
        .clock ( clk ),
        .data ( din ),
        .rdaddress ( display_addr ),
        .wraddress ( processor_addr ),
        .wren ( processor_we ),
        .q ( display_dout )
    );


これで、frame_buffer.v は大丈夫かな?シミュレーションしてみればよいか悪いかわかるはず。
今度はchar_gen_rom.v だが、初期化データをどうしようか?Rubyか何かでフィルタを作って、Altera のMIFファイルに変換しようと思う。いまRubyの勉強中だ。
  1. 2009年07月03日 20:57 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:0

Veritak3.69C以降におけるModelSimのVHDLシミュレーションとChipScopeの協調検証

今まではVeritakがVerilogのシミュレータだったので、VerilogのシミュレーションとChipScope波形を比べていたが、VeritakがVersion 3.69Cから2つのVCD波形を比べられるようになったので、比べてみた。
プロジェクトはこのブログでは訳があって公開していないキャラクタ・ディスプレイ・コントローラのVHDL版。ModelSimでシミュレーションして、”ModelSimでVHDLのプロジェクトからVCDファイルを出力する方法(覚書)”を使って、disp_timingモジュールだけのVCD波形を20ms分取り出してある。取り出した波形をVeritakで表示したのが下の図。
VHDL_ChipScope_comp_1_090702.png

ISE11.2のプロジェクトにChipScopeのファイルを入れてインプリメント。
VHDL_ChipScope_comp_2_090702.png

Spartan3 Starter Kitにつないで、ChipScopeのAnalyzerで波形をサンプルし、VCDファイルにExportする。
VHDL_ChipScope_comp_3_090702.png

ChipScopeのVCDファイルとModelSimから出力したVCDファイルを両方Veritakのプロジェクトに入れる。その際、ChipScopeのVCDファイルをプロジェクトの最初のファイルとする。Veritak 3.69C以降は最初に入れたVCDファイルのスケールとオフセットを変更することができる。
Waveform ViewerにChipScopeの波形を入れて、その下にModelSimから出力したVCDファイルの相当する波形を入れる。その場合に、ModelSimから出力したVCDファイルの波形を見ると、LSBからになっているので、Waveform Viewer入れてから逆順に並べ替える。
VHDL_ChipScope_comp_4_090702.png

並べおわたら、右クリックのグループ化から名前付作成を選択する。
VHDL_ChipScope_comp_5_090702.png

名前を付ける。
VHDL_ChipScope_comp_6_090702.png

出来たv_point[10:0] をChipScopeの波形の下に持っていく。それを繰り返してModelSimから出力したVCDファイルの波形をChipScopeの波形の下に入れていく。そして、”Veritak3.69B以降とChipScopeによる協調検証”を参考にVCD Timestart Shift Dialogを設定すると、ModelSimから出力したVCDファイルの波形とChipScopeの波形を比べることができる。
VHDL_ChipScope_comp_7_090702.png

波形全体を表示すると、真っ赤です。
VHDL_ChipScope_comp_8_090702.png

20ms間シミュレーションを行っているので、ChipScopeで取れた波形はほんの一部分です。
なお、ModelSimのシミュレーションのレゾリューションはps なので、VCD Timestart Shift DialogのScaleには40000 を入れています。
  1. 2009年07月03日 06:20 |
  2. ChipScope、シミュレーション協調検証
  3. | トラックバック:0
  4. | コメント:2

ISE11.2iでのSpartan-3とSpartan-6の速度差

@eleでぐらろさんがSpartan-6はSpratan-2Eの2倍速いと書いておられたので、私もSpartan-3とSpartan-6でやってみた。比較する回路は、DDR2 SDRAMコントローラなどは、そのFPGAに固有のプリミティブを使っていたりするのでだめ。なので、ちょっとしょぼいがキャラクタ・ディスプレイ・コントローラでやってみることにした。使用したバージョンはISE11.2i。
これは本当は50MHzのクロックを入れて、それをDCMで1/2の25MHzに落として動作する。今回はDCMを取り除いて、入力したクロックで直接動作するように変更した。この入力周波数をを200MHz、周期5nsで動作するようにUCFを書き換え、入出力パッドの制約をコメントアウトした。

#PACE: Start of Constraints generated by PACE
#PACE: Start of PACE I/O Pin Assignments
#NET "clk" LOC = "T9";
#NET "reset" LOC = "L14";
#NET "VGA_BLUE" LOC = "R11" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_GREEN" LOC = "T12" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_HSYNC" LOC = "R9" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_RED" LOC = "R12" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_VSYNC" LOC = "T10" | DRIVE = 8 | SLEW = FAST ;
#PACE: Start of PACE Area Constraints
#PACE: Start of PACE Prohibit Constraints
#PACE: End of Constraints generated by PACE
NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 5 ns HIGH 50 %;


これでSpartan-3 (xc3s200-4ft256) で、ISEの設定をデフォルトの状態でインプリメントした。
PARのタイミングレポートを下に示す。

----------------------------------------------------------------------------------------------------------
  Constraint                                |    Check    | Worst Case |  Best Case | Timing |   Timing   
                                            |             |    Slack   | Achievable | Errors |    Score   
----------------------------------------------------------------------------------------------------------
* TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 5 | SETUP       |    -1.829ns|     6.829ns|      35|       20907
  0%                                        | HOLD        |     0.806ns|            |       0|           0
------------------------------------------------------------------------------------------------------


クリティカルパスが6.829ns、146MHzと結構、頑張っている。
使用したロジックを下に示す。
spartan3_chardisp_ISE112_090701.png

次にSpartan-6 (xc6slx9-2csg225) に変更して、同じ条件でインプリメントしてみる。

----------------------------------------------------------------------------------------------------------
  Constraint                                |    Check    | Worst Case |  Best Case | Timing |   Timing   
                                            |             |    Slack   | Achievable | Errors |    Score   
----------------------------------------------------------------------------------------------------------
* TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 5 | SETUP       |    -0.638ns|     5.638ns|      43|       12140
  0%                                        | HOLD        |     0.776ns|            |       0|           0
------------------------------------------------------------------------------------------------------


上のように通っていないが、5.638ns、177MHz動作となった。Spartan-3よりも速い。
使用したロジックを下に示す。
spartan6_chardisp_ISE112_090701.png

まだまだ、表示しきれないほどロジックがある。ISERDESやOSERDESなども見えた。
使用したLUT数はSpartan-3は129で、Spartan-6は88だった。
Spartan-6は楽しみなFPGAだと思う。FPGA Editorで見るといろいろ入っているようだ。

2009/07/04 追加:
Virtex-4, xc4vlx15-10sf363 で同様にやると、制約5nsパス、制約4nsもパス。制約を3nsにしたら、さすがに3.615ns、277MHzとなりました。
Virtex-5, xc5vlx30-1ff324 では、3.440ns、291MHz
Virtex-6, xc6vlx75-1ff484 では、3.330ns、300MHz
でした。
さすがにVirtexシリーズは速いようです。やはり配線の数が違うのでしょうか?
  1. 2009年07月01日 21:15 |
  2. Virtex-6, Spartan-6
  3. | トラックバック:0
  4. | コメント:10

ModelSimでVHDLのプロジェクトからVCDファイルを出力する方法(覚書)

ModelSim SE 6.1eでVHDLのプロジェクトからVCDファイルを出力する方法の覚書。
最初にModelSimのコマンドwlf2vcd.exe でwlfファイル(シミュレーションデータが保存されているファイル)からVCDファイルを生成しようとした。デフォルトで出来ているvsim.wlfからは、ファイルがないと言われて生成できない。dataset snapshotを使って、wlfファイルを作ると変換は出来たがエラーが出力され、出来たVCDファイルはVeritakで読めなかった。(どうやら、ちゃんとVCDファイルが出来ていないようだ)
というわけでwlf2vcd.exeを使うのをあきらめて、ModelSimのVCDコマンドを使うことにする。

ModelSim® Reference Manualの194ページあたりから記述がある (vcd add)。
leon_sparcのyahooグループにもやり方が載っていた。
やり方を下に示す。キーボード・キャラクタ・ディスプレイのプロジェクトとする。 ModelSimのTranscriptの部分に記述する。(コマンド)

1.ModelSimのプロジェクトを読み込んで、シミュレーションをスタート ( vsim -t ps work.keyboard_chard_25mhz_tb )
2.vcdファイルのファイル名を指定 ( vcd file char_disp_sim.vcd )
3.vcdファイルに書き出す信号を記述、(-r :下位階層までの信号とポートを追加) ( vcd add -r /* )
  * 下の階層の信号を入れる場合には階層までのパスを設定する ( vcd add -r /keyboard_chard_25mhz_tb/chardispctrler_inst/* )
4.RUN ( run -all, または run 10 us など)
5.ModelSimを終了、終了しないとvcdファイルに書き込まれない ( quit -f ) ( vcd flush コマンドでvcdファイルに書き込まれるそうです。 2012/04/19)


これでchar_disp_sim.vcd が作成された。17ms程度シミュレーションして、char_disp_sim.vcd のサイズは77.3MB。

これをVeritakのプロジェクトを作って読み込ませる。Veritakチュートリアル2.4.1.2 VCDプロジェクトを参照。
Scope Tree Viewの右側のペインで右クリックして”個別信号をグループ化してWaveform Viewerに追加”を選択。
Veritak_vcd_view_1_090701.png

これでバスの信号がWaveform Viewerに追加されたので、個別の信号を選択して、Waveform Viewer に追加すると、vcdファイルをVeritakで見ることができる。
Veritak_vcd_view_2_090701.png

  1. 2009年07月01日 14:17 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:2