”AKI-H8/3069FフラッシュマイコンLANボードでRedBoot起動” でRedBootは起動したが、Ubuntuでtftpd を起動してもネットワーク経由でelf ファイルをダウンロードすることが出来なかった。もう一度、環境を書くと、Windows XPを起動しているパソコン上にVMware Server を入れて、その上でUbuntu 8.04を動かしている。それで動かなかったので、同じVMware上のCentOS5.2でtftpd をインストールしてRedBootからネットワーク経由でelf ファイルをダウンロードすることが出来るか確かめてみた。
”[Linux]CentOSで手動で固定IPアドレスの設定を行う” というブログを検索して見つけたので、これを参考にしながら、まずはIPアドレスを固定することにした。
まずは/etc/sysconfig/network-scripts/ifcfg-eth0 を編集して、DHCPから固定アドレスに変更した。
これで/sbin/service network restart を実行してネットワークをリスタート。
/sbin/ifconfig -a で見てみたらちゃんと固定IPアドレスが設定されていた。
これでH8のRedBootのプロンプトからlcd_clock.elf をload してみたところ、やはりだめ。
どうしようかと思ったが、そういえばWindows 用のtftpd はないのかと探したところ、Vectorで
TFTPサーバプログラム TFTPD を発見。これをWindowsにインストールしてみることにした。
インストールし、tftpbootフォルダを作って、そこにlcd_clock.elf を置いた。H8ボードのRedBootプロンプトからload lcd_clock.elf を実行したがだめだった。(RedBootにはサーバーアドレスをWindowsに設定済み)
今度は
”RedBootについて” を見てloadコマンドのオプションを検索して、-h のホストオプションを見つけた。これで直接WindowsのIPアドレスを指定してやってみた。
load -h 192.168.3.3 lcd_clock.elf
そうしたら、やっとload できました。うれしい。。。すかさずgo するが、LCDに表示されない。
エーなんででしょう。そういえばこの前もLED付かなかったし。。。
回路図を見るともしかして、LCD-LED-DIPヘッダの1-2, 3-4 .... 23-24 とショートしないとLCDやLED、DIP SWがH8につながらない。。。それで設定ピンがいっぱい余っていたのか?
下の写真で黄色く囲ったヘッダに設定ピンが刺さっていない。
この設定ピンをすべて刺したらLCDがカウントした。
やっとうまく行きました。良かった。
結局、VMwareのLinuxからはtftpd でファイルをダウンロードできなかった。やはり何か設定がいるのだろうか?まあ、とりあえずこれでUbuntuでコンパイルしてSambaでWindows に持ってきて、H8ボードのRedBootでロードして起動という流れが出来た。
2009年01月31日 22:13 |
マイコン関連
| トラックバック:0
| コメント:4
”ModelSimでタイミング・シミュレーション(Post-Routeシミュレーション)1” の続き
以前は
Transcriptウインドウにコマンドでvsimコマンドを入れて シミュレーションしていたが、今回はGUIでやってみようと思う。
さて、シミュレーションをするためにSimulateメニューからStart Simulation...を選択。
ダイアログが開くので、テストベンチ(DDRtest_tb) を選択。さらにglbl.v をインスタンシエーションするために、Design Unit(s) のwork.DDRtest_tb の脇にwork.glbl を自分で入力する。
次にLibraries タブをクリックしてSearch Libraries (-L) にsimprims_ver が入っていることを確認。simprims はタイミング・シミュレーション用のライブラリだ。論理シミュレーションだとunisim (この場合はVerilogのシミュレーションなのでunisim_ver) を替わりに入れる必要がある。
次に遅延情報が書いてあるSDFファイルを設定しよう。SDFタブをクリックし、そこのAdd... ボタンをクリックする。
ADD SDF Entryダイアログが開くので、Brows... ボタンを選んで、SDFファイルを選択して、Apply to Reasion にはSDFファイルと組になっているVerilogファイルのモジュールのインスタンス階層及びインスタンス名を入れる。つまり下のリストだったら /DDRtest_inst を入力する。
DDRtest DDRtest_inst( .clk(clk), .reset(reset), .led(led), .sd_a(ddr_address),
これでOKボタンをクリックすると、Start Simulation ダイアログにSDFファイルがセットされる。
これでOKをクリックすると、シミュレーションの準備完了。デザインがロードされるので、viewメニューからwaveを選択して、wave ウインドウを出して、見たい信号をwaveウインドウに追加する。そして、SimulateメニューからRun -> Run -All すればシミュレーション波形を見ることが出来る。私のマシンで、DDR SDRAMコントローラを250us シミュレーションするのに、約60分くらいかかってしまった。
下の図でピンクの四角で囲ったIDDR2レジスタのセットアップエラーも出てしまった。エラーの部分にはwaveウインドウの一番上に下向き赤三角が付くようだ。これは、SDRAMにWRITEしている時に入力のDDR FFがセットアップエラーを起こしているようだ。それならば問題ない。
2番目のカーソルからはなぜか出力がXになってしまっている。これはこれからトラブルシュートする予定だ。
2009年01月31日 13:52 |
シミュレーション
| トラックバック:0
| コメント:0
今までは、Post-Routeシミュレーション(タイミング・シミュレーション)をしたことがなかったが、ある目的でModelSim XE3 Starterでやってみることにした。シミュレーションは論理シミュレーションをしてTiming Analyzerで静的にタイミングを確認していたし、面倒で不定値になることがある遅延シミュレーションをしなくても動作していた。それにModelSim Starter で遅延シミュレーションをすると簡単に1万行の制限を越えて極端に遅くなってしまう。
とりあえずテストベンチがすでにあるDDR SDRAMコントローラのバーストテスト でやってみることにする。
まずはISEからやる方法はというと、Project NavigaterのSourceウインドウのSource for : でPost-Route Simulationを選択する。
Sourceウインドウにテストベンチ(DDRtest_tb) が表示されるので、これをクリックする。下のProcesses ウインドウにSimulate Post-Place & Route Model が表示されるのでそれをダブルクックする。これでタイミング・シミュレーションが出来るはず。
これでよいのだが、今回はModelSim単体で遅延シミュレーションをすることにした。Implement Design -> Place & Route の下にあるGenerate Post-Route Simukation Model をダブルクリックして、Post-Route Simukation Model を生成する。
そうするとISEのプロジェクトがあるフォルダのnetgen\par フォルダにDDRtest_timesim.v とddrtest_timesim.sdf が生成される。
これをModelSimのプロジェクトを作成したフォルダにコピーする。
DDRtest_timesim.v にddrtest_timesim.sdf へのパスを書いてある部分を修正する。
initial $sdf_annotate("netgen/par/ddrtest_timesim.sdf");
があるので、パスの部分を消去する。
initial $sdf_annotate("ddrtest_timesim.sdf");
DDRtest_timesim.v とglbl.v, DDRtest_tb.v, ddr.v をAdd to Project -> Existing File... でプロジェクトに加える。
ちなみにglbl.v はXilinxのunisim_ver, simprims_verなどのライブラリに入っているプリミティブをシミュレーションするときに必要なファイルだ。glbl.v は、プリミティブのグローバル セット/リセット信号とグローバル トライステート信号を接続する。詳しくは
”6537 - シミュレーション、UniSim、SimPrim - Verilog シミュレーションで glbl.v モジュールを使用する方法 ” を参照のこと。
DDRtest_tb.v はテストベンチ。ddr.v はマイクロン社のDDR SDRAMモデル。
これで役者がそろったのでタイミング・シミュレーションをすることが出来る。
”ModelSimでタイミング・シミュレーション(Post-Routeシミュレーション)2” に続く
2009年01月30日 20:53 |
シミュレーション
| トラックバック:0
| コメント:2
今日、
Interface2009年3月号 を購入した。今月の特集は”はじめてのマイコン活用基礎の基礎”だった。真空管、トランジスタ、TTL(といってもHCなのでCMOS)から書いてあって、本当に基礎の基礎からのようだった。この辺は読んでいないが、なひたふさんの
”徹底解説作ればわかるPCI Express(第3回) 100MHzを超える信号を扱うロジックのFPGAへの実装法” は興味深く読ませてもらった。
Xilinx社のFPGAでまともなインターフェース回路を作るためのエッセンスが詰まっていると思う。特にDCMのDESKEW_ADJUST属性の違いはなんだろうと思っていても、検証したことがなかったので、興味深く読ませていただいた。
VALID制約は、私のブログの
”VALID制約” で書いたことがある。
最後にtxclk とそのtxclkでサンプルされるべきデータ(txdata) の制約だが、OFFSET_OUT_AFTERで制約をかけても、worst caseは制約できるのだが、best case は制約できない。よって、制約上でtxdataとtxclkの差が2nsあっても、txclkがもしかしたら2ns速い事もあって、その場合は制約違反にならないんじゃないか?と思う。だから私は、クロックとデータの遅延の値はTiming Analyzerで確認することにしている。クロックもデータも大体IOBにマップしてあるので、一度確認しておけば変動はほとんどないが。。。これは、IOBのDDRレジスタで出力するクロックとデータの相対的なタイミング関係を制約に書ければよいと思っていた。調べてみたのだが、調べた限りではそういう制約はないようだ。
後、180度位相のクロックの件だが、スライスにはクロックのインバータが用意されているので、180度位相のクロックが必要な場合は、私はそれを使うようにしている。クロックバッファももったいないし、スキューも少ないだろうと思うので。。。
いろいろ書いてしまったが、なひたふさんの記事は良くまとまっている、とてもよい記事だと思う。
2009年01月29日 21:15 |
その他のFPGAの話題
| トラックバック:0
| コメント:2
Notepad++ の?メニューからUpdate Notepadd++ を選んでアップデートがなかったので、ずっとNoptepad++のアップデートがないと思っていたのだが、久しぶりに
Veritakのページ を見に行ったら、NPP++プラグインUNICODE用をリリースしたというお知らせを見た。そこにはNPP++ 5.1からUNICODEに対応していると書いてある。なに?NPP++ 5.1 ということは、私が使っているのはNPP++ 5.03 なのでアップデートがあるということ???
実際に、
NPP++のページ を見に行ったらバージョン5.1.4があった。そうか5.0 から5.1にあがる時には?メニューからUpdate Notepadd++ を選んでアップデートを確認しても表示されないんだと思った。早速ダウンロードしてインストールした。
VeritakのNPP++プラグインUNICODE用 もダウンロードしてインストールした。
インストールして試してみると、以前の
”2ペインで編集しているのだが、その状態で文字列を選択すると、Netepad++のCPU負荷が50%(つまり1つのCPUを占有)してしまう” というバグ?も解消しているようだ。アップデートした甲斐があった。
今日は、一応、職場に行ったのですが、体調がいまいちなのと、周りの人にうつしてはまずいということで、帰宅。。。ということになり、結局、休暇となりました。
2009年01月28日 13:35 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
”ModelSim XEⅢ Starterでシミュレーションできない” でC:ドライブがUSBカードリーダーでハードディスクがH:になっている私のパソコンでModelSim XEⅢ Starterでシミュレーション出来なくて悩んでいたが、検索の結果、
Gan's blog さん の
”ModelSim Xilinx Edition (MXE) Starterではまる” を見つけた。これはなんと、私がコメントしていたブログだった。てっきり忘れていた。
それによると、ライセンス申請用リンクのドライブシリアル番号パラメータ"&ds=????????" を抜いたURLをアクセスするとドライブシリアル番号とイーサネットアドレスを選べて、イーサネットアドレスを選ぶとライセンスが通るというものだった。
私の環境(Firefox3) ではライセンス申請用リンクをクリックすると余計なリンクが開いてしまうので、ModelSimのインストールフォルダにあるlic_request.txtに書いてあるリンクを切り張りして使用したが、問題なくイーサネットアドレスでライセンスを取得することが出来た。
これで問題なくModelSim XEⅢ Starterでシミュレーションすることが出来るようになった。良かった。。。
これでCドライブ用にと買ったMicroSDが無駄になったようだが、Gloogle Chromeを起動すのには使えるかも?やはりC:がハードディスクでないといろいろ不具合がある。
2009年01月27日 17:29 |
シミュレーション
| トラックバック:0
| コメント:2
どうも昨日の夜から調子が悪い。咳が出るし、体が重い。風邪を引いてしまったようだ。今の体温は37.4度C、もう寝ます。
H8ボードの方はUbuntuのtftpdの動作で手間取っている。どうも動作しないので、H8ボードのRedBootからロードできない。DHCPで動的アドレスにしているのがいけないのか、でもifconfig でみて、そのIPアドレスをRedBootに設定すればいけるはずだよな?
最初はtftpd をやってみたがだめなので、tftpd-hpa も試してみたがだめだった。風邪が良くなってから考えることにする。
2009/1/26 : 追記
なかなか直らないので、医者に行ってきましたが、インフルエンザA型だそうです。リレンザをもらってきました。明日も休み確定です。
2009/1/27 : 追記
リレンザ効きました。26日の夕方、吸引して夜には、熱が下がりました。まだ、体が本調子ではありませんが、明日は仕事にいけそうです。FPGA掲示板の方でもぼけてしまいました。元からぼけていますが。。。そのためにブログ書いています。
2009年01月24日 20:21 |
日記
| トラックバック:0
| コメント:3
AKI-H8/3069FフラッシュマイコンLANボードでRedBoot起動した。
h8write.exeの使い方が間違っていて最初悩んだが、f20オプションに- が付いてないのを見つけて解消。私のパソコンはCOMポートがないので、USB-RS232C変換ケーブルを使っているので、COM4をオプションにつけたらOKだった。
最初はLEDのテストプログラムを動かすも動かない。もしかしてLEDのアノード、カソード逆につけた?超恥ずかしい。。。後でトラブルシュートすることにする。
次に、
『はじめる組込みLinux』サポートサイトのソースファイル のうちの2MBメモリ+フラッシュサポートRedBootを入れた。
TeraTermを38400bps, 8bit, parity none, 1stop bit で起動するとRedBootの起動画面が出た。
DHCPで振られたIPアドレスもちゃんと見えている。今度はそのIPアドレスにpingを打ってみた。
ちゃんと応答が帰ってきている。うれしい。
このところ、ずっと失敗続きだったので、バイナリを入れただけで成功するのがわかっているとはいえ嬉しい。。。やはり、たまには成功体験も必要だと思う。
2009年01月23日 05:44 |
マイコン関連
| トラックバック:0
| コメント:5
秋月電子のAKI-H8/3069FフラッシュマイコンLANボードのベースボードが完成した。たいしたハンダ付けはなかったが。。。
ソフトウェアをインストールして確かめてみたい。
2009年01月22日 06:25 |
マイコン関連
| トラックバック:0
| コメント:2
秋月電子のAKI-H8/3069FフラッシュマイコンLANボード が今日来ました。
中身のAKI-H8ボードはこれ。
いろいろやってみたい。uClinuxやTOPPERS。まずは動作確認か。。。
2009年01月20日 21:46 |
マイコン関連
| トラックバック:0
| コメント:3
今度はUbuntuでSuzaku-V SZ410-SILのアプリを開発してみようと、
atmark-dist-yyyymmdd.tar.gz と
inux-x.x.x-atx.tar.gz を
Suzaku 開発者サイト からダウンロードしてやってみた。
参考書は
SUZAKUスターターキットガイド(Linux開発編) [SUZAKU-V] だ。
最初にmake menuconfig をしてSuzaku-Vを選択してmake したところエラー。
どうやらbinutils のバージョンが合わないようだ。
そういえば、ガイドの18ページ、表3.2 SUZAKU-V用クロス開発環境パッケージ一覧のインストールをするのを忘れていた。powerpc用のbinutilsなどのパッケージをインストールする必要があったようだ。Suzaku-VのCDからインストールすることにする。
VMwareからCD-ROMをマウントして、dpkg -i *.deb ですべてのパッケージをインストールした。
そのあと、make clean , make menuconfig をやり直し、make 。
やはりエラーが出てしまう。
これは、上の図でlibs ディレクトリの下のライブラリもインストールするのでは?ということで、これもdpkg -i *.deb ですべてのパッケージをインストールした。
これでもう一度、make clean , make menuconfig をやり直し、make 。これでmake が完了できたようだ。
これでimagesフォルダにimages.bin などが生成された。
OK.。。。うまく行ったようだ。
2009/01/21 追加:ブート画面もうまく表示されて大丈夫だと思ったのですが、キー入力が出来ませんでした。どこかおかしいようです。
2009年01月20日 21:32 |
Suzaku-V_SZ410
| トラックバック:0
| コメント:0
今日は午後からイーアスで映画を見てきた。
252生存者あり だ。
インターネットからチケットを予約、クレジットカードで支払いしたのだが、会員になっているのに会員としてログインできない。登録時にメールでアクセスするアドレスを知らせてくるのだが、そのメールが2通来るのだ。とても変。システムに2重に登録されているのだろうか?しょうがないので一般からチケットを購入した。帰ってきてからサポートに電話して話したが、わからないので調査して後日連絡してくれるとのこと。
気を取り直して映画を見に行ったが、少しくさいところはあったが感動できた。素直に見ると良い映画だと思う。
そういえば、娘2人が風邪でダウン気味だ。熱は下がったのだが、喉が痛かったり咳が出たり。。。1人はインフルエンザA型とのこと。今のところ私は大丈夫だ。皆様もお気をつけください。
これからのプランもいろいろあるし。。。そろそろEDKの使用期限も切れるし、その前にSuzaku-Vで試してみたい。Spartan3E Starter Kit の液晶を使ってISE10.1i のチュートリアルというのも良いかな?
実は
秋月のH8ボード を買ってしまったので、これでリベンジのuClinux、TOPPERSなどやってみたい。
2009年01月18日 21:08 |
日記
| トラックバック:0
| コメント:2
FPGAの部屋のまとめサイト を更新しました。
EDKとXSTの項目を追加。DDR SDRAMコントローラとシミュレーションのエントリを追加しました。
2009年01月18日 10:49 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
横浜にTEDのEDKトレーニングで行ってきたが、お昼は横浜ベイクォーターのマクドナルドで食べてきた。窓からは横浜の運河?が見えた。景色が良い。
場所はこの辺。
大きな地図で見る この地図だと、TEDのトレーニングルームのあるの横浜イーストスクエアはまだ出来ていないようだ。最近出来たのかな?
外に出ると、晴れているけど結構寒い。日陰だととても寒い。
この辺はクレーンがいっぱいあるので、開発をしているのだろうか?
これはさっきと反対側。町のほうなのかな?
2009年01月17日 19:25 |
日記
| トラックバック:0
| コメント:0
昨日は東京エレクトロンデバイス(株)の
初級ザイリンクスプロセッサ・ワークショップ(ハードウェア編) に行ってきました。
午前中はEDKについての概要説明。
午後からはパソコンを使った演習でした。ボードはSuzaku-Sを使いました。EDKは10.1です。
最初はBase System Builderでハードウェアを生成して、ISEでインプリ、デバックはSDKでと、各種ツールを使ったものでした。いろいろ勉強になりました。
次は、XPSで自作のIPを組み込む演習でした。かなり手順が複雑です。やはりGUIですが、いろいろ設定する必要があるので、手順が複雑なのはわかります。でも、Visual C++を勉強して、またMFCを覚える必要が出てきた時のような感じです。。。つまり、また、いろいろ覚えなくちゃいけないの?という感じです。自分で何でも出来て、見通しがいいMico32の方が良かったような気もしてきました。更に何かやるとFatal Errorがでることがあります。
Alteraもこんなに複雑なんでしょうか?Nios2もやってみたい気がしてきました。Alteraの良さそうなボードをチェックすることにしました。
セミナは大体良かったと思います。標準的な手順を教えてもらいました。多分、ツールが開発途上なのでしょうね。もっと使いやすくなってくれることを望みます。やりがいがなくなるのかもしれませんが。。。
すでにEDKに登録されているボードのプロセッサソリューションとしては、良いのかもしれません。。。
とにかく、せっかくセミナに行って演習のファイルをもらってきたので復習することにします。
2009/01/18 追加:そういえばEDK10.1はWindows Vistaも対応なのだが、Vistaでは不具合が出るのでXPの方が良いそうだ。私の職場のパソコンはVistaだ。それでいろいろおかしかったのか?まだ、Vistaでは使い物にならないということ?XPのパソコンに乗せ変えようと思う。
2009年01月17日 13:28 |
EDK
| トラックバック:0
| コメント:6
”EDKでPetalinuxを動かしてみる2” からいろいろやってみましたが、EDK9.1からEDK10.1にプロジェクト変換したからでしょうか?動きませんね。がっくり。どうしたんでしょうか?うまく行きそうだったのですが残念です。
気分を変えて、明日は、
”TEDのEDKトレーニング” に行ってきます。
2009年01月15日 22:04 |
EDK
| トラックバック:0
| コメント:0
この記事は今日の早朝に公開したのだが、間違っていたのでいったん取り下げ、修正してから再掲載した。
”XSTのBlock RAMへのロジックのマップを確かめる2” でサンプルの組み合わせ回路(加算器)のBlock RAMへのマップについて試してみた。
今回は簡単なステートマシンをBRAMへマップしてみる。ステートマシンをBRAMへマップしたいというのが今回の目的だ。
かなり複雑な制御をすることを考えると、PicoBlaze, MicroBlazeのようなプロセッサでやる方法がある。MicroBlazeの方がC言語でプログラムも組めるし、これで出来たらと思っていたが、
” ISEからEDKを内部制御用プロセッサとして使いたい” で動作クロックが合わないことに気が付いた。
次にステートマシンでやる方法があるが、どうもステートマシンを組む時に大きくなると動作周波数のことを考えてしまう。そこで昔のプロセッサの
マイクロプログラム方式 のようにROMにステートマシンをビルトインできると動作周波数的には良いかな?と思っている。
そこでbram_mapを使って、ステートマシンが、どうやったらBRAMにマップされるかを探ってみることにした。サンプルとしてはトランプカードのうちの1枚を引くゲームのステートマシンを対象としてみた。これはボタンを押している時は、ステートマシンが回って1~dを繰り返し、ボタンを離したところで、そのステートにとどまり、引いたトランプのカードを表示するというものだ。
そのステートマシンのVerilogファイルの一部を下に示す。
`default_nettype none `timescale 1ns / 1ps // 1から13までのトランプのカードを表すステートマシン, Verilog2001 (* bram_map="yes" *) module cards_state_machine( input wire reset_sw, input wire clk, input wire draw, input wire draw_ena, output reg [3:0] card ); parameter card_one = 13'b0_0000_0000_0001, card_two = 13'b0_0000_0000_0010, card_three = 13'b0_0000_0000_0100, card_four = 13'b0_0000_0000_1000, card_five = 13'b0_0000_0001_0000, card_six = 13'b0_0000_0010_0000, card_seven = 13'b0_0000_0100_0000, card_eight = 13'b0_0000_1000_0000, card_nine = 13'b0_0001_0000_0000, card_ten = 13'b0_0010_0000_0000, card_jack = 13'b0_0100_0000_0000, card_queen = 13'b0_1000_0000_0000, card_king = 13'b1_0000_0000_0000; reg [12:0] current_state, next_state; always @(posedge clk) begin if (reset_sw) current_state <= card_one; else current_state <= next_state; end always @* begin case (current_state) card_one : begin card <= 4'd1; if (draw && draw_ena) next_state <= card_two; else next_state <= card_one; end card_two : begin card <= 4'd2; if (draw && draw_ena) next_state <= card_three; else next_state <= card_two; end card_three : begin card <= 4'd3; if (draw && draw_ena) next_state <= card_four; else next_state <= card_three; end card_four : begin card <= 4'd4; if (draw & draw_ena) next_state <= card_five; else next_state <= card_four; end card_five : begin card <= 4'd5; if (draw && draw_ena) next_state <= card_six; else next_state <= card_five; end
module宣言の前に(* bram_map="yes" *) をつけて、このステートマシンをBRAMにマップしようとしている。これをインプリメントして見てみた。論理合成ではステートが直線的に遷移するだけなので、
ワンホットからグレイコード に変換されている。
Analyzing FSM for best encoding. Optimizing FSM on signal with gray encoding. --------------------------- State | Encoding --------------------------- 0000000000001 | 0000 0000000000010 | 0001 0000000000100 | 0011 0000000001000 | 0010 0000000010000 | 0110 0000000100000 | 0111 0000001000000 | 0101 0000010000000 | 0100 0000100000000 | 1100 0001000000000 | 1101 0010000000000 | 1111 0100000000000 | 1110 1000000000000 | 1010 ---------------------------
下にインプリメント終了後のFPGA Editorの画面を示す。
List1ウインドウに選択されているのがステートマシンで、BRAMにマップされていないのがわかる。上のステートマシンはalways文を2つ使って、上のalways文でクロックが立ち上がったら次のステートを現在のステートに代入している。下のalways文で組み合わせ回路で次のステートを決定している。ステートマシンには、こういう書き方とalways文を1つ使用して書く書き方があると思う。それを下に示す。
`default_nettype none `timescale 1ns / 1ps // 1からKINGまでのトランプカードを表すステートマシン,Direct Verilog2001 (* bram_map="yes" *) module cards_state_machine( input wire reset_sw, input wire clk, input wire draw, input wire draw_ena, output reg [3:0] card ); parameter card_one = 13'b0_0000_0000_0001, card_two = 13'b0_0000_0000_0010, card_three = 13'b0_0000_0000_0100, card_four = 13'b0_0000_0000_1000, card_five = 13'b0_0000_0001_0000, card_six = 13'b0_0000_0010_0000, card_seven = 13'b0_0000_0100_0000, card_eight = 13'b0_0000_1000_0000, card_nine = 13'b0_0001_0000_0000, card_ten = 13'b0_0010_0000_0000, card_jack = 13'b0_0100_0000_0000, card_queen = 13'b0_1000_0000_0000, card_king = 13'b1_0000_0000_0000; reg [12:0] current_state; always @(posedge clk) begin if (reset_sw) begin card <= 4'd1; current_state <= card_one; end else begin case (current_state) card_one : begin if (draw && draw_ena) begin current_state <= card_two; card <= 4'd2; end end card_two : begin if (draw && draw_ena) begin current_state <= card_three; card <= 4'd3; end end card_three : begin if (draw && draw_ena) begin current_state <= card_four; card <= 4'd4; end end card_four : begin if (draw && draw_ena) begin current_state <= card_five; card <= 4'd5; end end card_five : begin if (draw && draw_ena) begin current_state <= card_six; card <= 4'd6; end end
こちらの方がデルタ時間的にはかかりそうだが、動作としては同じだと思う。
これでインプリメントしてみた。やはり論理合成でワンホットがグレイコードに変換されている。FPGA Editorで見てみると、
上のList1ウインドウを見ると、ステートマシンがBRAMにマップされている。
上の図がBRAMの入力、下がBRAMの出力だ。これを見ると入力に出力のbinaryも、draw_node, draw_ena, reset_swも入っている。binaryはステートと一緒に入っている。どっちかだけで良いのでは?と思うが。。。
とにかく2番目の方法でステートマシンを書いて、moduleの前にbram_mapディレクティブを書くとBRAMにマップされることがわかった。
下に示すのが、Verilogコードを間違って公開したコードだ。これだと、cardの値が出るまでにステートの遷移から1クロック遅れてしまう。下図参照
うまく行く上のVerilogコードだときちんとcardの値とステートの遷移が合っている。
`default_nettype none `timescale 1ns / 1ps // 1からKINGまでのトランプカードを表すステートマシン,Direct Verilog2001 (* bram_map="yes" *) module cards_state_machine( input wire reset_sw, input wire clk, input wire draw, input wire draw_ena, output reg [3:0] card ); parameter card_one = 13'b0_0000_0000_0001, card_two = 13'b0_0000_0000_0010, card_three = 13'b0_0000_0000_0100, card_four = 13'b0_0000_0000_1000, card_five = 13'b0_0000_0001_0000, card_six = 13'b0_0000_0010_0000, card_seven = 13'b0_0000_0100_0000, card_eight = 13'b0_0000_1000_0000, card_nine = 13'b0_0001_0000_0000, card_ten = 13'b0_0010_0000_0000, card_jack = 13'b0_0100_0000_0000, card_queen = 13'b0_1000_0000_0000, card_king = 13'b1_0000_0000_0000; reg [12:0] current_state; always @(posedge clk) begin if (reset_sw) current_state <= card_one; else begin case (current_state) card_one : begin card <= 4'd1; if (draw && draw_ena) current_state <= card_two; end card_two : begin card <= 4'd2; if (draw && draw_ena) current_state <= card_three; end card_three : begin card <= 4'd3; if (draw && draw_ena) current_state <= card_four; end card_four : begin card <= 4'd4; if (draw && draw_ena) current_state <= card_five; end card_five : begin card <= 4'd5; if (draw && draw_ena) current_state <= card_six; end
こちらの方がデルタ時間的にはかかりそうだが、動作としては同じだと思う。
これでインプリメントしてみた。やはり論理合成でワンホットがグレイコードに変換されている。FPGA Editorで見てみると、
上のList1ウインドウを見ると、ステートマシンがBRAMにマップされている。
上の図がBRAMの入力、下がBRAMの出力だ。これを見るとアドレス入力に出力のbinaryも入っている。ステートと一緒に入っている。どっちかだけで良いのでは?と思うが。。。(間違ってるほうはdraw_node, draw_ena, reset_sw はアドレス入力に入っていない)
2009年01月14日 20:59 |
その他のXilinxのツールについて
| トラックバック:0
| コメント:2
今週の金曜日(16日) は東京エレクトロンデバイス(株)の
初級ザイリンクスプロセッサ・ワークショップ(ハードウェア編) に行ってきます。
今、
スケジュール表 を見たら満員でした。ご一緒される方がありましたら、よろしくお願いします。
EDKもlinuxはうまく行かないし、外部にポートを出さないでシーケンサとして使うことも動作周波数の関係から無理そうなので、当初の目的は果たせないようだが、せっかくの機会なので正当なやり方を身に着けて来ようと思う。
そういえば昼食はどこで食べたら良いだろう。大戸屋はないのか?マクドナルドでも良いか?
テキストはセミナで頂くのではなく、PDFファイルをダウンロードして必要な人は、印刷して持って行くようになったようだ。セミナでは貸し出しテキストはあるそうだけど。。。経費節減だろうか?でも、PDFファイルもらえるのでこっちのほうが良いかも?
2009年01月13日 06:38 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
”EDKでPetalinuxを動かしてみる1” でUbuntuでmakeして、Spartan3E Starter Kit 上でFS-BOOTまで動作した。
さて次はU-BOOTを動かすぞ、、、と、
電脳筆記 さんの
”MicroBlazeでLinuxを動かす” の13.~15.までやろうとした。つまり、menuconfig して、make all しようとしたが途中でエラー。
ログによるとu-bootディレクトリのpetalinux-uboot-config を実行したときにsourceコマンドがファイルが無いと言っている。そのコマンドは下。
source $CONFIG_CONFIG
いろいろやってみたのだが、よくmake がわからないので、電脳筆記さんと同じCentOSを使うことにした。CentOS5.2をVMwareのバーチャルマシンにインストールした。
そして同様にやってみたところ、imageディレクトリが出来ました。
最後のエラーはtftpboot ディレクトリが無いといっているだけで、その前のmake は完了している。これがimage ディレクトリ。
本当はSamba 共有するのがいいのだが、面倒なので、以前試した
”VMware Server 2.0 でUSB接続HDDのマウント” でUSBメモリをCentOSにマウントして、取り出した。
これでU-BOOTを試せるはず。
やってみました。16. TeraTermを使ってSREC形式のu-boot.srecを転送。
転送したが、アドレスが違うといわれてしまった。
2回ほどやってみたが、同様の結果。そこでu-bootのSフォーマットをエディタで見てみた。
”ROM化ファイル覚書” によると、S3の次の2文字がバイトカウントで、次の8文字がアドレスだそうだ。
S00E0000752D626F6F742E73726563C0 S31527FC00009400C001B00027F4202000002021FFFC2B S31527FC0010B00027FD20A09AD0B00027FD2080ED2C2C
上のようなSフォーマットだと、最初のアドレスは0x27FC0000 となる。EDKでのSDRAMのアドレスは0x24000000~0x27FFFFFF なので、アドレスの範囲に入ってる。電脳筆記さんのサイトを見ても、U-Boot Start:0x27fc0000 とあるので、これで大丈夫そうだけど。。。調査が必要。
2009年01月12日 05:40 |
EDK
| トラックバック:0
| コメント:0
電脳筆記 さんの
”MicroBlazeでLinuxを動かす” を見ながらPetalinuxをEDKで動作させようとしている。
3.のmake menuconfig のところで、エラーが出て困っていたが、
”UbuntuでPetalinuxを動かす時の覚書(make menuconfig がエラーになる)” で書いたように回避できた。
menuconfig をXilinx、Spartan3E500-RevD に設定した。
次に、いよいよEDKを立ち上げて、インプリメントしてみることになった。
私のsambaの設定が悪いのか、Ubuntuのフォルダをドライブにマウントできなかったので、petalinux-v0.30-rc1\hardware\reference-designs\Xilinx-Spartan3E500-RevD-edk91をローカルディスクにコピーしてEDKを立ち上げた。
EDK9.1だったので、EDK10.1を立ち上げてプロジェクトを変換。EDK9.1からEDK10.1への変換はうまく行く。EDK8からEDK10.1だとうまく行かないことが多いようだ。
下の図が変換が終わって立ち上がったところ。
8.librariesとBSPを作成し(Software -> Generate Libraries and BSPs)、9.Updata Bitstream を実行する。うまく行った。本当に良かった。下の図
10.Download Bitsteam でビットファイルをダウンロードしようとしたら、ダウンロードできない。これはいったいどうしたこと?早速トラブルシュート。
そうしたら、Project: fs-boot(ソフトウェア)のSourceとHeader のファイルパスがXilinx-Spartan3E500-RevD-edk91フォルダの上のfs-bootフォルダにあったのでした。そこまでコピーしていなかった。そのフォルダをコピーして、追加しなおしたらDownload Bitsteam でビットファイルをダウンロード出来た。
それでも、Teratermを115200bps、parity even で起動したのだが、FS-BOOT First Stage Bootloader の表示が出ない。。。なぜ???
XPSの画面をよくよく見ると、RS232_DTEが入っているのを見つけた。RS232_DCEは入っていない。。。こりゃーだめだ。。。
RS232_DTEに変えると言う選択肢もありますが、今日のところは素直にDサブ9ピンメスーメスのクロスケーブルを購入することにします。それまでお預けとします。
追加:
Dサブ9ピンメスーメスのクロスケーブルを購入して、Tera Termを115200bps、no parity、1stop bit で起動して、Download Bitsteam でビットファイルをダウンロードしたらFS-BOOTのブート表示が出ました。めでたしめでたし。。。
2009年01月10日 05:41 |
EDK
| トラックバック:0
| コメント:0
高校生の娘が去年の3月に購入した
ソフトバンクの防水携帯822T が壊れたので修理に出した。そうしたら、今日連絡があって水ぬれなので有料修理になるという連絡がきた。
なぜ???防水携帯なのに。。。水にも濡らしていないのに。。。もしかして、梅雨時期に防水のふたを開けると湿気がこもって、冬になると結露して故障とか?考えられますか?何か情報がありましたら教えてください。
なぜなのかソフトバンクに調査をお願いしたが、どうなるのか。。。
2009年01月09日 12:32 |
日記
| トラックバック:0
| コメント:4
FPGAの部屋も気が付いてみれば、
”XSTのBlock RAMへのロジックのマップを確かめる” で1000記事目でした。
思えば、自分の備忘録として2005年5月に始めたのでした。最初はYahooブログから始めたのですが、どうも使い勝手が悪く。FCブログに移行しました。
もうすぐ4年になります。このブログも皆さんのコメントやアクセスに支えられて、ここまで書いてこれたと思います。これからもよろしくお願い申し上げます。
2009年01月09日 06:12 |
日記
| トラックバック:0
| コメント:0
電脳筆記 さんの”MicroBlazeでLinuxを動かす”の記事を読みながら、
PetaLogix のサイト からPetaLinux v0.30-rc1をダウンロードして試している。環境はUbuntuから落とした仮想マシンでやっている。
実は問題が発生していて、petalinux-v0.30-rc1/software/petalinux-dist でmake menuconfig すると、下のエラーで落ちてしまう。
/usr/bin/ld: cannot find -lncurses collect2: ld はステータス 1 で終了しました
これでだいぶ引っかかってしまったが、
Ubuntu日本語フォーラム の
”make menuconfig について” にやり方が解説されてあった。
それによると、下のようにコマンドを入れるとOKとのこと。
sudo apt-get update apt-get install libncurses5-dev
やってみたら、うまく行きました。make menuconfig でやっとコンフィギュレーションできるようになった。良かった。。。
しかし、ダウンロードしたUbuntuの仮想マシンは良い。VMware tools のインストールはすでにしてあるし、音も出るし完璧。早くこれをダウンロードして使っていればよかった。
2009年01月09日 06:07 |
EDK
| トラックバック:0
| コメント:0
”XSTのBlock RAMへのロジックのマップを確かめる” で、いきなり自分のDDR SDRAMコントローラの制御ステートマシンをXSTのbram_mapディレクティブでBRAMに入れることを試みたが見事に失敗した。
今回はまず、ftp://ftp.xilinx.com/pub/documentation/misc/examples_v9.zip からサンプルを取ってきて、examples_v9\FPGA_Optimization\mapping_logic_onto_block_ram のうちのbram_map_1.vhd をインプリメントしてみた。このコードは
XSTガイド の288ページからに載っているのと同一なので、全文引用させていただく。
-- The following example places 8-bit adders with -- constant in a single block RAM primitive -- library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity logic_bram_1 is port (clk, rst : in std_logic; A,B : in unsigned (3 downto 0); RES : out unsigned (3 downto 0)); attribute bram_map: string; attribute bram_map of logic_bram_1: entity is "yes"; end logic_bram_1; architecture beh of logic_bram_1 is begin process (clk) begin if (clk'event and clk='1') then if (rst = '1') then RES <= "0000"; else RES <= A + B + "0001"; end if; end if; end process; end beh;
これをISEでインプリメントしてみた。使用するFPGAはもともとのISEプロジェクトに設定してあったもので、XC4VLX15-12SF363だ。
インプリメント終了してFPGA Editorで見てみたところList1のようにlogic_bram_1_ROMという名前のBRAMが1つインスタンシエーションされている。
次にlogic_bram_1_ROMの中がどうなっているのかを見てみる。(図3)
4ビット出力のROMになっていて、ソースの入力A,BがBRAMのアドレスに入力されている。BRAMのADDRA2にA_2、ADDRA3にB_2、ADDRA4にA_1、ADDRA5にB_1、…と接続されていた。なぜADDRA2から接続されているかというと、4ビット幅のROMだからだろうと思われる。
図3の下のウインドウが初期値を表示している。INIT_00の右端が最初のデータだ。ピンクの四角の中を見てみると9551という値が見える。
最初の右端の1はAが0、Bも0の時なのでA+B+"0001"= 1
その次の5は、A(2)だけが1 "0100"、Bは0なのでA+B+"0001"= 5
その次の5は、Aが0、B(2)だけが1 "0100"なのでA+B+"0001"= 5
その次の9は、A(2)が1 "0100"、B(2)が1 "0100"なのでA+B+"0001"= 9
つまりBRAMがテーブルになっているようだ。
-- attribute bram_map: string; -- attribute bram_map of logic_bram_1: entity is "yes";
上のようにattribute bram_mapをコメントアウトしてインプリメントしてみた。FPGA Editorで見ててみると、通常のようにSLICEを使ってインプリメントされている。
2009/1/9 追記:
簡単なステートマシンを例にbram_mapディレクティブでBRAMに入るかどうかやってみたがだめだった。そういえばprocess文2つで、クロック代入部と組み合わせ回路とに分けてステートマシンを構成しているので、1つにしたらどうか確かめてみたい。
2009年01月08日 05:50 |
その他のXilinxのツールについて
| トラックバック:0
| コメント:0
今日は本当にびっくり。読売新聞のWebサイトを見たら、家の娘が通っている小学校の先生が逮捕されたそうだ。娘は4年生だが、4年生の学年主任だ。隣のクラスの担任だった。名誉毀損で逮捕ということだ。私も知っていて、良い先生だと思っていた。
仕事が終わって家に帰ってきたら、奥さんも帰っていて7時から、4年生の父兄会ということで学校に行った。本当に深刻。行ったら教頭先生が泣いていたそうだ。先生方も大変だが、子供が動揺しないようにケアしていかなければと思う。
明日は全校集会で子供たちに説明するそうだ。どのように説明するんだろう。。。
2009年01月07日 20:57 |
日記
| トラックバック:0
| コメント:4
XSTにはロジックをBlock RAMへ割り当てるディレクティブ bram_map がある。これは、スライスがなくなってしまった時に、Block RAMにロジックを割り当てる機能のようだ。ISE10.1iの
XSTガイド の286ページ、”ブロックRAMへのロジックマップ”に載っている。
もしこれが、大きなステート数の多い、ステートマシンを作った時にマイクロプログラム制御方式のプロセッサのように、ROMイメージをステートマシンの遷移や出力信号に使ったほうが、動作周波数の心配が要らないのじゃないかと思ったわけだ。もしそうなってくれたら本当に良い。当然ながら、ステートマシンの1つのステートから遷移できるステートの数がROMのビット幅で変わってしまうが、そこは最適化する。
もしくはEDKなどで、シーケンサを組むという方法もあるとは思ったが、以前
”ISEからEDKを内部制御用プロセッサとして使いたい” でやってみたところ動作周波数が合わなくてだめだった。EDKは本当にFPGA内部だけに使えるかどうかもわからない。
まずはSpartan3E Starter Kit のDDR SDRAMコントローラ・バーストテスト用インプリメントのうちのcontroller.v にbram_map ディレクティブをつけてみてやってみた。
(* bram_map="yes" *) module controller(clk, clkx, clk1_16, reset, dcm_lock, address, read_writex, next_address, next_read_writex, addr_fifo_empty, addr_fifo_almost_empty, addr_fifo_rden, wrdata_fifo_empty, wrdata_fifo_almost_empty, wrdata_fifo_rden, ddr_rasb, ddr_casb, ddr_web, ddr_ba, ddr_address, ddr_cke, ddr_csb, dqs_enable, dqs_reset, write_timing, read_timing, burst_read, initialize_end); `include "./ddr_cont_parameters.vh" input clk, clkx, clk1_16, reset, dcm_lock; input [USER_INPUT_ADDRESS_WIDTH-1:0] address; input read_writex;
インプリメントしFPGA EditorでContorller分を抽出した結果を以下に示す。
スライスばかりを使用してBRAMを使用していない。
以前のはどうかというと
インスタンス名は多少変わっているが変化がない。複数のクロックがあるのでBRAMにアサインできないのだろうか?
後で、サンプルをダウンロードして確かめてみることにする。
2009年01月07日 05:56 |
その他のXilinxのツールについて
| トラックバック:0
| コメント:0
いつものように
”なふたふJTAG日記” を見に行ったら、なひたふさんの作っているPCIeの基板でSpartan3EでDDR2-400が動作したと言う記事(
Spartan3E+DDR2メモリで400Mbps )を見た。
いや、Spartan3EでDDR2-400行けたなんて凄い。しかもバースト転送も問題ないそうだ。DDR2 SDRAMは、マイクロン社の533MHzのDDR2で、Suzaku-Vについているのと同じものだ。内部クロックでリードデータを受けられていると言うのも凄い。Spartan3Eの限界を超えたオーバークロックのようだ。しかも-4グレードと一番下のスピードグレード。なひたふさんのアイディアの豊富さと技術の確かさ、チャレンジ精神を感じた。
私もSpartan3E Starter Kit でもっとクロックをあげてみようと思ったが、CL=2 では133MHz(DDR-266) だったのでやめた。CL=2.5 だと167MHz(DDR-333)か、こっちのほうが良いかな?
Spartan3A Starter Kit のDDR2 SDRAMも試してみたくなってきた。FPGAの中身を詳しく理解するには限界までチューンすると良くわかってくると思う。
とにかく、今後のなひたふさんの日記に注目しようと思う。
2009年01月06日 05:13 |
DDR SDRAMコントローラ
| トラックバック:0
| コメント:0
今日も奥さんと一緒に
K-20 怪人20面相・伝 を見てきた。昨日見たウォーリーよりもよっぽど面白かった。
アクションあり、特撮あり、ロマンスあり、お笑いありで結構楽しかった。しかし、怪人20面相の正体が彼だったなんて、結構安直な設定では?
午後からは、課題の木工、タモ材の紙やすり調整。この前、作業台を作ったので楽だ。。。
合間に、
UbuntuのVMware用のバーチャルマシンをダウンロード して試している。これだと音が鳴る。以前に自分でCDからVMwareにインストールしたUbuntuはサウンドを認識しなかった。これでニコ動もOK。それに、VMware toolsもインストールされているし、とても楽だ。速くこれを使えばよかった。今、Sambaをインストール中。どうもインストールは簡単なのだが、共有フォルダがWindowsから見えない。
2009年01月04日 20:56 |
日記
| トラックバック:0
| コメント:0
今日は午後から奥さんが休みなので、iias に映画を見に行った。
ウォーリー だ。ディズニー、PIXAERのCGアニメだ。CGはこれがCGかと思うほど凄い。錆の様子などがリアルに描きこまれている。ストーリーはというと微妙。面白いという人が多いようだが、はっきり言ってあまり面白くなかった。
明日も奥さん珍しく休みなので、
K-20 怪人20面相・伝 を見に行く予定。
帰ってくるときに、途中で富士山が良く見えた。よく晴れた冬の日に、たまに見ることが出来る。
見えると得した気分。茨城県で静岡、山梨県の富士山が見えるということは、関東平野に住んでいるということを実感できる時でもある。
デジカメの12倍ズームで撮っています。実際は小さく見えます。筑波山神社の参道から見た富士山はもっと大きく見えました。写真を取れなかったのが残念。。。
そろそろ、懸案事項もだいぶ解決できたので、そろそろPetalinuxを試してみようと思っている。
2009年01月03日 21:07 |
日記
| トラックバック:0
| コメント:0
昨日は筑波山神社に初詣に行った。10時ころ家を出たが、筑波山神社へのつづら折の坂道が渋滞していた。去年秋に行った
おさかな市場への渋滞 よりだいぶましだった。10時50分過ぎころに到着。市営駐車場の道も渋滞していたので、途中の民営駐車場に止める。どちらの駐車場も500円なので、問題ない。
駐車場から筑波山神社に歩いて向かう途中に私の好きな、トルコあたりの肉を縦に串を刺して回転させて焼いて、そぎ落として、丸い薄いパンの間に挟み、キャベツとたれをかけて食べるもの(ケイバブ)が売っていたで早速購入。息子と食べたが美味しかった。
筑波山神社の階段を登って、お賽銭をあげようとすると、階段の下まで行列している。これは初めて。こんなに並んでいるのか?やはり1月2日は混んでいる?それとも筑波山自体がTXの影響で混んでいるか?
それでも気を取り直して列に並び、お賽銭をあげた。並んでいればそれほど時間はかからなかった。
帰りの道は空き空きだったが、上りは下の県道まで混んでいた。これじゃ、筑波山神社に着くのは1時間30分くらいかかるのでは?やはり、午前中早いうちに行くのが吉のようだ。
その後は、例によってかねきの回転寿司。美味しかった。やはりえんがわがうまい。カワハギは肝が載っていたが、苦かった。微妙。
午後からは、懸案の2X4で作業台を作った。初めて
去年購入した丸鋸 を使用した。やはり良く切れる。だが1つ曲がってしまった。やはりガイドを購入する必要がありそうだ。
組み立てはいつもの通りだったので、約2時間で完成。少し手抜きになってしまったところもあったが、問題ない。だいぶ組み立てるのが早くなった。
2009年01月03日 05:05 |
日記
| トラックバック:0
| コメント:0