この前買ったCycloneⅡ(EP2C5Q208C8) の基板でいろいろサンプルをやってみている。
VGAのサンプルも動作したし、songという曲が流れるデモも動作した。
songのプロジェクトでChip plannerで中の配線がどうなっているかを見てみた。
画面の感じは昔々使っていたMAX+PLUSⅡとあまり変わらない感じ?
CycloneⅡは8つのLE (LUTとFF) でLABだっけ?を構成しているようだ。今はLEとかLABとか言わないのかな?
QuartusⅡを使ってみて、インプリメントスピードは、なんかQuartusのほうがISEよりも感覚的には早い気がする。比べるならば、同じ回路を同じ規模のFPGAで比べる必要があると思うが。。。
だいたいサンプルをやり終えて(NiosⅡはまだだけど)、動作しているのが確認できたので、XilinxのSpartan3A Starter KitのDDDR2 SDRAMコントローラに戻ろうと思う。
2009年05月29日 05:58 |
QuartusⅡ
| トラックバック:0
| コメント:0
とりあえず、購入したAlteraのFPGAボードとUSB Blasterもどきのテストをすることにした。
日昇テクノロジーのサンプルのページ からサンプルをダウンロードして、一番簡単そうなled_testをやってみることにした。(Quartusのやり方はいろいろなサイトで説明されているので省略する)
まずはQuartusⅡ9.0sp1を立ち上げて、プロジェクトをオープンする。
確か、紫の三角のStart Compilation をクリックすればコンパイルできるはず。。。
コンパイルできた。
これでProgrammerを立ち上げればよかったのでは?
Programmerを立ち上げた。
USB-Blasterが見えました。良かった。少し心配していたので。。。
Startしたら成功してLEDがついた。
左下のほうの互い違いについているLEDだ。これで、買ったボードとダウンロード・ケーブルは一応動いているのが確認できた。
2009/05/28 : 追加
7セグメントLEDと圧電スピーカーのデモも動かしてみたが、OKだった。案外使えるかも?
Verilog ソースのコメントが中国語?なので読めないのが難点か?できれば日本語とは言わないが英語で書いてあるとうれしい。
2009年05月27日 21:26 |
AlteraのFPGA
| トラックバック:0
| コメント:2
以前、32本の100MHzのLVCMOS33のデータ転送をチップ間で行ったことがあるが、同時スイッチング出力(SSO, Simultaneous Switching Output)だと思われる原因でエラーが出てしまったことがある。BGAパッケージの基板の裏側にパスコンを付けずにFPGAが付いている面のFPGAの周りにパスコンを置いてしまった。そのため電源のインピーダンスが上がって、SSOが少なくなってしまい、エラーになってしまったようだ。。
その時の最善の可決策としては、基板の作り直しなのだが、次善の策としては、IO規格の電流の制限値を12mAから4mAにすることでエラーを回避することができた。実際に波形を観測したが、12mAに時に比べて8mA、そして4mAとなるに従って、波形がなまっていくのが見えた。この基板では8mAの時の波形が一番良いように見えたが、確かエラーが出るので4mAに固定したと思う。波形のデータを取っていなかったのが残念。。。(ちなみに100MHzの矩形破を見ようとするとアクティブプローブを使用しないと矩形波に見えなかった。パッシブプローブだと100MHzクロックは正弦波に見えてしまう。)
実際の物は、もう名前が割れていると思うので、
リンクを示そう と思う。この文の最後の6. まとめに書いてある。
次に作った基板 では、この点は特にパターン設計をお願いした会社さんに考慮していただいた。”図 8. バイパスコンデンサの実装状況”を参照。
パスコンつけすぎだと思うが、Xilinxの指針に従っていると、このくらいつけることになってしまった。
この基板ではSSOは今のところ大丈夫のようだ。伝送線路シミュレーションをお願いして、最適と思われる電流値を採用している。
2009年05月27日 05:01 |
FPGAのトラブル
| トラックバック:0
| コメント:0
今までアンチウイルス・ソフトはAvast4を使っていたのだが、Cドライブのtempフォルダにテンポラリファイルを作ってしまう。通常は問題ないが、私のマシンはUSB接続のメモリカード・リーダーをつけた状態で、Windows XPをインストールしたので、ハードディスクはHドライブになってしまった。CドライブはMicro SDをとりあえず常時マウントしてある。何かとCドライブがないと不便なためだ。Avast4はCドライブにテンポラリファイルを作られてしまうので、やめてしまった。他にVMWareなどもテンポラリファイルを作るようだ。
そこで、
窓の杜で紹介されていたCOMODO Inernet Security をインストールしてみた。COMODO Inernet Securityは、ファイア・ウォールに関しては評判がいいみたいだが、アンチウイルスはいまいちという評価だった。
とりあえずインストールして、問題なく使用していた。
今日、QuartusⅡ9.0sp1をインストールしようとしたら、どうしてもできない。COMODO Inernet Securityのほうもエラーが出て、どうもCOMODO Inernet Securityがあやしそうだった。
COMODO Inernet Securityを良く見ると、Proactive Defenseを見るとインストール・モードがあった。さっそくこれをクリックすると、無事にQuartusⅡ9.0sp1がインストールできた。
やはり、ヒューリスティック検知がある場合は、ソフトウェアをインストールする際にはインストール・モードにする必要があるのかもしれない。前のAvast4のときにはおこられたことはないのだが、COMODO Inernet Securityはだめなようだ。
2009年05月26日 21:57 |
パソコン関連
| トラックバック:0
| コメント:0
昨日、
日昇テクノロジー から
FPGA/Cyclone II EP2C5Q208ボード と
CPLD/FPGA用のインタフェース・ボード と
CPLD/FPGA用ダウンロード・ケーブル を購入しました。
合計、送料込みで16,950円ととてもお買い得でした。コネクタの割り方などに雑なところが見かけられましたし、ダウンロード・ケーブルはフラットケーブルがコネクタではなく、直接出ていたので、価格なりという感じはしましたが、値段を見ると本当に安いので、動けば文句ないです。
これで、Alteraのボードが手に入ったので、Xilinxとの比較をしてみたいと思います。特にNiosⅡとSOPC Builderを使ってみたいですね。
これからQuartusⅡの9をダウンロードして、インストールしようと思います。ですが、今はSpartan3A Starter KitのDDR2 SDRAMコントローラを作っているので、それが終わったらにします。臨時収入が入ったので、なくならないうちに欲しかったボードを買ってしまいました。
マニュアルは全く同梱されていなかったです。すべてWebページからダウンロードということみたいです。電源用DCジャックの仕様をメールで問い合わせたのですが、夜にメールを送って、いくらもたたないうちに返事が来たのにはびっくりしました。電源はセンター+極性の5Vなので、手持ちの電源が使えそうです。
そういえば、品物を注文してから送ってくるのも早いです。日曜日に注文して、次の日(月曜日)に届きました。
仕事の関係もあって、私の軸足はXilinxなのですが、Alteraも勉強してみたくなりました。XilinxのFPGAやツールもまだまだ勉強し足りないところがたくさんあります。
2009年05月26日 06:06 |
AlteraのFPGA
| トラックバック:0
| コメント:0
を今は家具作りサークルでは、食品棚を作っています。
以前、
3Dプリンタでモデルを作りました が、今度は本物を作っています。1x12材を使って、奥行285mmの予定です。棚は、真ん中に仕切り板がある3段の棚で、合計6区画に分かれています。
図面はこれ 。
まずは750mmに切った1x12材の真ん中に板厚19mmの切り込みを板の幅の半分まで入れます。これを2枚作ります。(これを間違って3枚作ってしまったのは内緒です)
上の板は横の棚板です。
次は縦の仕切り板です。これは2枚分の横の棚板が入るので2つの切り込みがあります。
これらの板をたがいにはめ込むと下のようになります。
それを別に作った台ににはめ込んだのがこれです。
まだ棚板はねじ止めしていません。
これを板の反りをなるべく修正しながら木ねじ止めします。
とりあえず今日はここまでです。次は天板を載せてねじ止めなんですが、天板は1x4材と1x12材を並べて使います。天板には炊飯器を載せる予定なので、お茶碗を置くスペースが手前にほしいためです。1x?材は角をトリミングしてあるので、そのまま板同士を横に並べると合いません。この次の家具作りサークルのときに先生のところで、板のへりを直角に削ってもらってから合わせます。それまではお預けです。
1x12材は幅が広いので木が反ってしまいます。それを修正するのが大変ですね。
どうやったら一番効率良く反りが修正出来るでしょうか?両側の垂直板はねじ止めすれば、反りが治りますが、棚板は反りをとらないと真っすぐに付けるのが難しいです。クランプで反対側に曲がるように抑えつけてみたのですが、やりすぎると割れてしまいますし、押さえつけるのをやめると元に戻ってしまいます。板が少し割れるくらいにやらないとだめですし。。。毎回、頭の体操というか工夫しながらやるのが面白いです。
2009/05/25 追記:
そういえば、縦の仕切り板と横の棚板を組むときに木工用ボンドをつけるのを忘れてしまいました。切り込みがあって半分は浮いている状態なので、木工用ボンドで抑えないとだめですね。今から圧入して大丈夫かな?早く接着しないと反りが戻っちゃいますね。。。失敗。。。
2009年05月24日 21:13 |
木工
| トラックバック:0
| コメント:2
トラ技の2009年6月号の別冊付録”再確認!電子機器の開発ツール”に載せた電子サイコロのプロジェクトを使って、”
ISE11.1iのチュートリアル ”をブログに書いた。それを、
徒然日記 さんの”
電子サイコロ ”という記事でAltera用に書き換えて、実際にAlteraのDE1というボードに実装して頂いたようだ。
その記事中にAlteraのツールはデフォルトで未使用ピンのレベルを L にするので、未使用の7セグLEDのセグメントがついてしまうとのことだった。
ということは、AlteraのボードDE1は4つの7セグメントLEDが直接FPGAの出力ピンにつながっているのだろうか?Spartan3 Starter Kitはダイナミック点灯なので、そうはならない。現在の電子サイコロのコードでは、0番目の7セグLEDに固定してあるので、一番右の7セグLEDしか点灯しない。
DE1はAlteraのCyclone2のボードで、
Cyclone II FPGA スターター開発ボード リファレンスマニュアル の40ページの図2-18. 7 セグメント・ディスプレイの回路図を見ると、7セグLEDのセグメントが全部FPGAのピンにつながっているが分かる。
それで、FPGAの未使用ピンがLだと点灯してしまうんだな。でもかなり勢いが良く点灯しているので、本当に強くLに固定なんだろう。XilinxでもCPLDは完全にGND固定があった。
FPGAはbitgenのオプションで確か変えられたはず。さっそくProject NavigaterのGenerate Programming File のプロパティを見てみる。ダイアログ中のConfiguration Options を見ると、
UnusedPinはデフォルトではPull Downだった。Pull UpとFloatが選べる。
そういえば、7セグメントLEDを使わないときには、薄く点灯している。
#今日はF1モナコの予選が録画してあったので、朝それを見たが、Spartan3A Starter KitのDDR2 SDRAMコントローラを作ってやってみようとVerilogコードを作成中だ。おいおい作って、シミュレーションし、実装という手順になると思う。
昨日の午後は家具作りをした。食品棚も真ん中の垂直の棚と横の棚のはめ込みもだいたいうまくいったが板の反りが大きいので、クランプで修正中だ。どうも少し板が割れてしまったよう。。。
2009年05月24日 07:01 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
Make: Tokyo Meeting 03を楽しみにしていたのですが、昨日の夕食前の家族会議で行かないことが決定しました。つくばで最初の感染者になったら地域にいられない可能性がありますし、わざわざ人ごみに行かなくても良いでしょうということになりました。(心配すぎだとは思いますが。。。)
Make Tokyo Meeting は1, 2と行っていたので、残念です。
今日、職場のお知らせを見たら、八王子市も感染者が発生したと報道された地域になっていて、行くのを自粛しろということになっています。行ってきたら7日間は体温測定だそうです。
ブログでのレポートをみて、我慢しようと思います。次は、ぜひ行きたいと思います。
2009年05月22日 12:27 |
日記
| トラックバック:0
| コメント:0
複雑でないステートマシンでは、StateCADを便利に使っていたのですが、ISE11.1iから使えなくなったようです。
職場のパソコンにはISE9.1i、ISE9.2i、ISE10.1i、ISE11.1iが入っている。StateCADのファイル(.DIA) はISE10.1iのbin/ntに入っているsc.exeに関連付けしてあり、.DIAファイルをダブルクリックするとStateCADが起動するようになっていた。
ISE11.1iにStateCADがなくなっていたのは知っていたのですが、今までどおりに.DIAファイルをダブルクリックすると起動すると思っていた。今日、やってみたところ、”エントリポイントが見つかりません”ダイアログが出てStateCADが起動できなかった。
ショックだが、これを機会にVHDLに書き換えることにする。(職場ではVHDL使っています)
2009/05/22 追記:
ibPortabillity.dllをコピーしなくても、ISE10.1iのインストールフォルダの下のbin/ntの下のsc.exeをダブルクリックすると起動しました。ここからファイルをオープンできるので、ここからファイルを読み込んで使うことにします。
2009年05月21日 11:13 |
StateCADの使い方
| トラックバック:0
| コメント:2
ブログをFPGAキーワードで検索していたら、Graphvizで仕事用の図を書いているというブログを見つけた。(すみません。どなたのブログかわからなくてしまいました)
Graphvizってもしかして、doxygenをインストールしたとき入れたソフトだなと思い、調べてみると、いろいろな図を書けるということが分かった。(バージョンは2.22です)
そのブログに書いてあった
Graphviz チュートリアル のページに詳しく書いてある。ダウンロードは
Graphviz本家 から。
Graphviz チュートリアル のページによると、テキストファイルで図を各コマンドを書いていけば自動的に図にしてくれるとのこと。
.dotファイルを作って、コマンドプロンプトの窓の中でサンプルを作り、dotコマンドを使って、やってみたがPATHが通っていない。。。
WindowsのスタートからGraphviz 2.22のフォルダを見てみると、Dotty.exeとGVedit.exeがある。
まずはDotty.exeを立ち上げてみる。Dotty.exeを起動すると真っ白な何もない画面が出る。
左クリックすると楕円が表示されるがどうやって図を書くのかよくわからない。右クリックをするとメニューが表示される。
右クリックメニューのコマンドでalf.gvを選んで表示したのがこれ。
こんな風に書ければ良いが、とりあえずやり方が良く分からない(マニュアルはあるのだが、読むのが面倒だし、マウスの真ん中(ホイールクリック)ボタンがうまくいかない)。(ホイールクリックはマウスのせいみたいです。マウスを変えたら線は書けたのですが、楕円の中にステートを書く方法が分かりません)
次にはGVedit.exeを使ってみることにした。
GVeditは、FileメニューからNewを選んで開いた、Graphviz Layoutにコマンドを書いて、GraphvizメニューからRunするとステート図にしてくれる。こんな感じ。
ステート図にするには、Graphvizメニューからsettingsを選んで設定する。
Layout Engine はdotにしたほうが良いようだ。私はPNGファイルを出力するようにしている。
さっそく、
Graphviz チュートリアル のページを参考に、今作っているDDR2 SDRAMのコマンドを出力するステートマシンを書いてみたが、条件が多すぎて、あまりうまく書けない。条件を単純化して書いてみたソースがこれ。
digraph ddr2_cmd { graph [ranksep = 3, nodesep = 1.0, rankdir = LR]; NOP -> PALL [label = "pall1_init"]; NOP -> PALL [label = "pall2_init"]; NOP -> PALL [label = "refresh and actived banks"]; NOP -> PALL [label = "not equal_active_bank"]; NOP -> EMRS [label = "emr2s_init"]; NOP -> EMRS [label = "emr3s_init"]; NOP -> EMRS [label = "emrs_dllena_init"]; NOP -> EMRS [label = "emrs_ocd_def_init"]; NOP -> EMRS [label = "emrs_ocd_exit_init"]; NOP -> MRS [label = "mrs_dllrst_init"]; NOP -> MRS [label = "mrs_init"]; NOP -> REF [label = "ref1_init"]; NOP -> REF [label = "ref2_init"]; NOP -> REF [label = "refresh and not active banks"]; NOP -> ACT [label = "not addr_fifo_empty and not active_bank"]; NOP -> READ [label = "read_writex='1' and equal_active_bank"]; NOP -> WRIT [label = "read_writex='0' and equal_active_bank"];; NOP -> NOP; PALL -> NOP; EMRS -> NOP; MRS -> NOP; REF -> NOP; ACT -> NOP; READ -> NOP; WRIT -> NOP; }
これをGraphzivで図にするとこうなった。
Graphzivはいろいろな図を書けそうなので、もっと勉強してみたい。VHDLやVerilog-HDLのステートマシン記述から自動的にGraphzivのフォーマットに直してくれるパーサ?があればいいんだけど。。。
2009/06/03 : 追記
Graphzivの記事をどなたのブログで見たかがわかりました。”
日曜プログラマがダラダラ書く ”さんの”
2009-04-06 ”でした。
2009年05月21日 04:29 |
EDAツールについて
| トラックバック:0
| コメント:0
Sim's blog さんで
キーワードベスト20 その2 をやっていたので、私も2009年4月の検索キーワードベスト30を見てみることにした。
まずはベスト30まで。
FPGAの部屋が1位だった。fpgaの部屋を入れれば505検索だった。次はディジタル・デザイン・テクノロジ、下の似たような言葉も入れると、343検索。
FPGA入門も多い。やはり、カーナビのガーミンの検索も依然として多い。
私のブログではソフトウェアの検索も多いみたい。tortoisesvnとかnotepadとか、notepadはそのまま使えると思うのだが?補完のやり方とかかな?しかし、notepad++でないのが不思議。もしかして本当にnotepadの使い方の検索???
後はverilogやmico32などのキーワードが多い。
LVPECLのキーワードも上位なのが面白い。そんなに使うのだろうか?
2009年05月20日 04:56 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)” の続き。
前回はJTAG経由でFPGAをコンフィギュレーションして、電子サイコロを動作させた。FPGAはパーソナルコンピュータと接続してコンフィグしなくても、電源ONでPlatform Flash PROMからコンフィグデータをダウンロードして自動的に回路が動作する仕組みがある。そのような仕組みがないとスタンドアロンで動作しないわけだけど。。。ちなみにFPGAは電源をOFFすると回路データを忘れてしまうのだ。(忘れないのもあるけど。。。)
それでは、Xilinx専用のPlatform Flash PROMに書きこむためのファイルを用意しよう。
前回のProject Navigatorの画面で、Processesペイン内のConfigure Target Device の下のGenerate Target PROM/ACE File をダブルクリックする。
Wanningダイアログが開く。OKボタンをクリックする。
ISE iMPACTが起動する。PROM File Formatter をダブルクリックする。
PROM File Formatter が開く。(こんな風になったんですね。びっくりしました)
Step 1. Select Storage Target を設定する。
Storage Device Type: はXilinx Flash/PROMを選択する。緑の矢印をクリックする。
Step 2. Add Storage Device(s) を設定しよう。
PROM Family はPlatform Flashを選択して、Device (bits) はxcf02s [2M] を選択する。
Add Storage Device をクリックして、Storage Deviceに追加する。
その後、緑矢印をクリックする。
Step 3. Enter Data を設定する。
File Name を設定する。今回はdice_top と入力する。
後は、デフォルトでOKかな? 今回はMCSファイルを生成する。EXOファイルでもOK。
最後のステップが終了したので、OKボタンをクリックする。
Add Device ダイアログが開く。OKボタンをクリックする。
Add Device のファイルを選択するダイアログが開く。dice_top.bit を選択して、開くボタンをクリックする。
もう一度、Add Device ダイアログが開く。もう、コンフィグするFPGAはないので、NOボタンをクリックする。
Add Device ダイアログが開く。やはり、コンフィグするFPGAはないので、OKボタンをクリックする。
iMPACT Processes ペインのGenerate File... をダブルクリックすると、dice_top.mcs が生成される。
Generate Succeeded と表示されたら成功だ。
さて、dice_top.mcs ファイルが生成できたので、これをPlatform Flash PROM に書きこもう。
Spartan3 Starter Kitをダウンロードケーブルでパーソナルコンピュータ(PC)に接続し、Spartan3 Starter Kitの電源をONにする。
ISE iMPACT のiMPACT Flows ペインのBoundary Scan をダブルクリックする。
後は、前回の
”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)” と同様の手順で進行するが、xc3s200 が選択され、緑色のときにはBypassボタンをクリックする。
xcf02s が選択されているときには、dice_top.mcs を選択してOpenボタンをクリックする。
Device Programming Properties - Device 2 Programming Properties ダイアログはこんな感じ。OKボタンをクリック。
iMPACT ProcessesペインのAvailable Operations are: のProgram をダブルクリックする。
FPGAのコンフィギュレーションが成功すれば、Program Succeeded が表示される。これでPlatform Flash PROMをコンフィギュレーションできた。
これで電源ONで電子サイコロが動くコンフィグデータがそろった。
J8のM0、M1、M2をすべてショートすると(Master Serialモード)電源ONだけで電子サイコロが動作するようになる。
これにて終了。。。終わって良かった。。。
#う~。マウスを操作していて、腕がつった。。。
2009年05月17日 07:54 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
”ISE11.1iのチュートリアル6(デザインのインプリメント)” の続き。
インプリメント編はだいぶあっさり立ったような気がするが、一応初心者のためのチュートリアルという設定なので、この辺で良いだろうと思う。
次は、FPGAのJTAGからのコンフィギュレーションだ。それでは始めよう。
これからは、Spartan3 Starter Kitをダウンロードケーブルでパーソナルコンピュータ(PC)に接続する。Spartan3 Starter Kitに付属のダウンロードケーブルはパラレル接続だが、私のPCには、パラレルポートがないので、USB接続のダウンロードケーブルを使用した。これは、トラ技2009年6月号別冊の写真に載っている。
さて、Project NavigatorのProcessesペイン内のConfigure Target Device を展開し、Manage Configuration Project(iMPACT) をダブルクリックする。
そうしたらISE iMPACTが単独で立ち上がった。また、単独で上がるようになったんですね。。。びっくり。統合されていると思っていた。
iMPACT FlowsペインからBoundary Scan をダブルクリックする。
Initialize Chain アイコンをクリックする。
いろいろなダイアログが出て、Auto Assign Configuration Files Query Dialog が開く。ここでは.bit ファイルを割り当てる必要があるので、Yesボタンをクリックする。
Assign New Configuration File ダイアログが開く。xc3s200 が選択され、緑色になっている。dice_top.bit を選択してOpen ボタンをクリックする。
次は、xcf02s が選択されているはず。まだこのFLASH ROMに書くデータは生成していないので、Cancel All ボタンをクリックした。
Device Programming Properties - Device 1 Programming Properties ダイアログが開くので、OKボタンをクリックする。
iMPACT ProcessesペインのAvailable Operations are: のProgram をダブルクリックする。
FPGAのコンフィギュレーションが成功すれば、Program Succeeded が表示される。これでFPGAをコンフィギュレーションできた。
これで、FPGAが動作するようになった。最初はAN0の7セグメントLEDに1が表示されている。BTN0を押すと、サイコロが振られて、離すとサイコロの目が確定する。
”ISE11.1iのチュートリアル8(Platform Flash PROMへの書きこみ)” に続く。
2009年05月16日 21:50 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
Xilinx Update があった。ISE11.1iのISE Japanese Documentation Updateでマニュアルが日本語になるようだ。とてもありがたい。
さっそくアップデートした。
ソフトウェアマニュアルもISEヘルプも日本語になりました。
2009年05月16日 05:57 |
Xilinx ISEについて
| トラックバック:0
| コメント:0
”ISE11.1iのチュートリアル5(シミュレーション)” の続き。
さて、今度はインプリメントをしてみよう。まずは、前回のシミュレーションで直したreject_chatter.vhdの修正を元に戻す。
constant frequency_KHz : integer := 50000; -- KHz単位でのクロック周波数(インプリメント用) --constant frequency_KHz : integer := 1; -- KHz単位でのクロック周波数(シミュレーション用)
上のように修正してセーブする。
Design のSources for: をImplementationに変更する。
今回は一気に.bitファイルの生成までやってしまおう。
Hierarchyペインでdice_topが選択されていることを確認する。ProcessesペインでGenerate Programming File をダブルクリックする。そうすると、Synthsize(論理合成)、Translate、MAP、Place & Route、Generate Programming File を一気に実行する。
オレンジの?が消えて、黄色の三角か緑のチェックマークがつく。エラーの場合は赤のXマークがつく。黄色の三角はウォーニングがある場合だ。これで、Generate Programming File までのプロセスが終了した。
Design Summaryを見るとAll Constrains Met になっているので、period制約も満たしたことが分かる。
次は、タイミングリポートを見てみよう。ProcessesペインのImplement Designを展開する。その中のPlace & Route を展開し、その中のGenerate Post-Place & Route Static Timingを展開すると、Analyze Post-Place & Route Static Timing があるので、それをダブルクリックする。
Timing Report Tipsダイアログが開く。OKボタンをクリックしてダイアログを閉じる。
タイミングリーポートが見えて、タイミング制約が満足していることが分かる。
せっかくなので、Place & Routeの出来上がりをPlanAhead で見てみよう。
同様に、Place & Route の下のAnalyze Timing / Floorplan Design (PlanAhead) をダブルクリックする。
PlanAheadが立ち上がる。
FPGA内部の様子が見える。ほとんどリソースを使っていないので、すかすか。
これでインプリメントは終了したので、次はいよいよFPGAをコンフィギュレーションしてみる。
”ISE11.1iのチュートリアル7(FPGAのコンフィギュレーション)” に続く。
2009年05月16日 05:38 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
ISE11.1iのチュートリアル4(テストベンチの作成) の続き。
前回テストベンチを作ったので、今度はシミュレーションをしてみよう。シミュレーターとしてはISimを使用する。
Project NavigatorのDesignのHierarchyペインからdice_top_tb を選択しする。ProcessesペインのISim Simulatorを展開して、Simlate Behavioral Model をダブルクリックする。
ISimが起動して、シミュレーションを行った。
Zoom to Full Viewアイコンをクリックして、波形全体を表示する。
入力波形は予定した波形になっている。しかし、出力波形はb_nとc_n が0で、ほかのセグメントは1である。この7セグメントLEDは0で点灯するので、現在は1を表示している。リセットはちゃんとかかっているが、rollスイッチを押しているのに出力が変化しない。
これは、reject_chatter.vhdでスイッチのチャタリングを除去するために、クロックの25万回に1回サンプルことになっている。さらに、目で遷移しているのが見えるようにするために、その4倍の100万回クロックを数えないとステートマシンのステートが変わらないためだ。これを解消するには、少なくとも20万クロック以上シミュレーションしないとならないが時間もディスクも使用するため、シミュレーションするのは大変だ。そのようなときのために、50MHzはKHz単位にすると50,000である。これをconstantで定義してい置いて、シミュレーションのときには1に切り替える。(もっと良いと自分では思っている方法がある。それはpragmaとgenericを使う方法だ。詳しくは
”スパルタン3スタータキットでのISE8.1iのチュートリアル4(シミュレーション編)” を見てほしい)
--constant frequency_KHz : integer := 50000; -- KHz単位でのクロック周波数(インプリメント用) constant frequency_KHz : integer := 1; -- KHz単位でのクロック周波数(シミュレーション用)
これで、もう一度シミュレーションを行う。とりあえずISimをクローズしよう。その際にDefault.wcfg をセーブするかと聞いてくるので、Noボタンをクリックしておく。
もう一度、Project NavigatorのDesignのHierarchyペインからdice_top_tb を選択しする。ProcessesペインのISim Simulatorを展開して、Simlate Behavioral Model をダブルクリックして、ISim を立ち上げる。そうすると、修正したconstant値が採用されて、セグメントの値が変化しているのが分かる。
下位モジュールの信号も見てみよう。
左のInstance and Process... ペインのdice_top_tb の左の三角をクリックして展開する。その後、uut の左の三角もクリックして展開する。その中のinst_reject_chatterをクリックする。そうすると、太字で表示される。Objectsペインを見るとinst_reject_chatterの信号を表示する。その中からsw_cntとroll_cnt を右の波形ウインドウのあいているところにドラック&ドロップする。そうすると波形ウインドウに追加される。
こうすると、下のように信号が追加されるが、波形はまだ表示されていない。
同様に、inst_dice_smのcurrent_stateを波形ウインドウに追加する。さて、この追加した信号もシミュレーションしてみよう。
SimulationメニューからRestartを選択する。
すべての波形が消える。SimulationメニューからRunを選択する。
そうすると、先ほど波形ウインドウに登録した信号も波形が表示される。
これでシミュレーションは一応完了。
私は、まだ、ISimの使い方が良く分かっていないので、チュートリアルなどをやってみようと思っている。感じとしては、なかなか使えそうな感じだ。たぶん下のConsoleにコマンドを入れても使えるのだろう。
#しかし、チュートリアルは前回もそうだったが、書いていると疲れる。。。皆さんのためになるのかな?
”ISE11.1iのチュートリアル6(デザインのインプリメント)” に続く。
2009年05月15日 04:53 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:4
”ISE11.1iのチュートリアル3(制約 (UCF) の作成)” の続き。
今回はシミュレーションの準備のためにテストベンチを作る。ISE10.1までは、テストベンチを生成するツールがついていて、それによって簡易的にテストベンチを作れたが、今回はテンプレートを見ながら自分で作れということなので、1回り面倒になってしまった。以前のツールをそのままにしたもらったほうが下位モジュールを簡易にシミュレーションしたいときには便利だったのだが。。。復活を望む。
それでは、シミュレーション用のテストベンチを作るところから始めよう。
Project NavigatorのDesignの下のSources for: でBehavioral Simulationを選択する。
ProjectメニューからNew Source...を選択する。
New Source WizardのSelect Source Typeダイアログが開く。VHDL Test Bench を選んでFile Name : にdice_top_tb と入力して、Next > ボタンをクリックする。
Associate Sourceダイアログが開く。どのVHDLファイルのテストベンチかを指定する。ここでは、一番トップのdice_topを選択し、Next > ボタンをクリックする。
Summaryダイアログが開く。Finishボタンをクリックする。
そうすると、左のDesign、Hierarchyペインにはdice_top_tb.vhdが階層の一番上に作られる。
そして、右のWorkspaceペインには、生成されたdice_top_tb.vhd が表示される。一番前のコメント分を除いて、生成されたコードを下に示す。
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY dice_top_tb IS END dice_top_tb; ARCHITECTURE behavior OF dice_top_tb IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT dice_top PORT( reset_sw : IN std_logic; clk : IN std_logic; roll : IN std_logic; an_n : OUT std_logic_vector(3 downto 0); a_n : OUT std_logic; b_n : OUT std_logic; c_n : OUT std_logic; d_n : OUT std_logic; e_n : OUT std_logic; f_n : OUT std_logic; g_n : OUT std_logic; dp_n : OUT std_logic ); END COMPONENT; --Inputs signal reset_sw : std_logic := '0'; signal clk : std_logic := '0'; signal roll : std_logic := '0'; --Outputs signal an_n : std_logic_vector(3 downto 0); signal a_n : std_logic; signal b_n : std_logic; signal c_n : std_logic; signal d_n : std_logic; signal e_n : std_logic; signal f_n : std_logic; signal g_n : std_logic; signal dp_n : std_logic; -- Clock period definitions constant clk_period : time := 1us; BEGIN -- Instantiate the Unit Under Test (UUT) uut: dice_top PORT MAP ( reset_sw => reset_sw, clk => clk, roll => roll, an_n => an_n, a_n => a_n, b_n => b_n, c_n => c_n, d_n => d_n, e_n => e_n, f_n => f_n, g_n => g_n, dp_n => dp_n ); -- Clock process definitions clk_process :process begin clk <= '0'; wait for clk_period/2; clk <= '1'; wait for clk_period/2; end process; -- Stimulus process stim_proc: process begin -- hold reset state for 100ms. wait for 100ms; wait for clk_period*10; -- insert stimulus here wait; end process; END;
かなりのコードがテンプレートとして用意される。これだと出力の検証を入れなければ、入力のスティミュラスを生成すればよいことになる。
そこで、以前このブログで紹介した
タイミングチャートお絵かきツールTimingAnalyzer のVHDLテストベンチ生成スクリプトを使おうと思ってやってみたのだが、うまくスクリプトが動作しなかった。トラブル解析は後ですることにして、自分で入力波形を書いてみることにする。
下の図のタイミングチャート通りに波形を入力することにした。
スティミュラスを書きこんで、上のタイミングチャート通りの波形を作る。下が書き換えた部分のスティミュラスプロセスだ。
-- Stimulus process stim_proc: process begin -- クロックは0から始まっているので、1クロック期間waitしても0から0までのwaitなので、レースが起こる心配はない。 reset_sw <= '1'; roll <= '0'; -- hold reset state for clk_period. wait for clk_period; reset_sw <= '0'; wait for clk_period; -- 1クロック期間空けてからrollを1にする roll <= '1'; wait for clk_period*42; -- 42クロック期間空けてrollを0に戻す roll <= '0'; wait; end process;
最後に75行目のclk_periodが1usになっているので、これを動作周波数50MHzの周期20nsに変更する。
-- Clock period definitions constant clk_period : time := 20ns;
テストベンチを作ってみて、かなりの部分をツールが書いてくれるので、だいぶ楽だった。惜しいのは、今回はだいぶ簡単なスティミュラスだったので良いのだが、複雑になってくると、waitを入れるのが大変なのでTimingAnalyzerでテストベンチを生成できると良いと思った。それともあきらめて
procedureを使って書く とかしたほうが良いかも?
”ISE11.1iのチュートリアル5(シミュレーション)” 続く。
2009年05月14日 05:38 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
”ISE11.1iのチュートリアル2(プロジェクトの作成)” の続き。
今回は制約ファイル(UCF)を作成しよう。PlanAheadを使用する。
最初にDesignペインの内のProcessesペインのUser Constrainsの+をクリックして展開する。そのうちのI/O Pin Planning (PlanAhead) - Pre-Synthesis をダブルクリックする。
ISE Project Navigatorのダイアログが開く。UCFをプロジェクトに追加するか聞いてくるので、Yeaボタンをクリックする。
Welcome to PlanAheadの説明ダイアログが開く。もう一度開くと面倒なので、下のAlways show this dialog on startupのチェックボックスをクリックして外す。Closeボタンンをクリックする。
PlanAheadが開く。下図に示す。
I/O Portsペインのan_n (4) とScalar ports (11) の前の+をクリックして展開する。a_n をPackageペインのE14パッドにドラック&ドロップする。
IOパッドを固定すると、PlanAheadにIOパッドの情報が表示される。
上の図のI/O PortsペインのI/O Std を見るとLVCMOS25と表示されている。これをLVCOMS3.3に変更する。(I/O電圧が3.3Vなので。。。本当はトラ技の原稿のほうも直さないと駄目ですね。動いていますが。。。)
左上のI/O Port Properties では、下のGeneralタブが現在、選択されているが、これをConfigureタブをクリックして切り替える。I/O Port Properties のI/O Standard をLVCMOS33に変更する。
I/O Standard をLVCMOS33に変更したので、この値をApplyボタンをクリックして、反映させる。
この作業を下のUCFに従って行う。全部のIOパッドを固定する。(このUCFがあればこの作業はいらないのだが、PlanAheadの使い方の練習である)
NET "a_n" LOC = "E14" ; NET "an_n<0>" LOC = "D14" ; NET "an_n<1>" LOC = "G14" ; NET "an_n<2>" LOC = "F14" ; NET "an_n<3>" LOC = "E13" ; NET "b_n" LOC = "G13" ; NET "c_n" LOC = "N15" ; NET "clk" LOC = "T9" ; NET "d_n" LOC = "P15" ; NET "dp_n" LOC = "P16" ; NET "e_n" LOC = "R16" ; NET "f_n" LOC = "F13" ; NET "g_n" LOC = "N16" ; NET "reset_sw" LOC = "L14" ; NET "roll" LOC = "M13" ;
作業が終了したら、FileメニューからSave Project...を選択して、プロジェクトをセーブする。
これでPlanAheadでのI/Oパッドの配置は終了なので、PlanAheadを閉じる。
Project Navigatorに戻るとDesignペインのHierarchyにdice_top.ucfが追加されている。下にdice_top.ucfの内容を示す。
NET "a_n" LOC = E14; NET "a_n" IOSTANDARD = LVCMOS33; NET "an_n[0]" LOC = D14; NET "an_n[0]" IOSTANDARD = LVCMOS33; NET "an_n[1]" LOC = G14; NET "an_n[1]" IOSTANDARD = LVCMOS33; NET "an_n[2]" LOC = F14; NET "an_n[2]" IOSTANDARD = LVCMOS33; NET "an_n[3]" LOC = E13; NET "an_n[3]" IOSTANDARD = LVCMOS33; NET "b_n" LOC = G13; NET "b_n" IOSTANDARD = LVCMOS33; NET "c_n" LOC = N15; NET "c_n" IOSTANDARD = LVCMOS33; NET "clk" LOC = T9; NET "clk" IOSTANDARD = LVCMOS33; NET "d_n" LOC = P15; NET "d_n" IOSTANDARD = LVCMOS33; NET "dp_n" LOC = P16; NET "dp_n" IOSTANDARD = LVCMOS33; NET "e_n" LOC = R16; NET "e_n" IOSTANDARD = LVCMOS33; NET "f_n" LOC = F13; NET "f_n" IOSTANDARD = LVCMOS33; NET "g_n" LOC = N16; NET "g_n" IOSTANDARD = LVCMOS33; NET "reset_sw" LOC = L14; NET "reset_sw" IOSTANDARD = LVCMOS33; NET "roll" LOC = M13; NET "roll" IOSTANDARD = LVCMOS33;
それでは、次にタイミングの制約をUCFファイルに加えよう。
DesignペインのProcessesのUser Constraintsを展開した先のCreate Timing Constrains をダブルクリックする。
論理合成が始まってエラーが出なければ、Timing Constraints画面が立ち上がる。
今回は、動作周波数のみ制約する。左真ん中のConstraint TypeからClock Domainsをダブルクリックする。
Clock Periodダイアログが立ち上がる。Spartan3 Starter Kitの水晶発振器は50MHzなので、周期としては20ns である。デフォルトが20ns であるので、そのままOKボタンをクリックする。
そうすると、クロック周期の制約がCreate Timing Constraits for Clock Domains (PERIOD)に表示される。Saveアイコンをクリックしてセーブし、Closeアイコンをクリックしてクローズする。
するとUCFにPERIOD制約が追加されている。
NET "clk" TNM_NET = clk; TIMESPEC TS_clk = PERIOD "clk" 20 ns HIGH 50%;
これで今回の制約ファイル(.ucf) の作成は終了した。必要であれば入力パッドにセットアップ時間、ホールド時間(正確にいえばデータの有効時間)の制約や、出力パッドにクロックエッジからの出力時間などの制約を加えることができる。結構、それらの制約が厳しければDCMを使用して、クロックのディレイをキャンセルすることをお勧めする。
”ISE11.1iのチュートリアル4(テストベンチの作成)” に続く。
2009年05月12日 05:16 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:0
ISE11.1iのチュートリアル1(導入編) の続き。
さて、Project Navigatorを立ち上げて、プロジェクトを作成しよう。
まずはISE11.1iのProject Navigatorを立ち上げる。FileメニューからNew Project...を選択する。
New Project Wizardが開く。Locationを選択して、Nameにプロジェクト名を入力する。ここではdiceと入力し、Next >ボタンをクリックする。
次にDevice Propertiesを選択するダイアログになる。FamilyをSpartan3、DeviceをXC3S200、PackageをFT256、Speedを-4、Simulatorを今回はISim(でやってみたいので)、Preferred LanguageをVHDLに変更する。設定できたら同様にNext >ボタンをクリックする。
Create New Sourcesのダイアログに切り替わる。ここではdice_top.vhdだけ作ってみよう。New Source...ボタンをクリックする。
Select Source Typeダイアログが開く。左のペインからVHDL Moduleを選択して、File Name: にdice_top.vhd を入力する。Add to projectにチェックが入っていることを確認する。Next >ボタンをクリックする。
Define Moduleダイアログが開く。Architecture nameをRTL(これは何でもよいのだが)に変更する。Protを入力しよう。”
ISE11.1iのチュートリアル1(導入編) ”のdice_top.vhdのport宣言を見ながら入力する。an_nはBusなので、Busにチェックを入れる。MSBに3をLSBに0を入れる。後は順次ポートを入力する。結果が下の図、入力が終了したら、Next >ボタンをクリックする。
Summaryダイアログが出るので、Finishをクリックする。
Create New Sourceダイアログにdice_top.vhdが入力されていると思う。ここで、複数のファイルを作る際にはもう一度New Source...ボタンをクリックすればよいのだが、後で作ることにするので、Next>ボタンをクリックする。
Add Existing Sourcesダイアログが開く。現在のプロジェクトではすでに出来ているVHDLファイルはないので、Next>ボタンをクリックする。
Project Summaryダイアログが表示される。Finishボタンをクリックする。
diceプロジェクトが出来て、dice_top.vhdがプロジェクトに追加されていると思う。
左のDesignペインのHierarchyのdice_topをダブルクリックすると、右のWorkspaceペインにVHDLソースが表示される。ポート宣言が出来ている。
ここで、
ISE11.1iのチュートリアル1(導入編) のdice_top.vhdを見ながら入力するか、もしくはコピー&ペーストで入力します。全部入力できたら、Saveアイコンをクリックしてセーブする。
さて、続いてreject_chatter.vhdを作ろう。New Sourceアイコンをクリックする。
Select Source Typeダイアログが開く。左のペインからVHDL Moduleを選択して、File Name: にreject_chatter を入力する。Add to projectにチェックが入っていることを確認する。Next >ボタンをクリックする。
Define Moduleダイアログが開く。今回は何も変更しないで、Next >ボタンをクリックする。
Summaryダイアログが出るので、Finishをクリックする。
そうするとreject_chatterが出来て、dice_topの下に入っているのが見える。
今回はreject_chatter.vhd全部を
ISE11.1iのチュートリアル1(導入編) に書いてあるVHDLソースで置き換えてしまうことにする。置き換えが終了したら、Saveアイコンをクリックする。
これをdice_state_machine.vhdとseven_seg_dec.vhdについて行う。
全部終了すると、DesignペインのHierarchyにすべてのファイルが表示されているはず。。。
”ISE11.1iのチュートリアル3(制約 (UCF) の作成)” へ続く。
2009年05月10日 06:03 |
FPGAリテラシー及びチュートリアル
| トラックバック:0
| コメント:2
今回、ご縁があって
トランジスタ技術2009年6月号 の別冊付録”再確認!電子機器の開発ツール”の第4章4-1”高機能なディジタル回路を実現するFPGAの開発方法”と4-2”大規模ロジック回路を高速にシミュレーションするには”という題で書かせていただいた。
ここでは、FPGAはどんなものかということや、ISE10.1サービスパック3の使い方を書かせていただいた。今現在では、ISE11.1iが出ている。新しいISEでもう一度書いてみようと思い、ISE11.1iでチュートリアルを書き直すことにした。今回は都合によりVHDLを使用することにする。
最初にISE11.1iのダウンロード方法だが、
Xilinxのダウンロードサイト からダウンロードしてほしい。やり方はだいたいわかると思うが、Product Download and Licensingのページで、State/ProvinceでSelect Oneがハイドされていると思うが、隣の四角にはNAを入れておかないとダウンロードができないようなので、注意が必要だ。Webインストールを選択しないで、全部をダウンロードすると、Xilinx_11.1_WebPack_SFD.tarがダウンロードできる。tarで固まっているので、何で解凍するか迷ったが、都合良くCygwinがインストールされていたので、これで解凍し、インストールした。なお、全部で2.67GBあるので、ネットの回線が細い方はDVDを頼んだほうが良いと思う。
ModelSim Xilinx Edition-IIIもダウンロードし、インストールする。その時にStarterバージョンを選ぶこと。やり方はかなり古いけど、
この辺を参照 。
チュートリアルの回路はトラ技の付録に書いたのと一緒のサイコロ回路で、Spartan3 Starter Kitを使用する。やはり、簡単な回路は7セグメントLEDが良い。回路の説明が少なくてツールのやり方に専念できるので。。。
回路は下の図のように、電子サイコロのトップと、チャタリング除去回路、サイコロ・ステートマシン、7セグメントLED表示回路に分けられている。この詳しい解説はトラ技の方を読んでもらうことにする。
まずは電子サイコロトップ(dice_top.vhd)を説明する。これは各下位モジュールをつなげているだけだ。Spartan3 Starter Kitの4つの7セグメントLEDはダイナミック点灯なので、ダイナミック点灯回路を追加する必要があるが、ここでは右はじの1つのLEDのみ使用するので、an_n出力をAN0のみ点灯するように固定値として代用している。(
ダイナミック点灯回路についてはこちらを参照 )
roll入力はサイコロを振る動作をおこなうためのスイッチの入力でSpartan3 Starter KitのBTN0に割り当てる予定だ。
-- 電子サイコロ (dice_top.vhd) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity dice_top is port( reset_sw : in std_logic; clk : in std_logic; roll : in std_logic; an_n : out std_logic_vector(3 downto 0); a_n : out std_logic; b_n : out std_logic; c_n : out std_logic; d_n : out std_logic; e_n : out std_logic; f_n : out std_logic; g_n : out std_logic; dp_n : out std_logic ); end dice_top; architecture RTL of dice_top is component reject_chatter port( reset_sw : in std_logic; clk : in std_logic; roll : in std_logic; roll_sig : out std_logic; roll_ena : out std_logic ); end component; component dice_state_machine port( reset_sw : in std_logic; clk : in std_logic; roll: in std_logic; roll_ena : in std_logic; spots : out std_logic_vector(2 downto 0) ); end component; component seven_seg_dec port( binary : in std_logic_vector(2 downto 0); a_n : out std_logic; b_n : out std_logic; c_n : out std_logic; d_n : out std_logic; e_n : out std_logic; f_n : out std_logic; g_n : out std_logic ); end component; signal roll_sig : std_logic; signal roll_ena : std_logic; signal binary : std_logic_vector(2 downto 0); begin an_n <= "1110"; -- AN0のみ点灯 dp_n <= '1'; -- ドットの消灯 inst_reject_chatter : reject_chatter port map( reset_sw => reset_sw, clk => clk, roll => roll, roll_sig => roll_sig, roll_ena => roll_ena ); inst_dice_sm : dice_state_machine port map( reset_sw => reset_sw, clk => clk, roll => roll_sig, roll_ena => roll_ena, spots => binary ); inst_seven_seg_dec : seven_seg_dec port map( binary => binary, a_n => a_n, b_n => b_n, c_n => c_n, d_n => d_n, e_n => e_n, f_n => f_n, g_n => g_n ); end RTL;
次にチャタリング除去回路の説明をする。スイッチにはチャタリングがある。スイッチには接点があって、スイッチを動かすという動作は、動く接点と止まっている接点をぶつけるようなものだ。つまり言ってみれば、勢いよく動く接点が止まっている接点にぶつかって、何度か跳ね返る現象だ。約数100us~数msくらいの間、接点の出力波形が乱れる。これはスイッチよっても違うし、ON、OFFによっても異なる。
詳しい波形などはこちらを参照 。
このチャタリング除去回路では5ms間隔でrollの値(BTN0スイッチの値)をサンプルしてチャタリングを除去している(roll_sig)。本当はrollを一度、clkで同期化したほうが良かったと思うが、これで動作しているので良しとする。
さらに電子サイコロとしては、あまりサイコロの目が変わる速度が速いと7セグメントLEDの表示が8に固定されて見えてしまうので、少しちらついて変わっているなと分かるほうが良い。そのため、目をかえるためのイネーブル信号(roll_ena) を20msごとに1クロック分だけ出力している。
さらに、シミュレーションをする場合に50MHzで50000分周するとシミュレーション時間がとても長くなる。シミュレーションのときは現在コメントアウトしているfrequency_KHzに変えてシミュレーションを行うことにする。そのためにfrequency_KHzをconstantで定義してあるのだ。とても待っていられないため。人間の操作はハードウェアの動作に比べてとても遅いため、マンーマシンインターフェースをシミュレーションするのは時間とリソースがかかる。そのために楽にできるように工夫が必要となる。
-- スイッチのチャタリング除去とサイコロの表示変更タイミング20msをカウントする -- reject_chatter.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity reject_chatter is port( reset_sw : in std_logic; clk : in std_logic; roll : in std_logic; roll_sig : out std_logic; roll_ena : out std_logic ); end reject_chatter; architecture RTL of reject_chatter is constant frequency_KHz : integer := 50000; -- KHz単位でのクロック周波数(インプリメント用) -- constant frequency_KHz : integer := 1; -- KHz単位でのクロック周波数(シミュレーション用) constant divided_200Hz : integer := frequency_KHz * 5; -- 200Hzに分周するための分周比 signal sw_cnt : std_logic_vector(17 downto 0); signal roll_cnt : std_logic_vector(1 downto 0); signal roll_node : std_logic; begin -- 200Hz, 5ms process(reset_sw, clk) begin if reset_sw='1' then sw_cnt <= (others => '0'); elsif clk'event and clk='1' then if sw_cnt=(divided_200Hz-1) then sw_cnt <= (others => '0'); else sw_cnt <= sw_cnt + 1; end if; end if; end process; process(reset_sw, clk) begin if reset_sw='1' then roll_node <= '0'; elsif clk'event and clk='1' then if sw_cnt=(divided_200Hz-1) then roll_node <= roll; end if; end if; end process; roll_sig <= roll_node; -- 50Hz, 20ms process(reset_sw, clk) begin if reset_sw='1' then roll_cnt <= "00"; roll_ena <= '0'; elsif clk'event and clk='1' then if sw_cnt=(divided_200Hz-1) then if roll_cnt="11" then roll_cnt <= "00"; roll_ena <= '1'; else roll_cnt <= roll_cnt + 1; roll_ena <= '0'; end if; else roll_ena <= '0'; end if; end if; end process; end RTL;
次にサイコロ・ステートマシン(dice_state_machine.vhd)だが、これはBTN0スイッチが押されている間(roll=1) のとき、roll_ena=1のタイミングで1~6の状態を遷移するステートマシンだ。
-- 1から6までのサイコロの目を表すステートマシン -- dice_state_machine.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity dice_state_machine is port( reset_sw : in std_logic; clk : in std_logic; roll: in std_logic; roll_ena : in std_logic; spots : out std_logic_vector(2 downto 0) ); end dice_state_machine; architecture RTL of dice_state_machine is type STATE is (st_one, st_two, st_three, st_four, st_five, st_six); signal current_state, next_state : STATE; begin process(reset_sw, clk) begin if reset_sw = '1' then current_state <= st_one; elsif clk'event and clk='1' then current_state <= next_state; end if; end process; process(current_state, roll, roll_ena) begin case current_state is when st_one => spots <= "001"; if roll='1' and roll_ena='1' then next_state <= st_two; else next_state <= st_one; end if; when st_two => spots <= "010"; if roll='1' and roll_ena='1' then next_state <= st_three; else next_state <= st_two; end if; when st_three => spots <= "011"; if roll='1' and roll_ena='1' then next_state <= st_four; else next_state <= st_three; end if; when st_four => spots <= "100"; if roll='1' and roll_ena='1' then next_state <= st_five; else next_state <= st_four; end if; when st_five => spots <= "101"; if roll='1' and roll_ena='1' then next_state <= st_six; else next_state <= st_five; end if; when st_six => spots <= "110"; if roll='1' and roll_ena='1' then next_state <= st_one; else next_state <= st_six; end if; when others => spots <= "001"; next_state <= st_one; end case; end process; end RTL;
最後の7セグメントLED表示回路(seven_seg_dec.vhd) は、ステートマシンからのバイナリデータを7セグメントLEDのデータにデコードする回路だ。例えば7セグメントLEDにはセグメントが7つあり、例えば1はbセグメントとcセグメントを点灯させて、それ以外のセグメントは消灯させる。バイナリの1が来たら、そのように7セグメントLEDを点灯させるようにする。今回の回路では0で点灯、1で消灯となる。
-- 7セグメントLEDデコーダ、0で点灯します。 -- seven_seg_dec.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity seven_seg_dec is port( binary : in std_logic_vector(2 downto 0); a_n : out std_logic; b_n : out std_logic; c_n : out std_logic; d_n : out std_logic; e_n : out std_logic; f_n : out std_logic; g_n : out std_logic ); end seven_seg_dec; architecture RTL of seven_seg_dec is begin process(binary) begin case binary is when "001" => -- 1 a_n<='1'; b_n<='0'; c_n<='0'; d_n<='1'; e_n<='1'; f_n<='1'; g_n<='1'; when "010" => -- 2 a_n<='0'; b_n<='0'; c_n<='1'; d_n<='0'; e_n<='0'; f_n<='1'; g_n<='0'; when "011" => -- 3 a_n<='0'; b_n<='0'; c_n<='0'; d_n<='0'; e_n<='1'; f_n<='1'; g_n<='0'; when "100" => -- 4 a_n<='1'; b_n<='0'; c_n<='0'; d_n<='1'; e_n<='1'; f_n<='0'; g_n<='0'; when "101" => -- 5 a_n<='0'; b_n<='1'; c_n<='0'; d_n<='0'; e_n<='1'; f_n<='0'; g_n<='0'; when "110" => -- 6 a_n<='0'; b_n<='1'; c_n<='0'; d_n<='0'; e_n<='0'; f_n<='0'; g_n<='0'; when others => a_n<='1'; b_n<='0'; c_n<='0'; d_n<='1'; e_n<='1'; f_n<='1'; g_n<='1'; end case; end process; end RTL;
”ISE11.1iのチュートリアル2(プロジェクトの作成)” に続く。
2009/05/23 : 変更;
dice_state_machine.vからbram_mapのattributeを削除しました。
2009/06/18:変更;
Sim's blogさんで御指摘 があったように process(clk) begin にreset_swが抜けていました。正しくは process(reset_sw, clk) beginです。修正しました。なお、以前のVHDLコードでもXSTでウォーニングは出ますが、動作は問題ありません。XSTで自動的に非同期リセット付きフリップフロップに推定してくれます。実は同期FFにするつもりが間違っていました。非同期でも問題はありません。訂正いたします。
2009年05月09日 12:05 |
FPGAリテラシー及びチュートリアル
| トラックバック:1
| コメント:2
今までXilinx社のサイトにISE 11.1 Design Suiteの資料がなかったのだが、
今日見たらできていた 。日本語の資料を見ると、日付が4月27日だったので、できたてのほやほやなんだろう。
ISE11.1iを使ってみていると、今までと違っていることに気づく。例えば。
1.FloorplannerやPACEがアクセサリからもなくなった。 2.StateCADやテストベンチをGUIで作るツールもなくなっている。(予告されていたけど。。。)3.今のところ、Project NavigatorからISimを使う方法が分からない。
I
SE 11.1 Design Suiteの資料 も作りかけのようだし、これからおいおい勉強していくことにしようと思う。
ザイリンクス ISE Design Suite 11.1 ソフトウェア チュートリアル もComing Soonだし、もう少し資料が整うのを待つことにする。
Xilinxのサイトを検索したら、
ISE 11.1 - ザイリンクス アップデート(11.1 ISE 英語版資料) があった。
インストールしてみたのですが、下のダイアログが出てインストールできなかった。
WebPACKだとインストールできないんでしょうか?
2009/05/08 追記:
今見たら
ISE11.1の資料のページ にISimのチュートリアルが上がっていた。サンプルソースもあるので、家に帰ったらチュートリアルをやってみたい。
分かりました。申し訳ない。。。ISimはめったに使わないので、やり方を忘れていました。。。
Design PropertiesのSimulatorをISimに変更しないとだめでした。
これでシミュレーションをすることができました。
別のアプリケーションとして実行されるようです。なかなか良さそうかもしれませんね。DDR2 SDRAMコントローラでやっているように、インプリとは違うシミュレーション用のインクルードファイルを使うためには単体で立ち上げたほうが良さそうです。
2009年05月07日 21:18 |
Xilinx ISEについて
| トラックバック:0
| コメント:0
FPGAの部屋のまとめサイト を更新しました。
”Spartan3A Stater Kit”、”FPGAのトラブル”、”Floorplan Editorについて”、”その他のFPGA用ツールについて”の項目を追加しました。
その他の項目も今までの内容を追加しました。ご利用ください。
2009年05月05日 11:15 |
その他のFPGAの話題
| トラックバック:0
| コメント:2
今日は奥さんと下の娘とサイクリングに行ってきた。
前回は小貝川の西の土手を南に行った が、今回は北に行って、
小貝川ふれあい公園 に行ってきた。この時期は
ポピー祭り (たぶんまだ早いと思う。たぶん5月20日頃)があると思う。土手を北に3人でサイクリングに出発。今日も曇り気味だが、この方が暑くなくサイクリング日和。楽しくサイクリングができた。
だいたい30分くらいで小貝川ふれあい公園に到着。今年は?いろいろな花が植わっているようだ。やはり、去年の禁制品のケシ事件以来ポピーは縮小傾向か?ポピーやほかの花も見ごろはまだのようだ。
お昼までに家に戻るために、みんなでアイスを食べてから、早々に帰途につく。
お昼からはショッピングセンターのイイアスでお買い物。ゴールデンウィークは近場で済ませる予定。
そういえば、soc-lm32のプロジェクトでISE11.1とISE10.1の比較をしたが、プロジェクトを久しぶりに見てみた。これをもう少し発展させて、VGAコントローラやキーボードコントローラをつけるのも面白そうかな?プロジェクトを配布できればいいんだけど?soc-lm32は配布しても大丈夫かな?
ISE11.1がだいぶ変わっているようなので、ISE11.1でのチュートリアルも書きたくなってきた。今度のチュートリアルの対象のボードは何が良いかな?Spartan3 Starter Kit?Spartan3E Starter Kit?Spartan3A Starter Kit?
2009年05月04日 17:06 |
日記
| トラックバック:0
| コメント:0
家の石油給湯機からぽたぽた水が漏れていたので、修理を頼んだら、熱交換機から漏れているそうである。家の石油給湯器は15年前に買ったノーリツ製のOTQ-3101AYだ。もう古くて交換部品がなく修理ができないそうだ。この際に、石油の価格は不安定だし、石油を補充するのが面倒なので、エコキュートか電気温水器にしようとおもったのだが、井戸水だとだめだそうだ。残念。。。
ホームセンターで値段を聞いて来たら、ノーリツの石油給湯器は定価の半額だそうだ。そんなに価格が下がるんですか?定価はあってないようなもの?その他取り付け費用とかがあるけど、思ったよりお金はかからないようだ。
午後からは奥さんが仕事で、下の娘がどこにも行けないでかわいそうなので、下妻のジャスコへお買い物。そういえば、私のスニーカーがぼろぼろなので、この機会に購入した。
ふうりん堂という昔懐かしい駄菓子がたくさん売っているお店があったので、串かすてらや赤いスモモ、串に刺したイカなどを購入した。でも、昔懐かしいものは少ないような。(糸引き飴や棒ゼリーがない)現代風の駄菓子屋ですね。
(串カステラと串イカです。スモモは食べられた後でした)
2009年05月03日 19:12 |
日記
| トラックバック:0
| コメント:3
Mico32のプロジェクトでISE11.1iとISE10.1 SP3の比較をしてみた。
Mico32のプロジェクトは、本来は50MHzの動作なのだが、どのくらいの余裕があるかをみるために、クロック周期の制約を15ns、つまり66.7MHzにしてみた。
ISE11.1iとISE10.1のサマリを並べてみたのが下の図。
これでDesign StrategyはDefaultの状態。ISE11.1のほうがNumber of Slice Flig FlopsとNumber of 4 input LUTsが少し少ない。逆にNumber of occupied SlicesはISE11.1のほうが多い。タイミング制約のエラーが出ている。
次に双方のTiming Analyzerの結果を下の図に示す。
ISE11.1のData Path Delayは7.5nsの制約のところ、(ここはDDR SDRAMのコントローラなので、入力クロックの2倍で動作している)9.044nsでLevels of Logic = 6だが、ISE10.1はData Path Delayは10.375nsでevels of Logic = 7となっている。DefaultではISE11.1のほうが少しいいのかな?
次にISEの設定を可能な限りがんばるように設定を変えてみるXSTプロパティのEffortをHigh、MAPのOptimization StrategyをSpeed、Place & RouteのPlace & Route Effort Level をHigh、Extra EffortをContinue on Impossibleに変更した。言ってみれば、がんばる設定にして、もう一度、双方とも論理合成、インプリメントをしてみた。下が結果。
ISE11.1は、Defaultの結果とは、Number of 4 input LUTsが3個多くなっているほかは変化がない。ISE10.1も微妙な増え方で、がんばる設定にしても、それほどロジックが増えない感じ。
Timingはどうなのか?気になるのでTiming Analyzerの比較を下のの図に示す。
ISE11.1は-1.551nsが-1.276nsになって改善されている。クリティカルパスは変化している。やはりDDR SDRAMコントローラ部分のクロックの立下りを使ったFFから立ち上がりを使ったFFまでなので、制約は3.75nsだった。ISE10.1は10.375nsから9.425nsに改善された。
このプロジェクトに関してはISE11.1のほうが若干ではあるが性能が良いような気もするが微妙か?
とりあえず、がんばる設定にしたほうが若干、性能が良くなることが分かった。(ランタイムは長くなる)
#でも性能が良くなっていかどうかは微妙化も?ISE11.1では、若干クリティカルパスは短くなっているが3.75nsに対する割合で言ったら割合が大きくなっているし、ケースバイケース?
そういえば、デュアルコアは良いですね。2つのISEを同時にインプリメントできます。そうするとCPU使用率は100%になって、CPUファンも高速に回っているみたいですが。。。こんなときにデュアルコアが効いてきますね。
2009年05月03日 07:56 |
Xilinx ISEについて
| トラックバック:0
| コメント:0
Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュールを公開しようと思う。
まだ、IO部分のREADのタイミングを見るためのスケルトンモデルで何の役にも立ちそうにないけど、なんかのお役にたてればと思う。
いつものように、なにかあっても責任はもちませんということで。。。再配布は禁止としているんだけど、ご自分の責任でということにしようと思う。私のコードがどこぞの特許を侵害しているとか?検証したことはないので、ご自分の責任でお願いしたい。
Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュールをここに置いておく。 DDR2_cont_testフォルダをあけると下の図のようになっている。
VerilogソースファイルはSourcesフォルダに入っている。SimulationフォルダにはVeritakのプロジェクト(ddr2_sdram_cont_test.vtakprj)、ModelSimのプロジェクト(ddr2_sdram_cont_test.mpf)が入っている。
ISE10.1 SP3のプロジェクトはDDR2_cont_test.iseだ。起動して、Timing Analyzerの結果を見てほしい。
2009年05月01日 20:00 |
Spartan3A Starter Kit
| トラックバック:0
| コメント:2