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

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

FPGAの部屋

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

FPGA Editorで配置と配線を割り当てる2

最初から見る場合は、FPGA Editorで配置と配線を割り当てる1をご覧ください。

次に論理素子の配置だ。まずはList1ウインドウの in をクリックして、次にArray1ウインドウの A28 端子をコントロールキーを押しながらクリック。つまり、2つ同時に選択するわけだ。
FPGA_Editor_Lock_5_071031.png

次に、Toolsメニューから Place -> Manual Place を選択する。
FPGA_Editor_Lock_6_071031.png

そうすると Array1ウインドウの A28 ピンが赤くなり、List1ウインドウに in が A28 に割り当てられたことが表示される。
FPGA_Editor_Lock_7_071031.png

今度は in と接続される line1 を配置する。同様に List1ウインドウから line1 を選択し、コントロールキーを押しながら、SLICE_X1Y159 を選択する。
FPGA_Editor_Lock_8_071031.png

同様に、Toolsメニューから Place -> Manual Place を選択する。そうすると in から line1 スライスまで、配線が引かれる。
FPGA_Editor_Lock_9_071031.png

同様に、line2, line3, out をそれぞれ、SLICE_X1Y158, SLICE_X0Y159, G25 に割り当てる。結果は以下のようになるはず。
FPGA_Editor_Lock_10_071031.png

これで配置と配線は終了した。

またまた、長くなったので、FPGA Editorで配置と配線を割り当てる3に続く。
  1. 2007年10月31日 22:03 |
  2. FPGA Editorの使い方
  3. | トラックバック:0
  4. | コメント:0

FPGA Editorで配置と配線を割り当てる1

MIXIからの流れで、FPGA Editorで配置と配線を割り当てる方法をやってみようと思う。
BUFプリミティブやINVプリミティブだけだと、Floorplannerで見てもインスタンスが見つからない。そこでFPGA Editorで配置、配線を固定する方法を試して見た。元はVirtexだったが、慣れていないのでVirtex2Pでやってみることにする。Virtexでも同様にできると思うし、実際にやってみた。
まずは、ソースはINVだけを並べていわば遅延素子。ネットにKEEP属性を加えてある。

module inv_test(in, out);
    input in;
    output out;
    wire line0, line1, line2, line3, line4;
    
    assign line0 = in;
    assign out = line4;
    
    INV U0(line1,line0); // synthesis attribute keep of line0 is true;
    INV U1(line2,line1); // synthesis attribute keep of line1 is true;
    INV U2(line3,line2); // synthesis attribute keep of line2 is true;
    INV U3(line4,line3); // synthesis attribute keep of line3 is true;

endmodule


これをXC2VP30-6FF896でプロジェクトをつくり、上の inv_test.v をプロジェクトに加える。(使用ツールはISE9.2i SP3)
FPGA_Editor_Lock_1_071031.png

Processペインの Implement Desgin を展開して、MAP を展開する。その中の Manually Place & Route (FPGA Editor) をダブルクリック。
FPGA_Editor_Lock_2_071031.png

ピンクで囲った Routes をクリックして、配線を表示して、次に緑で囲った Zoom to Box で点線で囲った範囲をズームする。左上をズームしよう。
FPGA_Editor_Lock_3_071031.png

数回ズームして、左上隅のすぐ下の4つIOBが集まっているところをズームしよう。左上のIOBの位置は A28 だ。
FPGA_Editor_Lock_4_071031.png

ここで、いつもどおりにFPGA EditorをRead/Writeモードに設定しよう。
"File" - "Main Properties..."を選択する。
FPGA_Editor_10_060318.png

Main Propertiesダイアログが立ち上がる。
FPGA_Editor_11_060318.png


"General"タブが選択されていて、その中の"Edit Mode"が"No Logic Changes"が選択されていると思うが、ここのプルダウンメニューから"Read Write"を選ぶ。これでFPGA Editorで編集が出来るようになった。
FPGA_Editor_12_060318.png


長いので分割します。
FPGA Editorで配置と配線を割り当てる2へ続く。
  1. 2007年10月31日 21:52 |
  2. FPGA Editorの使い方
  3. | トラックバック:0
  4. | コメント:2

Virtex5 LXおよび LXT デザインのセミナ受講

昨日は、東京、大崎に行って、Virtex5 LXおよび LXT デザインのセミナを受講してきた。
大崎は再開発されていて大きなビルが立ち並んでいた。大崎は学生のころ養老の滝でよく飲んでいたので、変わりようにびっくりした。(30年近く前?)
セミナの内容は、Virtex5の内部構造に関することで、まあ大体これまでの勉強でわかっていたことが多いが、勉強になることもあった。下に書いてあるのが、勉強になったところ。

1.PLLの特徴を学べたこと。PLLのVCO周波数の決定方法やM, D, O値の決定方法を学べた。
2.DCM、PLLのカスケード接続。これについては、ユーザーズマニュアルで確認の必要がある。
3.36kbit BRAM/FIFOは18kbit のBRAMとFIFOに分割して使える。前に36kbit BRAMでVirtex4に比べて数が半分と聞いたのだが、分割すれば大丈夫?
4.DSP48Eスライス。まったくDSPスライス使ったことがなかったが、ALUモードがついたので、プロセッサを作るときにALUとして使えるかも?と思った。もちろんDSPとしても使える。使い方も演習で学んだ。といっても、あまり訳がわからなかった。これは専用のユーザーズマニュアルがあるそうなので、そっちで勉強の必要あり。

ブログにコメントを頂いている山猿さんとお会いできて、いろいろなお話ができて、楽しかった。また、機会がありましたら、お願いします。
今度は11月15日にET2007に行く予定です。
  1. 2007年10月31日 05:16 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

Floorplan Editor

XilinxのVirtex5LX30で、ISE9.2SP3を使って、Timing AnalyzerからFloorplannerでクロスプローブを使おうとしたら、ISEに統合されているのか見つからない。おかしいなと思いながら、Timing AnalyzerのAuto generated Desin Constraints Analysis Report のネット名をクリックしてみたら(キャプチャ図1)、何かPlanAhedみたいな画面が立ち上がった(キャプチャ図2)。えー、これ何と思っていたら、どうやらVirtex5, Virtex4, Spartan3AはFloorplan Editor?になったようだ。まったく知らなかった。
普段はレガシー・デバイスなので、PACEやTiming Analyzer単体からFloorplannerでクロスプローブできていたので、まったく気づかなかった。
Floorplan_Editor_1_071029.png
(キャプチャ図1)

Floorplan_Editor_2_071029.png
(キャプチャ図2)

Floorplan Editor?は配線のスタートとエンドを緑色の四角と赤の四角で示すようだ。カーソルをポイントすると、ディレイが示される。スライスの中の内容も見える。なかなかよさそうだが、今のところ配置配線が見えるだけで、バックアノテートして、再配置する方法がわからない。
ちなみに、使っているプロジェクトはスパルタン3用のLCD表示用回路だ。
これから、いろいろいじってみたいと思う。

明日、Virtex5のセミナに行く予定なので、聞いてみようと思う。

2007/10/30 : セミナで聞いてきました。ISE9.1からFloorplan Editorになっているそうです。バックアノテートして、再配置はできないそうです。見るだけとのことでした。
  1. 2007年10月29日 19:37 |
  2. その他のXilinxのツールについて
  3. | トラックバック:0
  4. | コメント:0

Xportの温度

以前コメントでLANTRONIXのXportが、かなり高温になるというお知らせがあったので、うちのボードのXportの温度を放射温度計でK君に測ってもらった。K君ありがとうございます。
45分ほど、通信しないアイドル状態で測定したそうだ。測定結果は下。


(室温:27度)

開始時:28度
5分後:36度
10分後:39度
15分後:39度
20分後:40度
25分後:39度
30分後:40度
35分後:41度
40分後:40度
45分後:40度



大体、40度程度で安定したようだ。気温からの温度上昇は13度。
暖かい程度のようだ。
  1. 2007年10月29日 05:52 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

柿の実の収穫

昨日は庭の柿のみを2つためしにとって食べてみた。甘くておいしかった。次郎柿です。そのほかに富有柿も植わっている。
私は柿は硬いのが好きだ。やわらかいと食った気がしない。柿を細切りにして、サラダに混ぜて食べてもおいしい。私はこれが好きだ。
来週は柿の実を収穫しようと思う。そんなになっていないが、30個くらいはあるかな?
収穫し終わったら、ずいぶん柿の木が上に伸びているので、剪定をしなくては。。。
kaki_071028.jpg
  1. 2007年10月29日 05:45 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

第4回茨城県南ロボットコンテスト

今日は、朝マックして帰ったら電話が鳴った。とってみると息子の中学校の先生から。。。
話によると今日は中学生の第4回茨城県南ロボットコンテストだったようだ。息子は半分くらいしか学校に行っていないので、部活のことを忘れていた!!!各学校でロボットを作りそれで競技をするのだ。
話によると茎崎中学校だそうなので、ナビをセットして送っていくことにする。行ったらもう始まっていた。体育館でやっていたのだが、父兄は体育館のフロアには入れずに2回から観戦。せっかくなので、終わりまで見てきた。
会場の様子、かなり中学生がいる。科学部などの部がこんなに人がいるとは、日本の中学校の科学技術もそんなに捨てたもんじゃない?
robokon_1_071028.jpg

競技は左のステージの上のアイテムを何らかの方法で、右側のばったんへもって行き、ばったんを持ち上げて、相手のステージにアイテムを入れるゲームだ。
robokon_2_071028.jpg

赤チーム、青チームに分かれて、お互いにアイテム(木の四角)をばったんで相手に送る。手前の塗装ベニアがステージ、奥の赤いのがばったん。ばったんには中央に仕切りがあって、一応アイテムが仕切りよりいかないようになっている。それで、ばったんを持ち上げると、先はちょうつがいがついているようなので、赤い板の手前の側が持ち上がる。
いろいろなロボットがあった、挟み込むもの、ちりとりみたいにすくいとるもの、さらにブレードをつけてかきこむもの、いまどきの中学生は侮れないなと思った。ずっとこんなようだったら日本の未来は明るいかもしれない。
  1. 2007年10月28日 21:24 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

旧テニス仲間の宴会

今日は旧テニス仲間の宴会が午後5時からS氏宅であった。昔、テニスに情熱をかけていた8人くらいが集まって久しぶりに語り合った。いまもテニスを続けているのはS氏と体育のN先生くらいのものだ。私もやめてしまい、今は上の娘と庭で遊んでいるくらい、そのうちテニスコートに行って一緒にやってみようと思っている。
さて、宴会は車のぶつかった話、職場の話、スキーの話など、話題は尽きなかった。テニスも相当やったが、スキーにもみんなでだいぶ行ったので話が進んだ。今は160cm~170cmくらいの板が主流だそうだ。一旦短くなったが、また少し長くなってきたとのこと。私がよく行っていたころは2mのスキー板だったんだが。。。
まあ私も、いまは99.9cmのファンスキーだし。。。
S氏は来年の春に定年退職して、故郷に帰り、志賀のスキースクールに通うそうだ。うらやましいけど。体力がないとできない。私には無理かも?
いろいろ楽しくお話をして、午後10時に帰ってきた。まだ皆いたのだが、眠くなったので先に帰ってしまった。
台風の嵐の中を大変な思いをしていった甲斐があったと思った。
  1. 2007年10月27日 23:39 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

FPGAの将来

以前はFPGAで最先端の物を作れると信じていた。最近はFPGAは最先端のものを作れなくなってきたんじゃないだろうかという気がしてならない。
たとえば、PCI-ExpressはIntelのX38チップセットではGen.2になっていて、実効伝送帯域1ペアあたり4GT/secだ。これをX8にして、64ビットバス幅に直すと、64ビット500MHzのSDR信号に変換される。果たしてこれでVirtex-5とはいえ、動作できるだろうか?
やはりせめて128ビット250MHzにする必要がある?
Gen.3だと、64B66Bあたりを使うのだろうから、8GT/secほぼ出るようだし、そうするとX8で64ビット1GHzのSDR信号に変換される。こっちは256ビット250MHzか?
Virtex5でも、最初からクリティカルパスの低減を考えていかなければ、250MHz動作は難しいのだろうか?(実際にやったことがないので良くわからない)
もっとレーンを少なくすれば、大丈夫だと思う。しかし、世の中の進歩にFPGAというアーキテクチャがついていけなくなりつつあるような気がする。
誤解の無いように言っておくとFPGAがだめだというわけではなく、いろんなことができる、とても便利なICなんだけど、最先端ではなくなるんじゃないかなと思う。もっと速くするためににはアーキテクチャの変更が必要なんじゃないだろうか?今でも、PCI-ExpressエンドポイントやEther MACがハードコアでついているが、それはFPGAの論理素子を使ったソフトコアでは難しいからだろうと思う。
この辺のことをET2007に行った時に、Xilinxのブースで聞いてみようと思う。

#なんかこんなこと書くと反発が来るかな?
  1. 2007年10月26日 06:14 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:11

LOG2の値の求め方

以前、”XSTでのVHDLインプリメントの注意点”で、math_realパッケージを使って、LOG2を求めようとしたが、realの値の丸め方の違いによって、ツールにより値が違っていたので、LOG2を使うのをあきらめた。
もっと違うやり方が、OPENCORESのAVR_COREの中のコードにあったので紹介しようと思う。それはAVRuCPackage.vhdの中にある、function LOG2(Number : positive)だ。
これは、言ってみれば、2を何回かけたらNumberよりも大きくなるかという単純な式だ。何でこれを思いつかなかったかと思うと、恥ずかしく穴に入りたくなるほど、簡単な式だ。
お恥ずかしい。とほほほ~。。。

ともあれ、これでgenericで分周値を指定したら、自動的にカウンタのビット幅を決定することができる。
  1. 2007年10月24日 19:28 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:6

組み込みアカデミー2

この前、日経エレクトロニクスに組み込みアカデミー2の折込チラシ?が入ってきた。
今度はモデル・ベース設計だそうだ。
そのチラシによると、本連載では、状態遷移表を中核に据えたCASEツール「ZIPC」を題材にするそうだ。
モデルを作って、Cソースも吐けるそうなので、楽しめそうだ。
11/5号より隔号、8回の連載だそうだ。
楽しみが1つ増えた。よかった!
Tech-Onの組み込みアカデミーOnlineには、まだその情報は出ていないようだ。
  1. 2007年10月24日 19:05 |
  2. マイコン関連
  3. | トラックバック:0
  4. | コメント:0

電子系自営業者の開発日誌さん

電子系自営業者の開発日誌さんのブログサイトが消えたようだ。とてもさびしい。
電子系自営業者の開発日誌さんはうちのブログで初めてリンクしたブログだった。
電子系自営業者の開発日誌さんのねたに、私のブログでレスをつけたこともあった。
電子系自営業者の開発日誌さんは、私のブログの初期のころ、いろいろコメントをもらった。とても励みになった。
今はがんと戦っておられるだろうと思うが、奇跡のご回復を祈らずにはいられない。
このブログにURLを残して、リンクは削除しようと思う。残念だ!!!
  1. 2007年10月23日 20:27 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

SUZAKU-V(SZ410)スタータキット

suzaku-v_071022.jpg

SUZAKU-V(SZ410)スタータキットが来て、使えるようになった。今、マニュアルを読んでいるが、デフォルトでLinuxが入っていて、簡易HTTPサーバーも入っているようである。非常に面白そうだ。
私のこれからの目標としては、Linuxがどの程度のものか見てみたいのと、Virtex4として使って、いろいろな実力を見てみたいと思っている。特にリージョナルバッファとか!
DDR2 SDRAMコントローラを自作してISERDES, OSERDESを使って、データを出力するとかやってみたいと思っている。しかし、仕事が忙しいので、いつできるかは定かではない。。。
  1. 2007年10月22日 20:53 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

数年ぶりの秋葉原、@eleオフ会

昨日は数年ぶりの秋葉原と@eleのオフ会に行ってきた。
秋葉原について、最初に秋葉原ラジオデパートに行った。相変わらず、B1の秋葉原エレクトリックパーツ、相変わらず、怪しい品物がいっぱい。昔どおり怪しいジャンクがいっぱい。懐かしい。落ち着く感じ。1Fは結構店が閉まっている。マルカ電気工業には、私が学生のころから熱収縮チューブが釣り下がって売っている。2階に行くと、まだ2764? DIPセラミックパッケージのEEPROMが売っている。なんか10年以上昔にタイムスリップした感じ。。。
はたまたこっちには、2000円?でIntelのi486CPUが売っていた。3階に上がると、いつもの超音波のグッズが売っている。奥のジャンクやには、店主のようなおじいちゃんが2人だべっていた。秋葉原ラジオデパート、10年後はどうなっているんだろうか?こんな状況で売れるのだろうか?非常に行く末が心配である。ここにこられるのももう何回もないのかな?と思いながら出てきた。
次にいつもの路地で、500円のバッファローのオプティカルマウスと512MBのUSBメモリ1,190円?を買った。次に秋月電子に行ってみた。秋月は相変わらず大盛況。いろいろ見てみたが、結局作る予定がないのでUSB、Bコネクタを2個買ってきた。
次に総武線で大久保へ。@eleオフ会の場所が良くわからず、迷ったが、すぐそこにあることがわかった。
会場に入って、少し時間が早くて待っていたが、そのうち開場となった。最初にPICのマイコンの講演。USBやLANがついていて制御できるのは便利。ちょっと何かやる分にはお手軽なんではないだろうか?
次にオープンハード、OpenDMPPの説明。低い電力でビデオが表示できているようだ。MPEG4? 1Wの消費電力でエンコード、デコード同時にできるプロセッサだそうだ。結構すごい?
そのころ、私はおなかの調子が悪くなって、具合が悪くなってしまった。
その次は、自己紹介だったが、具合が悪くて、ろくに自己紹介できず。。。申し訳ない。
となりがアインさんだったことがわかった。前から、お話してみたいと思っていたので、早速、お話させていただいた。宴会の会場に行って、アインさんとお話したが、とても楽しくお話ができた。といっても、こっちがしゃべってばかりだったと思うが。。。申し訳なかったような。。。私は楽しくお話できた。ほかの方ともあまり話していないし、名残惜しいが、おなかがやばいので帰宅した。帰宅まで、腹が持ってよかった。。。
今回は具合が悪くなってしまったが、(体が弱いのでそういうことが多い)また、いろんな方とお話がしたい。
  1. 2007年10月22日 20:36 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

キャラクタ・ディスプレイ・コントローラのシミュレーション(Verilog, ModelSim編)

キャラクタ・ディスプレイ・コントローラのシミュレーション、飽きたかも知れなけど、今度はVerilog版でModelSimでやってみました。なんといってもフリー版があるので皆さんやって見やすいだろうと思う。WebpackについてきたModelSim 6.2cでやってみた。
実際にやってみるときには、"キャラクタ・ディスプレイ・コントローラのまとめ"からその他のVerlogファイルをダウンロードしてほしい。
テストベンチは”キャラクタ・ディスプレイ・コントローラのシミュレーション”から持ってくる。
ModelSimでのシミュレーションのやり方は以下を参照のこと。
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1
Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ2
シミュレーションを始めるためのコマンドは、”Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ2”に書いてあるが、それをキャラクタ・ディスプレイ・コントローラ用に変更したコマンドを下に示す。

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


ModelSimのWorkspaceのProjectタブをクリックして表示されるプロジェクトに含まれるVerilogファイルは以下に示す。
CharDisp_ModelSim_Verilog_1_071019.png

つぎにwaveウインドウ。
CharDisp_ModelSim_Verilog_2_071019.png

Transcriptペインはこれ。
CharDisp_ModelSim_Verilog_3_071019.png

'A', 'B', 'C', 'D'に見えないこともないが、つぶれている。これはプロポーショナルフォントであるためだ。これを等幅フォントに設定を変更しよう。
ModelSimのメニューから、Tools -> Edit Preferences... を選択する。
CharDisp_ModelSim_Verilog_4_071019.png

Preferencesダイアログが開くので、下のFont のChange ボタンをクリック。
CharDisp_ModelSim_Verilog_5_071019.png

Fontダイアログが開くので、Fontフィールドで MSゴシックを選択し、OKボタンをクリック。Preferencesダイアログに戻ったらOKボタンをクリック。
CharDisp_ModelSim_Verilog_6_071019.png

等幅フォントに設定したので、ちゃんと'A', 'B', 'C', 'D'にに見えるようになった。
CharDisp_ModelSim_Verilog_7_071019.png
  1. 2007年10月19日 22:19 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

@eleのオフ会に行きます

SNSの@eleに入っているが、10月21日(日)に東京の大久保でオフ会があるので、行こうと思う。
オフ会参加の皆様、よろしくお願いします。有意義なお話ができれば良いなと思っています。
  1. 2007年10月18日 19:45 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

キャラクタ・ディスプレイ・コントローラのシミュレーション(VHDL)

キャラクタ・ディスプレイ・コントローラのシミュレーションのVHDL版だ。回路の構造としてはPS/2キーボード・インターフェースとキャラクタ・ディスプレイ・コントローラをつないで、キーボードで1文字打ったら、その文字が直接ディスプレイに表示できるようになっている。本体の回路は、実験の課題となっているので、公開はできないが、テストベンチだけ公開しようと思う。
キーボード入力は”PS/2キーボードインターフェース用テストベンチ(procedure使用)”で使った procedure を使っている。これで入力したPS2のコードをアスキーコードに変換し、さらに、キーを離したときの2つのコードを取り除く。そのアスキーコードをキャラクタ・ディスプレイ・コントローラに入力してディスプレイに表示する。
シミュレーションでは、Verilogと同様に'*' キャラクタでアスキー文字を書くことによって回路が動作するかどうかを見ている。VerilogはVHDLのテストベンチをVerilogに変換したものだ。
VHDLでは report で '*' キャラクタを書いているが、書いたら改行されて、書いた時刻も表示されてしまうため、すべての文字を string にためてから表示している。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

library work;
use work.PS2_SigGen_pack.all;

entity keyboard_chard_25MHz_tb is
end keyboard_chard_25MHz_tb;

architecture test_bench of keyboard_chard_25MHz_tb is

constant H_FRONT_PORCH : integer := 24; -- 水平フロントポーチ(表示範囲を広げた)
constant V_FRONT_PORCH : integer := 26; -- 垂直フロントポーチ(表示範囲を広げた)
constant CYCLE : time := 40 ns; -- 25MHz

signal clk : std_logic := '1';
signal reset : std_logic := '1';
signal ps2clk : std_logic := '1';
signal ps2data : std_logic := '1';
signal VGA_RED : std_logic;
signal VGA_GREEN : std_logic;
signal VGA_BLUE : std_logic;
signal VGA_HSYNC : std_logic;
signal VGA_VSYNC : std_logic;
signal line_str : string(1 to 3880); -- 97列*8行*5

component Keyboard_CharDisp_25MHz
    port(
        clk : in std_logic;
        reset : in std_logic;
        ps2clk : in std_logic;
        ps2data : in std_logic;
        VGA_RED : out std_logic;
        VGA_GREEN : out std_logic;
        VGA_BLUE : out std_logic;
        VGA_HSYNC : out std_logic;
        VGA_VSYNC : out std_logic
    );
end component;
begin
    Inst_Keyboard_CharDisp_25MHz : Keyboard_CharDisp_25MHz port map(
        clk => clk,
        reset => reset,
        ps2clk => ps2clk,
        ps2data => ps2data,
        VGA_RED => VGA_RED,
        VGA_GREEN => VGA_GREEN,
        VGA_BLUE => VGA_BLUE,
        VGA_HSYNC => VGA_HSYNC,
        VGA_VSYNC => VGA_VSYNC
    );
    
    clk <= not clk after CYCLE/2;

    process begin -- PS/2キーボード入力
        wait for 80 ns; -- 1クロック分リセット
        
        reset <= '0'; -- リセット解除
        
        PS2_SigGen(x"1C", ps2clk, ps2data); -- 'A'
        PS2_SigGen(x"F0", ps2clk, ps2data);
        PS2_SigGen(x"1C", ps2clk, ps2data);
        PS2_SigGen(x"32", ps2clk, ps2data); -- 'B'
        PS2_SigGen(x"F0", ps2clk, ps2data);
        PS2_SigGen(x"32", ps2clk, ps2data);
        PS2_SigGen(x"21", ps2clk, ps2data); -- 'C'
        PS2_SigGen(x"F0", ps2clk, ps2data);
        PS2_SigGen(x"21", ps2clk, ps2data);
    end process;
    
    process begin -- 8キャラクタ分表示
        wait for 80 ns; -- 1クロック分リセット
        wait until VGA_VSYNC'event and VGA_VSYNC='1'; -- VGA_VSYNCの立ち上がりまでwait
        
        for i in 0 to V_FRONT_PORCH-1 loop -- 垂直のフロントポーチ分だけwait
            wait until VGA_HSYNC'event and VGA_HSYNC='1'; -- VGA_HSYNCの立ち上がりまでwait
        end loop;
        
        for i in 0 to H_FRONT_PORCH-1 loop -- 水平のフロントポート分だけwait
            wait until clk'event and clk='1';
        end loop;
        
        for i in 0 to 39 loop -- 8行*5表示
            for j in 1 to 96 loop
                wait for 1 ns;
                
                if VGA_RED='1' or VGA_GREEN='1' or VGA_BLUE='1' then -- いずれの色が1だったら
                    line_str(i*97+j) <= '*';
                else
                    line_str(i*97+j) <= ' ';
                end if;
                wait until clk'event and clk='1'; -- 次のクロックへ
            end loop;
            line_str(i*97+97) <= CR;
            
            wait until VGA_HSYNC'event and VGA_HSYNC='1'; -- VGA_HSYNCの立ち上がりまでwait
            for i in 0 to H_FRONT_PORCH-1 loop -- 水平のフロントポート分だけwait
                wait until clk'event and clk='1';
            end loop;
        
        end loop;
        report line_str severity Note; -- 表示
    end process;
end test_bench;


確認はModelSimでしているが、どのようにやるかはまた後で。。。Verilog版でやろうと思う。

2007/10/19 : このテストベンチでModelSimでシミュレーションすると、このように表示されます。ModelSimも等幅フォントに指定しています。
PS2_VGA_Sim_071019.png

  1. 2007年10月18日 19:14 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

キャラクタ・ディスプレイ・コントローラのシミュレーション

キャラクタ・ディスプレイ・コントローラを作っていて、木(気)になることがあった。
それは、HSYNC, VSYNCの間隔の確認はできるが、表示文字の確認はシミュレーションでは難しいことだ。出力信号のパターンを見て、これは'A'かな? これは'B'かな? と推測するしかない。
そこで、テストベンチを工夫して'*'文字のパターンでキャラクタを表示してみることにした。
下にテストベンチを示す。なお、このテストベンチを作るにあたっては、Verilog Simulater & FPGA & CPU のページVerilogチュートリアルを参考にさせていただきました。ありがとうございました。

//
`timescale 1ns/100ps

module CharDispCtrler_tb;
    `include "disp_timing_parameters.vh"
    
    reg clk = 1'b0;
    reg reset = 1'b1;
    reg [12:0] processor_addr = 13'b0000000000000;
    reg [9:0] processor_din = 10'b0000000000;
    wire [9:0] processor_dout;
    reg processor_we = 1'b0;
    wire VGA_RED;
    wire VGA_GREEN;
    wire VGA_BLUE;
    wire VGA_HSYNC;
    wire VGA_VSYNC;
    integer i, j, k, m, n;
    reg [8*100:1] str_buffer;

    parameter PERIOD = 40;
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;

    initial    // Clock process for clk
    begin
        #OFFSET;
        forever
        begin
            clk = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    CharDispCtrler UUT (
        .clk(clk),
        .reset(reset),
        .processor_addr(processor_addr),
        .processor_din(processor_din),
        .processor_dout(processor_dout),
        .processor_we(processor_we),
        .VGA_RED(VGA_RED),
        .VGA_GREEN(VGA_GREEN),
        .VGA_BLUE(VGA_BLUE),
        .VGA_HSYNC(VGA_HSYNC),
        .VGA_VSYNC(VGA_VSYNC));

    initial begin // キャラクタを書き込む
        #(PERIOD*2);
        
        FB_Write(0, 7'h41, 3'b111); // A
        FB_Write(1, 7'h42, 3'b111); // B
        FB_Write(2, 7'h43, 3'b111); // C
        FB_Write(3, 7'h44, 3'b111); // D
    end
    
    task FB_Write;
        input [12:0] addr;
        input [6:0] ascii_code;
        input [2:0] color_code;
        begin
            @(posedge clk); // 次のクロックへ
            #1;
            processor_addr = addr;
            processor_din = {color_code, ascii_code};
            processor_we = 1'b1;
            @(posedge clk); // 次のクロックへ
            #1;
            processor_we = 1'b0;
        end
    endtask
    
    initial begin // キャラクタを*で表示する
        
        #(PERIOD*2);
        reset = 1'b0;
        
        @(posedge VGA_VSYNC); // 垂直同期の立ち上がりまでWAIT
        
        for(i=0; i<= V_FRONT_PORCH-1-10; i=i+1) // V_FRONT_PORCHの10ライン前まで数える(表示範囲を広げるため)
            @(posedge VGA_HSYNC); // 水平同期の立ち上がりまでWAIT
            
        for(j=0; j<= H_FRONT_PORCH-1-10; j=j+1) // H_FRONT_PORCHの10ピクセルクロック前まで数える(表示範囲を広げるため)
            @(posedge clk);
            
        for(k=0; k<(8*5); k=k+1) begin // 8行(1キャラクタ)*5行
            for(m=0; m<(8*12); m=m+1) begin // 8ピクセル(1キャラクタ)*12列
                #1; // wait
                if(VGA_RED==1'b1 || VGA_GREEN==1'b1 || VGA_BLUE==1'b1)
                    $write("*");
                else
                    $write(" ");
                @(posedge clk); // 次のクロックへ
            end
            $write("¥n");
            
            @(posedge VGA_HSYNC) ; // 水平同期の立ち上がりまでWAIT
            for(n=0; n<= H_FRONT_PORCH-1-10; n=n+1) // H_FRONT_PORCHの10ピクセルクロック前まで数える(表示範囲を広げるため)
                @(posedge clk);
        end
        $stop; // 終了
    end
endmodule


テストベンチの説明をすると、FB_Writeタスクで、最初に'A', 'B', 'C', 'D' キャラクタをアドレスを変えて、フレームバッファに入力する。次のinitial 文で、VGA_RED, VGA_GREEN, VGA_BLUE のいずれかの色が出力されたときに '*' キャラクタを表示する。なければスペースを表示する。最初、$display で表示していたが、改行されてしまった。Verilogチュートリアルを見たところ $write が改行しないということで使った見たら、うまくいった。

実際にやってみるときには、"キャラクタ・ディスプレイ・コントローラのまとめ"からその他のVerlogファイルをダウンロードして、上のテストベンチでシミュレーションしてみてほしい。
今回は初めてVeritak でデバック、シミュレーションを行った。シンタックス エラーのときに、Syntax error というメッセージだけ表示される。ModelSimで詳しくエラー情報が出ても結局どこだかわからないことがあるが、もう少しエラー情報があるとよいと思った?
良いところは、ModelSimはwaveに入れた波形しか表示できない。新しく入れた信号はもう一度シミュレーションする必要がある。Veritak は、すべての信号を保存してあるので、Waveform Viewer にドラック・アンド・ドロップすると、すぐに見ることができる。これは、キャラクタ・ディスプレイ・コントローラのように20msくらいシミュレーションする必要がある回路にとっては、とてもありがたい機能だ。
Veritak でシミュレーションした結果を示す。
CharDispCtler_Veritak_1_071017.png

上のウインドウに '*' で'A', 'B', 'C', 'D' キャラクタが表示されているのがわかると思う。
キャラクタがつぶれているときは、Document Viewer のフォントを等幅フォントに変えると正常に見えるようになる。具体的には、メニューバーのユーティリティ -> Document Viewer フォント設定 -> Document Viewer を選ぶとフォントを選ぶダイアログが出てくるので、そこで等幅フォント、たとえばMSゴシックを選ぶと良い。

2007/10/18 注意: $write("¥n"); の¥が全角になっています。半角だとどうしても、いつの間にか消えてしまいます。全角を半角に直してお使いください。
  1. 2007年10月17日 20:42 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:7

アルテラ ウェブセミナ(Stratix® III の低消費電力化)

アルテラからのメールが来たので、”Stratix® III におけるプログラマブル・パワー・テクノロジとセレクタブル・コア電圧を活用した低消費電力化の設計技術”のウェブセミナを受講した。先着100名までなんかくれるというので、アンケートを応募しようとしたら、できなかった!!!

内容は
1.プログラムブル・パワーというクリティカルパスだけ高速ロジックで、後は低消費電力ロジックにする。これは前の Arria™ GX でもそうだったと思うが、よくできていると思う。ツールで自動的にやってくれるというのが良い。
2.セレクタブル・コア電圧。コア電圧を1.1Vと0.9Vに変更できるとのこと。でもコア電圧を2種類用意して、DC-DCを2つ載せておく人がいるのだろうか?それともDC-DCを設定ピンとかで切り替えればよい?でも、ツールから電圧を変更できるといっていたし???それだけパッドがあるならばGNDとかにまわしたほうがよいのでは?アイデア倒れ? でも、試作基板やスタータキットには良いか?
3.DDRの終端。ダイナミックOCTで書き込み、読み出しのときに不要な負荷抵抗をOFFしてくれるとか? Xilinxはどうだったか?インピーダンスマッチング(DCI)はあるが? 確かにSSTL2は電流食うのでいいかも?
4.ブロックRAMの実装でも、4つのブロックRAMのうち使っている1個だけONできるようだ。トグルレートの高い配線を短くしたり、クロック配線を細かくシャットダウンしたり、そのために配置配線ツールで最適化したりできるようだ。こんな細かい配慮をしたら、どのくらいツールの時間がかかるんだろう?それが問題だ。それともXilinxよりもツールが格段に良い?

うちで使っているソーテックのパソコンが壊れてしまった。途中で止まってしまう。止まった後はCMOSがおかしくなっている。CPUを換えたといわれてしまう。原因がわからない。このパソコンは捨てか? とりあえずMEMTEST86をやってみようと思う。
  1. 2007年10月16日 18:56 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:6

PS/2キーボードインターフェース用テストベンチ(task使用)のアサーション($timeformat)

たっくさんから $timeformat を教えてもらったので、もう一度、PS/2キーボードインターフェース用テストベンチを書き直した。
$timeformatの説明はこのページにあるので、詳しくはこのページを見てください。
PS/2インターフェースなので、単位はusec 、小数点以下は3桁、つまり nsec まで表示とした。

$timeformat(-6, 3, "usec", 4);


PS/2プロトコルで送ったコードとPS/2インターフェース回路で受けたコードが合わないときに表示するデータに時刻を追加した。

if (scandata != input_code) begin
    $display("Error!!!  %t, input_code = %h, scandata = %h"
        ,$time, input_code, scandata);
    $stop;
end


テストベンチの全コードを下に示す。

// ps2read_tb.v

`default_nettype none
`timescale 1ns / 100ps

module ps2read_tb;

    parameter CYCLE=20;

    reg clk, reset, ps2clk, ps2data;
    wire [7:0] scandata;
    reg [7:0] testcode;
    
    ps2read ps2read_inst (
        .clk(clk),
        .reset(reset),
        .ps2clk(ps2clk),
        .ps2data(ps2data),
        .scandata(scandata)
    );
    
    initial begin
        clk <= 1'b1;
    end
    always #(CYCLE/2)
        clk <= ~clk;
    
    initial begin
        $timeformat(-6, 3, "usec", 4);
        
        reset <= 1'b1;
        ps2clk <= 1'b1;
        ps2data <= 1'b1;
        
        #80; // リセット
        reset <= 1'b0; // リセット解除
        
        PS2_SigGen(8'h1C);
        PS2_SigGen(8'h32);
        
        #500;
        $stop;
    end
    
    task PS2_SigGen;
        input [7:0] input_code;
        integer i;
        begin
            ps2clk <= 1'b1;
            ps2data <= 1'b0; // Stop bit
            
            #40000;
            ps2clk <= 1'b0; // 立ち下がりエッジ
            #40000;
            
            for(i=0; i<=7; i=i+1) begin
                ps2clk <= 1'b1; // 立ち上がりエッジ
                ps2data <= input_code[i]; // シリアルデータ出力
                
                #40000;
                ps2clk <= 1'b0; // 立下りエッジ
                #40000;
            end
        
            ps2clk <= 1'b1;
            ps2data <= !(^input_code);
        
            #40000;
            ps2clk <= 1'b0; // 立ち下がりエッジ
            #40000;
        
            ps2clk <= 1'b1;
            ps2data <= 1'b1; // Stop bit
        
            #40000;
            ps2clk <= 1'b0; // 立ち下がりエッジ
            
            if (scandata != input_code) begin
                $display("Error!!!  %t, input_code = %h, scandata = %h"
                    ,$time, input_code, scandata);
                $stop;
            end
            
            #40000;
            ps2clk <= 1'b1; // 1に戻す
        end
    endtask
endmodule


更にわざとエラーが出るように、if 文の中を == に書き換えて Veritak でシミュレーションしてみた。
keyboard_verilog_5_071015.png

黄色の枠で囲んだところが、わざとエラーが出るようにしたところ。
ピンクの枠で囲んでいるのがエラーメッセージだ。840.080 usec でエラーが出ている。
今のところ、コードが合っているのは当たり前なのだが、PS/2インターフェース回路を後で修正したときに、意図せずに間違ったデータが出たときに教えてくれるというわけだ。
PS/2インターフェース回路などでは間違うことはないかもしれないが、たとえばPCI-Xインターフェース回路で、”Aという信号をアサートしたら、何クロック以内にBという信号をアサートする必要がある”というルールをVerilogコードまたはPSLなどで書いておく。そうすると、回路を修正していく過程で、修正する項目しかwave波形表示ウインドウで注目していなくても、それらのルールに合致しているということが自動的に証明されるはずである。
これは結構重要で、あっちを修正したはずが、こっちがだめになったということが良くある。これをwave画面上で気がつけばよいが、実際にやってみるまで気がつかないということが良くある。
もっと怖いのは、たまたまそのシステムでは大丈夫だが、ほかのシステムでテストしたときにだめということになり、あわててしまうこともある。なるべく、決まったルールはシミュレーション上で自動的に判別できたほうが良いと思う。そうでないとwave波形を見る目が血走ってぐったり疲れてしまう。心の健康のためにもアサーションを導入しようという気持ちだ。(半分冗談、こうゆう時にいまどきのブロガーは(笑)と入れるのだろうか?)
  1. 2007年10月15日 06:06 |
  2. アサーション事始め
  3. | トラックバック:0
  4. | コメント:0

シソの実

シソの実の補足です。シソの実の漬物にするのは、青ジソの実だけです。赤ジソの実は香りが悪いので漬物にならないそうです。
shiso_071013.jpg

shiso_zoom_071013.jpg

上の写真は、青ジソと赤ジソの写真です。つまり葉が緑と紫の違いです。青ジソの実は、柔らかい上のほうだけ、収穫してあります。
下の写真は実のアップです。そのように、鈴なりというんでしょうか?
小さなベルのような実が2つずつ対になって茎についています。
  1. 2007年10月13日 10:10 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

シソの実の塩漬け

shisonomi_071011.jpg

これは何だと思いますか?
シソの実です。普通は葉を大葉として食べますが、今時期、実がなります。
私はこの塩漬けが大好きです。市販の漬物に少し入っていることはありますが、シソの実だけの漬物が売っているのは見たことがないです。
これを、あったかいご飯にふりかけのようにかけて食べると、シソの香りとぽりぽりとした食感がとてもよいです。大好物です。うちの親がつけて分けてくれます。
ちなみに、ある方に聞いたのですが、しょうゆ漬けもおいしいそうですよ。
秋の味覚ですね。
このサイトによると、シソの実には心身リラックス効果と、EPAのような働きもあるとのこと。本当でしょうか?体にもよさそうですね。
  1. 2007年10月11日 19:18 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:5

PS/2キーボードインターフェース用テストベンチ(task使用)のアサーション

今度はVerilog2001でアサーションを適用してみる。(といっても大げさなものではないが。。。)

実は、VHDLでPS/2キーボードとキャラクタ・ディスプレイ・コントローラをつないで、キーボードで1文字打ったら、そのままディスプレイに写すという実験をやっている。アサーションのないテストベンチを渡して、PS/2キーボード・インターフェース回路のシミュレーションをやってもらったところ、うまくパラレルデータが出ているようだったので、OKということになった。しかし、そのデータをLEDに出力してみると、1ビットシフトが足りない。なぜ???ということになって、よくVHDLコードを見てみると、PS/2のクロックをクロックとして使用して回路を作ってしまったようだった。
私のテストベンチはprocess文で2つのPS/2キーボードデータを出力しているので、2つ終わったら、最初のデータに戻って、繰り返して出力してしまう。それで、クロックが連続的に入って、ちゃんと動いているように見えてしまったようだ。実際には1つPS/2キーボードデータを入れたら、次のキー動作までPS/2のクロックは停止しているので、それ以降の回路動作は停止してしまったようだ。
テストベンチを作るときには1つPS/2キーボードデータを出したら、実機と同様にWAITするか、”PS/2キーボードインターフェース用テストベンチ(procedure使用)のアサーションのようなもの”でやったようにチェック用のコードを入れておけば、シミュレーション段階でミスを見つけることができたと思う。反省!!!

前振りが長くなってしまったが、Verilog2001のアサーションに行く。今度は task 文の中にアサーションを組み込むことにする。
keyboard_verilog_3_071011.png

今回は、図で貼り付けた。ピンクの四角で囲んだところが、今回追加したところだ。Verilogでは task 文の外のデータも参照できるので、scandataをinput_codeと比較して違っていたら、input_codeとscandataを表示してシミュレーションを中断する。自由にデータを表示できるのがVerilogの良いところだと思う。
VHDLも”たーぼのハードウェア設計記録”さんの”VHDLでC言語の標準関数を使う”を使用して printf でエラーメッセージを表示すると、すごくやりやすいと思う。

2007/10/13 : LRMに従って$displayの中の %x を %h に変更しました。たっくさん、ご指摘ありがとうございました。
さらにVeritak での$display表示結果を下に示します。


上の図のVerilogコードの黄色で囲んであるところを見るとわかると思いますが、わざとエラーが出るように書き換えてあります。
ピンクで囲ってあるところが、$display で表示されたメッセージです。
  1. 2007年10月11日 06:15 |
  2. アサーション事始め
  3. | トラックバック:0
  4. | コメント:6

ウェブセミナ『 高速メモリインターフェイスソリューションと設計手法 』

今日、Xilinxからメールが来た。ウェブセミナ『 高速メモリインターフェイスソリューションと設計手法 』のお知らせだった。
早速アクセスしてセミナを聴講した。
Virtex5のDDR SDRAMインターフェースの話だった。最初にXilinxの方がSDRAMの概略やVirtex5の特徴に関する概略を説明して、その後、東京エレクトロンデバイスの方が、具体的にDDR2 SDRAMのインターフェースをVirtex5で実装する場合の注意点などを説明していた。思っていたより詳しく説明していた。
DDR2 SDRAMのインターフェース回路はMIG(Memory Interface Generator) を使用していた。最初にパターンを書き込んで、読み出しながら入力の遅延量を動的に変更して最適なポイントを見つけるようだ。うまく行けば、ベストではないだろうか?
前にMIGをやってみたときには、(バージョンはかなり前だと思うが)入出力ピンが決められていて、基板を作る前だったらいいのだが、すでにあるボードには対応できる方法が、私は見つからなかったが、今はどうだろうか?
MIGとか、Auroraについては、ライセンスを承認しなければいけないので、私のブログの記事には書いていない。書いちゃいけないというライセンス条件はないかもしれないが、読むのも面倒なので書かないことにしている。(ちょっと書いてしまったかな?)
SUZAKU-Vを買って、Virtex4で、DDR2をやってみたくなった。
  1. 2007年10月09日 20:01 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

PS/2キーボードインターフェース用テストベンチ(task使用)

PS/2キーボードインターフェース用テストベンチ(procedure使用)でVHDLの procedure 文を使って、PS/2キーボードインターフェースをシミュレーションしてみた。
今度はVerilog2001で task 文を使ってシミュレーションしてみた。task もprocedure 同様サブプログラムとして使用できるようだ。Verilog は、VHDLと違って、出力信号を定義せずに直接信号を変更できるようだ。これは私としては、信号がグローバルになっているようであまり好きではない。便利なことはいろいろあるのだけど。。。
ps2read.v は、日曜デジタルさんのコードを丸写しで直しても芸がないので、自分で作ってみた。ずっとコード量は多いし、回路も複雑になると思うが、シリアルデータ受信のすべてのフェーズを1つ1つのステートにした。
さらにステートを見やすいように、MAIN_STATEにステート文字をアサインした。
Verilogを書くのは久しぶりなので、大分苦労してしまったが、何とか完成。

// ps2read Verilog2001

`default_nettype none
`timescale 1ns / 1ps

module ps2read(clk, reset, ps2clk, ps2data, scandata);
    input clk, reset, ps2clk, ps2data;
    output [7:0] scandata;
    
    wire clk, reset, ps2clk, ps2data;
    reg [7:0] scandata;
    reg [10:0] c_state, n_state;
    reg ps2clk_b1, ps2clk_b2;
    reg ps2data_b;
    reg [7:0] c_scandata, n_scandata;
    
    parameter IDLE=11'b00000000001, BIT0=11'b00000000010, BIT1=11'b00000000100, BIT2=11'b00000001000, BIT3=11'b00000010000, BIT4=11'b00000100000, BIT5=11'b00001000000, BIT6=11'b00010000000, BIT7=11'b00100000000, PARITY=11'b01000000000, STOP=11'b10000000000;
    
    always @(posedge reset, posedge clk) begin
        if (reset) begin
            ps2clk_b1 <= 1'b0;
            ps2clk_b2 <= 1'b0;
            ps2data_b <= 1'b0;
        end else begin
            ps2clk_b1 <= ps2clk;
            ps2clk_b2 <= ps2clk_b1;
            ps2data_b <= ps2data;
        end
    end
            
    always @(posedge reset, posedge clk) begin
        if (reset) begin
            c_state <= IDLE;
            c_scandata <= 0;
        end else begin
            c_state <= n_state;
            c_scandata <= n_scandata;
        end
    end
    
    always @* begin
        case (c_state)
            IDLE : begin
                n_scandata <= c_scandata;
                if (ps2clk_b2 && !ps2clk_b1)
                    n_state <= BIT0;
                else
                    n_state <= IDLE;
            end
            BIT0 : 
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= BIT1;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT0;
                    n_scandata <= c_scandata;
                end
            BIT1 : 
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= BIT2;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT1;
                    n_scandata <= c_scandata;
                end
            BIT2 : 
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= BIT3;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT2;
                    n_scandata <= c_scandata;
                end
            BIT3 : 
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= BIT4;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT3;
                    n_scandata <= c_scandata;
                end
            BIT4 : 
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= BIT5;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT4;
                    n_scandata <= c_scandata;
                end
            BIT5 : 
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= BIT6;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT5;
                    n_scandata <= c_scandata;
                end
            BIT6 :
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= BIT7;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT6;
                    n_scandata <= c_scandata;
                end
            BIT7 :
                if (ps2clk_b2 && !ps2clk_b1) begin
                    n_state <= PARITY;
                    n_scandata <= {ps2data_b, c_scandata[7:1]};
                end else begin
                    n_state <= BIT7;
                    n_scandata <= c_scandata;
                end
            PARITY : begin
                n_scandata <= c_scandata;
                if (ps2clk_b2 && !ps2clk_b1)
                    n_state <= STOP;
                else
                    n_state <= PARITY;
            end
            STOP : begin
                n_scandata <= c_scandata;
                if (ps2clk_b2 && !ps2clk_b1)
                    n_state <= IDLE;
                else
                    n_state <= STOP;
            end
        endcase
    end
    
    always @(posedge reset, posedge clk) begin
        if (reset)
            scandata <= 0;
        else
            if (c_state == STOP)
                scandata <= c_scandata;
    end
    
    // synthesis translate_off

    reg [20*8:1] MAIN_STATE; 
    
    always @(c_state) begin
        case(c_state)
            IDLE: MAIN_STATE <= "IDLE";
            BIT0: MAIN_STATE <= "BIT0";
            BIT1: MAIN_STATE <= "BIT1";
            BIT2: MAIN_STATE <= "BIT2";
            BIT3: MAIN_STATE <= "BIT3";
            BIT4: MAIN_STATE <= "BIT4";
            BIT5: MAIN_STATE <= "BIT5";
            BIT6: MAIN_STATE <= "BIT6";
            BIT7: MAIN_STATE <= "BIT7";
            PARITY: MAIN_STATE <= "PARITY";
            STOP: MAIN_STATE <= "STOP";
        endcase
    end
    // synthesis translate_on
     
endmodule


次にテストベンチを作成した。task 文を使用してVHDL の procedure 文の時と同様に書いてみた。
PS/2のクロック間隔は、'1'の期間が40us、'0'の期間が40us のクロックと、VHDLと同じとした。task 文には入力8ビット幅のスキャンコードだけがアサインされている。出力は直接信号に出力される。

`default_nettype none
`timescale 1ns / 1ps

module ps2read_tb;

    parameter CYCLE=20;

    reg clk, reset, ps2clk, ps2data;
    wire [7:0] scandata;
    
    ps2read ps2read_inst (
        .clk(clk),
        .reset(reset),
        .ps2clk(ps2clk),
        .ps2data(ps2data),
        .scandata(scandata)
    );
    
    initial begin
        clk <= 1'b1;
    end
    always #(CYCLE/2)
        clk <= ~clk;
    
    initial begin
        reset <= 1'b1;
        ps2clk <= 1'b1;
        ps2data <= 1'b1;
        
        #80; // リセット
        reset <= 1'b0; // リセット解除
        PS2_SigGen(8'h1C);
        PS2_SigGen(8'h32);
        #500;
        $stop;
    end
    
    task PS2_SigGen;
        input [7:0] input_code;
        integer i;
        begin
            ps2clk <= 1'b1;
            ps2data <= 1'b0; // Stop bit
            
            #40000;
            ps2clk <= 1'b0; // 立ち下がりエッジ
            #40000;
            
            for(i=0; i<=7; i=i+1) begin
                ps2clk <= 1'b1; // 立ち上がりエッジ
                ps2data <= input_code[i]; // シリアルデータ出力
                
                #40000;
                ps2clk <= 1'b0; // 立下りエッジ
                #40000;
            end
        
            ps2clk <= 1'b1;
            ps2data <= !(^input_code);
        
            #40000;
            ps2clk <= 1'b0; // 立ち下がりエッジ
            #40000;
        
            ps2clk <= 1'b1;
            ps2data <= 1'b1; // Stop bit
        
            #40000;
            ps2clk <= 1'b0; // 立ち下がりエッジ
            #40000;
            ps2clk <= 1'b1; // 1に戻す
        end
    endtask
endmodule


ModelSimでシミュレーションしてみた。
wave表示で、MAIN_STATE表示するときには、そこを右クリックして、Radix -> ASCII を選択するとステート名で表示することができる。
keyboard_verilog_2_071008.png

さらにVeritak でも確かめてみた。
keyboard_verilog_1_071008.png


2007/10/13 : PS/2インターフェースのパリティが偶数パリティだったので、奇数パリティに変更しました。
2007/10/15 : ps2clkの1クロック遅延で比較していたので、ps2dataも1クロック遅延しました。ここでは、50MHzでサンプリングしているので大して変わりませんが、もっとサインプリングレートを低くしたときに効いてきます。
  1. 2007年10月08日 13:02 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0

ウッドデッキのペンキ塗り

penki_1_071007.jpg

今日は、天気が良いのでウッドデッキのペンキ塗りをした。
ウッドデッキは、作って7年くらいになる。2年に一回くらいは塗ろうと思っている。以前はランバーカラーのアップルグリーンという色だったが、いつも購入しているホームジョイ本田が標準で扱わなくなり、取り寄せになってしまった。これでは困るので、オーソドックスなキシラデコールの106番、タンネングリーンを買ってきて塗ることにした。
実は今年5月に買ってきてあったのだが、塗る前に腕を骨折してしまって、延び延びになっていた。やっと、腕も治って、塗装にもいい季節になってきたので、再塗装した。
といっても、仕事は雑で、コケだけざっと落としてから、もう塗ってしまった。本当は2回塗りがいいとのことだったが、面倒なので1回塗りになった。
一応、ローラーと刷毛を用意して塗っていった。やっていると下の娘がやりたいといってきたので、邪魔かなと思ったのだが、せっかくやってくれるというので、ローラーをお願いしてやってみたところ、案外、使い物になった。2人で楽しくぬれてよかった。(後で、お小遣いを要求されて200円払ったが。。。)
しかし、キシラデコール1.6Lでは足りずに、もう1缶買ってきて、半分くらい使ってしまった。結構、木は吸い込むので塗料がより必要なようだ。
失敗したことといえば、キシラデコールの攪拌が甘くて、残りの塗料が濃くなってしまったことだ。かなり色がむらになった。本当に良くかき回さないとだめなようだ。
penki_2_071007.jpg

  1. 2007年10月07日 22:54 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

雙峰祭へ行ってきました

今日は筑波大学の学園祭(雙峰祭)へ行ってきました。結構、人が出ていました。
やはりメイン会場の第1エリアや松美池あたりは人でいっぱい。
いろいろ買いましたが、チュロスは200円、ちょっとミスタードーナツで売っているのよりしょぼいです。値段は高い。学生さんがやっているので少し焦げ気味でした。まあ、これはお祭りのご愛嬌ということで。。。
中3の娘は、お友達と一緒に回っていました。やはり、もう家族と行くより友達との法がいいようです。私は残りの家族と行きました。息子が帰りたがったので、早々に帰ってきました。やはり、大きくなると一緒に行くのは難しいですね。
写真ははずれの第3エリア辺りです。
souhosai_071006.jpg

ロボコンもやっていまして、みていきました。なかなか課題をクリアするロボットはなかったですが、興味深く見てきました。
robocon_071006.jpg
  1. 2007年10月06日 21:40 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

PS/2キーボードインターフェース用テストベンチ(procedure使用)のアサーションのようなもの

PS/2キーボードインターフェース用テストベンチ(procedure使用)でPS/2キーボード用のプロコルにしたがってクロックとデータを出力する procedure を作成した。とてもうまく行って満足している。(本当は未熟なのかもしれないが、何かおかしいところがあったらご指摘ください)
アサーションに関する本を読んでいて、PSLやOVLはまだ良く感じがつかめない。本を読んで、読んで勉強中だが、進み方は亀のようである。(私の歩みはのろいが、亀は決して遅くない、うちでは亀と散歩中に、ちょっと目を放した隙に逃げられている。しかも2匹もだ。。。)
というわけでアサーション専用言語はまだまだだが、PCI-Xの規格に合わないところをリポートするのに使えそうだと思っている。例えば、FRAME#が'0'になってからリトライや、スプリット応答を返すには8クロック以内、データを返すならば16クロック以内という規格があるが、それを検出するVHDLコードをテストベンチに入れておけば、PCI-Xモジュールを修正後に、規格から外れてしまう危険を防止できそうだ。
”PS/2キーボードインターフェース用テストベンチ(procedure使用)”に簡単なアサーション(と言えるかどうかわからないが。。。)を追加してみた。
以前は、

        PS2_SigGen(x"1C", ps2clk, ps2data);
        PS2_SigGen(x"32", ps2clk, ps2data);


だったところを、上に

signal testcode : std_logic_vector(7 downto 0);


を宣言して、下のように修正した。

        testcode <= x"1C";
        PS2_SigGen(testcode, ps2clk, ps2data);
        if testcode /= scancode then
               report "scancode Error!"severity FAILURE;
        end if;
        
        testcode <= x"32";
        PS2_SigGen(testcode, ps2clk, ps2data);
        if testcode /= scancode then
               report "scancode Error!"severity FAILURE;
        end if;


これで、PS/2プロトコルで送ったデータと、PS/2インターフェースでパラレルにしたデータがあっているかどうかを比べられるはずだ。
とりあえずこれで、2ms シミュレーションしてみた。
assertion_test_wave1_071004.png

これだと、PS/2キーボードインターフェース用テストベンチ(procedure使用)と同じなので、最初の procedure を以下のように変更してわざとエラーが出るように変更した。

        testcode <= x"1C";
        PS2_SigGen(testcode, ps2clk, ps2data);
        if testcode+1 /= scancode then
               report "scancode Error!"severity FAILURE;
        end if;


変更しコンパイル、リスタート、2ms シミュレーションを行ったら、途中でシミュレーションが終了した。
assertion_test_wave2_071004.png

Transcriptペインに出力されたログを見ると、エラーメッセージが出ていた。これでミスっていたらシミュレーションがとまり、エラーが出ることがわかった。
assertion_test_Trans1_071004.png

このように、テストベンチにアサーション?を組み込んで行こうと思った。

ちなみに、シミュレーションがブレークするレベルは選択できる。それはModelSimの Simulate -> Runtime Options... を選択する。
assertion_test_ModelSim1_071004.png

Runtime Options ダイアログが開くので、Assertions タブをクリック。
assertion_test_ModelSim2_071004.png

Failureにボタンが選択されていると思う。今は severity FAILURE; なので、シミュレーションがストップしているが、矢印のFatalにするとシミュレーションが停止せずに、前のシミュレーションのように、2ms まで行われる。
assertion_test_ModelSim3_071004.png


ここは違うんじゃないか、とかのご指摘待っています。なにしろ、アサーションやったことないもんで。。。

2007/10/12 : PS/2インターフェースのパリティは奇数パリティだったため、ModelSimのwave波形を修正しました。
  1. 2007年10月04日 20:49 |
  2. アサーション事始め
  3. | トラックバック:0
  4. | コメント:4

下の娘の誕生日

今日は下の娘の誕生日だった。
奥さんが自家製ピザを焼いた。今日は、いつも、オーブンの温度を250度で焼くところ200度で焼いたので、水っぽくなく仕上がったと言っていた。たしかに今日のは、いつもよりおいしかった。下のピザ生地はパン焼き器で練ったパン生地で、その上に、具を載せてある。ちなみにうちの朝食用のパンはほとんど、奥さん(パン焼き器)が焼いている。
家族だけだったが、楽しいお誕生会だった。
うちはケーキはホールケーキではなく、一人一人にショートケーキだ、何故かというと、好きなケーキがそれぞれ違うからだ。それが平和な解決。
piza_071003.jpg
cake_071003.jpg
  1. 2007年10月03日 22:13 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4

”カテゴリの目次”の目次

カテゴリの目次は便利だが、後ろのほうのカテゴリは、何度もページをめくらないと目次が出てこない。そこで目次の目次を作ることにした。いわばポインタへのポインタ、ハンドルですね。

”カテゴリの目次”の目次、 FPGAリテラシーおよびチュートリアル、 プリント板の作成過程、 StateCADの使い方、 Spartan3E Starter Kit

Virtex4のお勉強、 PSoC、 FPGAからクロック出力、 Xilinx ISEについて、 CADツール

QuartusⅡ、 Virtex5のお勉強、 VGAコントローラ、 Chipscope、 UCFの書き方

Floorplannerの使い方、 シミュレーション、 PCI、 Timing Analyzerの使い方、 FPGAチップ内の配線方法

その他のXilinxツールについて、 入門Verilog、 DDR SDRAMコントローラ、 VHDLの書き方、 FPGA Editorの使い方


PACEの使い方、アサーション事始め
  1. 2007年10月03日 20:18 |
  2. カテゴリ別の目次
  3. | トラックバック:0
  4. | コメント:0
»