FC2カウンター FPGAの部屋 2006年05月

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

FPGAの部屋

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

Spartan3Eの入力用プログラマブル遅延素子(おまけ)

Spartan3Eの入力用プログラマブル遅延素子(おまけ)はDCMを使ってインプリメントしてみた。
結果はやはりOBの内容を見るとIFD DelayがDLY2にチェックが入っている。IFD_DELAY_VALUE=2が入っている。
予想された結果だった。
ただし、DCMが入っているのでホールド時間に不安がないのでIFD_DELAY_VALUE=0にしても問題がないようである。
DCMが入っていなくてもTiming Analyzerでしっかり確認して、0にしても大丈夫なようであればOKであろう。
ディフォルトの状態(IFD DelayがDLY2)でのrot_a入力のセットアップ時間をTiming Analyzerで見てみた。
Spartan3E_IOB_Delay_11_060531.png

DCMでクロックの位相が戻されてわずかにマイナスになっている。これだとデータのホールド時間は十分満足するがセットアップ時間が長くかかるようになる。
そこでIFD_DELAY_VALUE=0にして、IFD_DELAYをキャンセルしてみる。
Spartan3E_IOB_Delay_12_060531.png

そうするとセットアップ時間が短くなった。よってデータシートにあるようにDCMを実装してある時にはIFD_DELAY_VALUE=0にしてもデータホールド時間が足りなくなることは考えにくいようだ。
  1. 2006年05月31日 05:46 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:0

Spartan3Eの入力用プログラマブル遅延素子2

Spartan3Eの入力用プログラマブル遅延素子2でIBUF_DELAY_VALUEの値に対する遅延量を調べてみた。
まずは入力から出力につなぐだけのVHDLファイルを作ってインプリメントした。

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

entity IBUF_Delay_Test is
Port ( input : in STD_LOGIC;
delay_output : out STD_LOGIC;
output : out std_logic);
end IBUF_Delay_Test;

architecture Behavioral of IBUF_Delay_Test is

begin
delay_output <= input;

end Behavioral;


インプリメントが終了したら、Timing Analyzerを起動して、ツールバーの右から5番目の砂時計マーク(Analyze against Users Paths by defining Endpoint)をクリックする。
後の詳しいやり方はISEで任意のパスのディレイを見る方法を見てほしい。そこでinputからdelay_outputまでの遅延を見る。
Spartan3E_IOB_Delay_7_060529.png

入力用IOBの遅延は1.300nsであった。
次にFPGA Editorを立ち上げて入力用IOB(input)の配線を見てみると遅延素子はすべてスルーされている。
Spartan3E_IOB_Delay_8_060529.png

次にUCFファイルにIBUF_DELAY_VALUEを追加してみよう。

NET "input" IBUF_DELAY_VALUE = 1;


先ほどと同様にTiming Analyzerで入力用IOBの遅延を見てみよう。
Spartan3E_IOB_Delay_9_060529.png

入力用IOBの遅延は5.689nsに増えていた。
同様にFPGA Editorを立ち上げて入力用IOB(input)の配線を見てみるIBUF_DELAYに配線されている。
Spartan3E_IOB_Delay_10_060529.png

次に2から13までIBUF_DELAY_VALUEを変えてインプリメントしてみた。下に表を示す。

IBUF_DELAY_VALUE= 0 入力IOBの遅延 1.300ns
IBUF_DELAY_VALUE= 1 入力IOBの遅延 5.689ns 差分 4.389ns
IBUF_DELAY_VALUE= 2 入力IOBの遅延 5.935ns 差分 0.249ns
IBUF_DELAY_VALUE= 3 入力IOBの遅延 6.246ns 差分 0.311ns
IBUF_DELAY_VALUE= 4 入力IOBの遅延 6.620ns 差分 0.374ns
IBUF_DELAY_VALUE= 5 入力IOBの遅延 6.844ns 差分 0.224ns
IBUF_DELAY_VALUE= 6 入力IOBの遅延 7.230ns 差分 0.386ns
IBUF_DELAY_VALUE= 7 入力IOBの遅延 7.863ns 差分 0.633ns
IBUF_DELAY_VALUE= 8 入力IOBの遅延 8.378ns 差分 0.515ns
IBUF_DELAY_VALUE= 9 入力IOBの遅延 8.689ns 差分 0.311ns
IBUF_DELAY_VALUE=10 入力IOBの遅延 9.063ns 差分 0.374ns
IBUF_DELAY_VALUE=11 入力IOBの遅延 9.287ns 差分 0.224ns
IBUF_DELAY_VALUE=12 入力IOBの遅延 9.673ns 差分 0.386ns
IBUF_DELAY_VALUE=13 入力IOBの遅延 1.300ns


Xilinxのアンサーデータベース、アンサー #22368 Spartan-3E - 入力遅延エレメントを使用する際の注意点を見ると13以上は使えないようだ。
遅延時間の差が大きいのは0と1の間で、値は4.389nsだ。次に6と7の間が0.633nsと大きい。やはりこの辺でInitial Delayが入るのだろうか?
でもFPGA Editorで見た限りでは8でInitial Delayが入るようだ。下がIBUF_DELAY_VALUE= 8の場合の入力用IOB(input)の配線が下の図だ。
Spartan3E_IOB_Delay_val8_060529.png


やはりIBUF_DELAY_VALUEもTiming Analyzerで見る限りはタップで遅延が結構変化するようだ。
  1. 2006年05月29日 19:26 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:0

Spartan3Eの入力用プログラマブル遅延素子

いまSpartan3E Starter KitのDDRコントローラを作成中だが、Spartan3Eで新たに加わった入力用プログラマブル遅延素子が気になっているのでちょっと使ってみようということで調べてみた。
Spartan3Eのデータシートの11ページによると、0~6000psの間で遅延を挿入できるそうだ。
IOBのFFを使う場合は500psタップでIOBのFFを使わない場合は250psタップで遅延素子を挿入できるそうだ。250psのタップが7タップあるそうだ。それに加えて4000psのInitial Delayがあるようだ。(下図Spartan3Eのデータシートの11ページの図6参照)
Spartan3E_IOB_Delay_1_060528.png

遅延値はコンフィギュレーション時に決定しデバイスの動作中には設定できないそうである。これではダイナミックに遅延量を変更することができない。DDR SDRAMのデータ受信用にデータを遅延させるとしても基板やチップの遅延値から計算した遅延を設定するしかないようだ。ダイナミックに遅延を測定して、ちょうど良いところに設定するという方法は取れないことになる。
次にSpartan3Eのデータシートの11ページには、こう書いてある。

入力遅延エレメントは、グローバル クロックを使用した入力フリップフロップを使用する際に、ホールド タイムが 0 になるようにするために使用します。 必要な値は、デバイス サイズに応じてザイリンクス ソフトウェアにより選択されます。 クロック パスに DCM が使用される場合、遅延エレメントは 0 に設定しても問題ありません。この場合でも、ホールド タイムは 0 になります。


引用終わり。
これによるとデバイスサイズ応じてISEによってIOBのDelayが自動的に決定されるそうだ。
本当なのだろうか? いままでもVirtex2でクロックが遅れてホールド時間が不正になった場合にはIOBのDelayを入れてホールド時間を稼いだことがあった。
この前のロータリースイッチのプロジェクト、RotarySW_LCDプロジェクトで見てみよう。
rot_a入力を見てみることにしよう。
ISEからFPGA Editorを起動する。起動したらList1ウインドウからrot_aを選んで選択する。Zoom SelectionアイコンをクリックしてIOBの内容を表示してみよう。
FPGA Editorの使い方は”FPGA Editorの使い方1”を見てほしい。
Spartan3E_IOB_Delay_2_060528.png

IOBの内容を見るとIFD DelayがDLY2にチェックが入っている。DCMを使用しないとxc3s500e-4fg320はDLY2が入るのだろうか?
reset以外の入力はDLY2の遅延が入っているようだ。入力遅延はどのくらいになっているのだろうか。Timing Analyzerで見てみよう。
ISEからTiming Analyzerを起動する。”ISEで任意のパスのディレイを見る方法”を参照してください。
今回はセットアップ時間を測定するので、Timing Analyzerの"Analyze against User Specified Path by defining Clock and IO Timing"(ピンクの丸のアイコン)をクリックする。
Spartan3E_IOB_Delay_3_060528.png

"Analyze against User Specified Path by defining Clock and IO Timing"のダイアログが開く。"Clock/IO"タブで"Port Name"の"rot_a"の所を見ると、"Pad to Setup"に10(ns)を入力し”OK"ボタンをクリックする。
Spartan3E_IOB_Delay_4_060528.png

そうすると"rot_a"のセットアップ時間を表示する。
Spartan3E_IOB_Delay_5_060528.png

入力パッドからIOBのFF間での遅延は6.930ns、クロックの遅延は2.826nsになる。よって、セットアップ時間は4.104nsになっているようだ。
ISE8.1iの制約ガイドの147ページに書いてあるIFD_DELAY_VALUEを0にしてインプリメントをしてみよう。UCFファイルに以下の分を追加してインプリメントしてみた。

NET "ROT_A" IFD_DELAY_VALUE = 0;


クロックパス遅延は変わらないがデータパス遅延は以下のように変わった。

Data Path: rot_a to input_4hex_top_inst/rot_enc_cont_inst/rot_a_node
Delay type Delay(ns) Logical Resource(s)
---------------------------- -------------------
Tiopick 2.540 rot_a
rot_a_IBUF
input_4hex_top_inst/rot_enc_cont_inst/rot_a_node
---------------------------- ---------------------------
Total 2.540ns (2.540ns logic, 0.000ns route)
(100.0% logic, 0.0% route)


6.930ns - 2.540ns = 4.390nsの差だった。4nsを超えているので以前のものはInitial Delayが入っているのかと思ったが、そうではないようだ。今回はIF_Delayも通っていないようだ。
Spartan3E_IOB_Delay_6_060528.png

IFD_DELAY_VALUEは0~8まであるのでやってみる。結果は以上のとおりである。

IFD_DELAY_VALUE=0 の時rot_aデータパス遅延は2.540ns
IFD_DELAY_VALUE=1 の時rot_aデータパス遅延は6.245ns 差分 3.705ns
IFD_DELAY_VALUE=2 の時rot_aデータパス遅延は6.930ns 差分 0.685ns
IFD_DELAY_VALUE=3 の時rot_aデータパス遅延は7.540ns 差分 0.610ns
IFD_DELAY_VALUE=4 の時rot_aデータパス遅延は8.688ns 差分 1.148ns
IFD_DELAY_VALUE=5 の時rot_aデータパス遅延は9.373ns 差分 0.685ns
IFD_DELAY_VALUE=6 の時rot_aデータパス遅延は9.983ns 差分 0.610ns
IFD_DELAY_VALUE=7 の時rot_aデータパス遅延は2.540ns
IFD_DELAY_VALUE=8 の時rot_aデータパス遅延は2.540ns


IFD_DELAY_VALUE=7は一時10.???nsと出たときもあったのだが、もう2回やってみたら2.540nsだった。
8の時も2.540nsだし、怪しいところはあるが7以上は遅延が入らないようだ。Timinig Analyzerの結果がおかしいのかもしれないが、どういう基準で遅延量が決まるのかが良くわからない。
とりあえずこれではDDR SDRAM用の遅延回路は組めないようだ。今度は0~16まで変化できるIBUF_DELAY_VALUEについて調べてみようと思う。いずれにせよコンフィグ時に固定だが、こっちはきちんと計算できればDDR SDRAMのデータ受信用に使えるだろうか?

Xilinxのアンサーデータベース、アンサー #22368 Spartan-3E - 入力遅延エレメントを使用する際の注意点を見ると7と8は使わないでくれと書いてあるようだ。
このアンサーを良く見ると0-3と4-6の組み合わせに分かれるようだ。道理で3と4の間の遅延が多い。4-6の方にはInitial Delayが入っているのだろう。(FPGA Editorではそうは見えないが)

その後、5と6はFPGA Editorで見るとInitial Delayが入っているように見えることがわかった。
  1. 2006年05月28日 08:57 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:0

ポルトガル出張3(2002年7月~8月)

最後に私が行ってきたポルトガルはリスボンの観光地を書いてみたいと思います。
最初にクリスト・レイです。テージョ川の岸に巨大なキリスト像が両腕を広げて立っています。台座の棟の中にはエレベーターがあって、キリストの足元まで登ることが出来ます。中のショップではおみやげ物が売っていて、キリスト教ものとかもありました。
portgual18.jpg

クリスト・レイのキリスト像(後ろ向きで失礼します)

4月25日橋は友人の家から職場に行くのにも良く通りましたが、美しい橋です。最初は独裁者の名前にちなんで、サラザール橋と呼ばれていたそうですが、革命が成功した記念に、革命を起こした日にちを橋の名前にしているそうです。
portgual19.jpg

4月25日橋と私

発見のモニュメントはポルトガル人が世界のいろんな土地を発見した年がモニュメントの前の広場にかかれています。ちなみにポルトガル人が日本を発見したのは、1541年だそうです。
portgual20.jpg

発見のモニュメント
portgual21.jpg

発見のモニュメントの前の広場(日本の地図に書かれているは、ポルトガル人が日本を発見した年)

ベレンの塔は、16世紀始めマヌエル1世の命により、船の出入りを監視する要塞として立てられたそうです。3階は王族の居室、2回は砲台、1階は水牢だったそうです。白いきれいな建物です。上に行くほど狭い階段で、すれ違うのが大変でした。天井には紋章が入っていて、これを見るとルパン3世のカリオストロの城を思い出します。
portgual22.jpg

ベレンの塔
portgual23.jpg

ベレンの塔の天井の紋章

ジェロニモス修道院はとても立派な建物です。特に中庭がきれいです。彫刻された建造物を見ていると、ルパン3世のカリオストロの城を思い出します。近くで見ると、石灰岩に彫ってあるので、左甚五郎の眠り猫の比べると彫刻が荒い気がしますが、ちょっと離れるととても見事です。
portgual24.jpg

ジェロニモス修道院
portgual25.jpg

ジェロニモス修道院(中庭)

コルメシオ広場です。このときは、とても暑かったです。多分35度くらいはあったでしょう。
portgual26.jpg

お城に行きました。サンジョルジェ城です。城の敷地は公園になっています。高台にあって眺めもよく、とても素敵な公園です。
portgual27.jpg

サンジョルジェ城
portgual28.jpg

サンジョルジェ城公園からの眺め(とてもいい眺めです)

これで終わりです。
  1. 2006年05月26日 18:22 |
  2. 旅行記
  3. | トラックバック:0
  4. | コメント:2

ポルトガル出張2(2002年7月~8月)

この辺でポルトガルはリスボンの町の様子をお話したいと思います。
 歩道はほとんど白い石畳です。石はコンクリートで固めてなくて、ただおいてあるだけなので所々抜けています。
portgual11.jpg

石畳の歩道

 ポルトガルはアズレージョという柄つきタイルが有名です。地下鉄の壁とか、塀とかに絵が書かれているように見えますが、小さい柄つきタイルを張り合わせて、絵にしています。
portgual12.jpg

地下鉄の壁です。
portgual13.jpg

向こうの壁がタイル画です。

 ポルトガルの食べ物は日本人の口に合うと思います。スペインが近いからかパエリアみたいなのもあります。いわしの炭火焼がおいしく、サルディーニアというそうですが、とってもおいしいですよ。もう一回食べたいです。サラダもオリーブオイルがかかっていて、おまけに岩塩がふりかけてあるのにはびっくりしました。サラダを食べていたらがりっとしたので、何かと思ったら塩でした。これには少し参りました。塩辛いしね。このサラダは好きじゃありません。レストランに入るとパンも出てきますが、それにつける物も、いわしやツナ、アサリのパテなどです。一番、いわしのパテがおいしいと思いました。今でも、日本で購入してパンにつけて食べてます。おいしいですよ。
portgual14.jpg

サルディーニア、チーズの脇に載っているのが各種パテ、赤いのがいわし、緑のがツナ

 チーズはおいしいのもあるんですが、とてもくさくて食卓に乗せないでくれと懇願したくなるチーズもあります。我慢して食べれば、おいしいのですが、ちょうど日本のくさやのような物ですね。
portgual15.jpg

これは鮭ですね。奥の飲み物はパンチです。ワインとなにか混ざった、飲みやすいけど酔っ払う飲み物です。

 町は街路樹が植えられていますが、これが豆みたいなのがなっていました。日本では見たことないので、不思議な感じでした。あれはなんという名前の木なんでしょう? 町の中にはゴミ箱があって24時間入れても良いとのことでした。燃えるゴミとビードロ(つまりガラス瓶)となにかでした。家々は白い壁にオレンジの屋根に統一されている感じでした。高い所から眺めると、本当にいい眺めでした。家の色が統一されているので、決まっています。
portgual16.jpg

家並みの様子
  1. 2006年05月25日 20:44 |
  2. 旅行記
  3. | トラックバック:0
  4. | コメント:0

ポルトガル出張1(2002年7月~8月)

ホームページのコンテンツをブログに移動しようと思っています。これは古いですが2002年にポルトガルに行った時の旅行記です。

 2002年の7月19日から8月5日まで、ポルトガルに出張に行ってきました。
 共同研究してるP社のYさんがいるポルトガルに行って、打ち合わせと共同開発をしてきました。
 7 月19日に、エールフランスAF275便で12時25分に成田から出発、同じ日の17時40分にフランス、パリのシャルルドゴール空港に着きました。到着するフロアはFで、ポルトガルのリスボンへの乗り継ぎも同じフロアから出るはずでしたが、どう間違ったのかCフロアに到着しました。シャルルドゴール空港は取っても広く、CフロアからFフロアは歩いてはいけません。途中にTGVという鉄道があって、バスでしかいけませんでした。あまり、海外経験のない私は早速ピンチ、フランス語も英語もろくに出来ません。
 機内で日本人のスチワーデスさんに、バスの載り方を聞いて、どきどきしながら、飛行機を降りました。バス乗り場はすぐにわかり、同じ理由でバスを待つ日本人の人もいました。バスが来たので、”このバスFターミナルに行く?”と運転手さんに聞いて、”行くよ”とのことなので、乗り込みました。このアクシデントも良かったです。なぜならば、走っている途中で、コンコルドを見ることが出来ました。今ではコンコルドは退役していて、空港では見ることが出来ません。退役する前に見れて良かったです。
 そうこうしながら、バスはFターミナル到着、乗り換えに2時間近くあってよかった。Fターミナルから今度はまた、バスに乗ってポルトガルのリスボン行きの飛行機に乗りました。前の飛行機はボーイング 747ジャンボジェット機でしたが、今度はA~のヨーロッパ製の小さな機体、少し不安になりました。やはり、小さな機体のほうが、上昇が急です。飛行機が嫌いな私にはこれはきつい。
 2時間30分ほどして、リスボンに到着しました。成田からの合計搭乗時間14時間50分、疲れました。
 到着するとP社のYさんが出迎えてくれました。感謝。お友達の車で自宅まで送ってくれました。これからは、P社のYさん宅にお邪魔します。
portgual1.jpg

Yさんのアパートから外を見た所、落書きがたくさんあります。

 平日は当然ながら、仕事なので、休日にいろんな所に連れて行ってもらいました。車で案内してくれたのが、P社の社長さんのお兄さんのルイさん、本当の発音はクォイのような感じだそうですが、とても日本人に発音できないので、ルイさんと呼んでいるそうです。(Yさん談) はじめに、ビーチに連れて行ってもらいました。ヨーロッパの人はそうなんでしょうが、夏にどこかに行くというとビーチみたいです。道を歩いていると、しみだらけのおじさん、おばさんとかも歩いていて、ビーチが好きだし、余り日焼けの手入れもしていないみたいです。日焼けして真っ赤かの人もよくいました。
portgual2.jpg

ビーチの様子1

portgual3.jpg

ビーチの様子2

 びっくりしたのが、ビーチの海の家でゆでカタツムリが売っていることです。さらに大盛りで出てきます。日本にいるカタツムリの小ぶりのものに良く似ています。食べろといわれて、躊躇したんですが、1個食べてみました。そうしたら、にんにく味でおいしかったです。カタツムリは陸にいる貝なので、ちょうどバイガイ食べてるような感じなんでしょう。でも海の家にもあるというとは、よほどポピュラーに食べられているんでしょう。
portgual4.jpg

カタツムリのにんにく風味

テージョ川の連絡船

 リスボンをながれるテージョ川には連絡船が運航しています。車も乗れるフェリーです。テージョ川は川といってもとっても広くて、川とは思えません。連絡船も涼しい風を受けながら、乗ることが出来てとっても気持ちが良いです。ポルトガルは地中海性気候の性か、温度は高いのですが、とても湿度が低く、日陰は涼しいです。湿度が低いので、夏でも木の下には枯葉があります。低湿度のため枯れてしまう葉っぱがあるんですね。日本では考えられません。
portgual5.jpg

連絡船の風景

portgual6.jpg

連絡船の風景2(後ろに見えるのは4月25日橋)

portgual7.jpg

連絡船から見た対岸

ショッピングセンター

リスボンには大きなショッピングセンターがいくつもあります。下の写真はそのうち、日本でも良く知られいている名前のヴァスコ・ダ・ガマショッピングセンターです。いろいろなお店が入っていて、見ているのがとても楽しいです。専門店街なので、有名な下妻ジャスコというよりはララガーデンといった所です。(すみません、ローカルねたで。)
portgual8.jpg

ヴァスコ・ダ・ガマ・ショッピングセンター

portgual9.jpg

多分コロンボ・ショッピングセンターだと思います。豪華です。

portgual10.jpg

同じくコロンボ・ショッピングセンター(バーガーキングが見えます。マクドナルドもやはりありますよ)
  1. 2006年05月24日 21:57 |
  2. 旅行記
  3. | トラックバック:0
  4. | コメント:0

ハリーポッター第6巻

ハリーポッター第6巻を読み終わりました。

またまた大事な人が死んでしまいました。
しかもあの人に殺されましたね。
なぞのプリンスがあの人とは思いませんでした。
あまりねたばれしないように、これしか書きませんが。。。
なかなか面白かったです。第7巻はどうなるのでしょうか? 今から楽しみです。

その後、ゲド戦記を読み始めました。これもなかなか面白そう。
なかなかDDR SDRAMコントローラが進みませんね。。。
  1. 2006年05月24日 21:14 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

ISE8.1iSP3の不便なところ

ISE8.1iを使っていて前のバージョンに比べていいところもいっぱいあるのだが、不便だと思っているところもある。
それは、1つは日本語を使っていると時々化けていることだ。
もう1つは以前バージョンではプロジェクトをフォルダごとコピーしてテストバージョンを作るということをやっていた。インプリメントが数時間かかると変えたときに元に戻すのが大変だからだ。
そのためにSourcesウインドウをToggle Pathsで相対パスにしていた。そうすると以前のバージョンでは相対パスでコピーしたプロジェクトからの相対パスでソースを指定できた。
ISE8.1iではプロジェクトをフォルダごとコピーして違う名前をつけても元のソースファイルへのパスを張ってしまうようだ。
つまりRotary_input_LCDをコピーしてRotary_input_LCD_tempにすると、これが
ISE81i_sources_1_060523.png

こうなってしまう。
ISE81i_sources_2_060523.png

コピー元にファイルが参照されている。これだとテストバージョンでファイルをいじって直したつもりで元ファイルを直してしまう。これはまずい。
スナップショットなどを使って、バージョン管理をしなくてはいけないかも。。。

話は変わるがPicoBlazeアセンブラ用のPeggyのキーワード定義ファイルを作ってみた。まだCALL NZなどのスペースが入ったキーワード定義の書き方が良くわからないが、とりあえず色分けできるようになった。もう少しうまくできたら、要望があればダウンロードできるようにしようかと思う。
  1. 2006年05月23日 19:58 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:2

ポピー祭り

今日は一番下の娘が小貝川ふれあい公園に行きたいといったので、行ってきた。今はポピー祭りでポピーの花盛りだった。
poppy_1_060521.jpg

poppy_2_060521.jpg

テントでイベントや太鼓の実演をしていたようだが時間が遅かったので、もう終わってしまっていた。来週末も見ごろだと思われる。
  1. 2006年05月21日 18:26 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

レッツノートY4

このごろレッツノートY4を使っているが、ISEをインプリメントしていて30分もCPU使用率100%で動かしていると、ものすごく熱くなる。心配して監視ツールを入れてみたら90度くらいになっているようだ。熱暴走が心配である。
基本的にファンがないレッツノートはISEのインプリには向かないのかもしれない。
コンパックのモバイルPen4 1.8GHzは2日くらいCPU使用率100%でも大丈夫だったのだが。でも廃熱はドライヤーの温風程度に熱かった。今はハードディスクが壊れているが、それで壊れたのか?
  1. 2006年05月21日 07:44 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

スパルタン3Eスタータキットのロータリーエンコーダ2

スパルタン3Eスタータキットのロータリーエンコーダの回路の説明をしようと思う。
ISE8.1iのSourcesペインは以下の図のとおりだ。
Rotary_Encoder_2_060519.png

以前のLCD回路からではinput_4hex_top.vhdとrot_enc_cont.vhd、swdiv.vhd, rotsw_sm.vhd, input_4hex_val.vhd, in4hexsm.vhdが増えている。
swdiv.vhdはスイッチのチャタリングをとるために1msごとにイネーブルを出す回路だ。
rotsw_sm.vhdがロータリーエンコーダの制御回路でここへの入力はswdiv.vhdでチャタリングを除去したパルスが入る。rotsw_sm.vhdのステートマシンは以下の図のとおりにAのパルスが1になってからBのパルスが入るとright_pulseが1になる。逆にBがはいってからAが入るとleft_pulseが1になる。もう1つのステートマシンはロータリーエンコーダのセンタースイッチを押した時に1パルスを出すステートマシンである。
2006.05.20 06:15 センタースイッチのステートマシンに非同期RESETが抜けていました。追加するかもしくはもう一度ZIPファイルをダウンロードしてください。
Rotary_Encoder_3_060519.png

その上のrot_enc_cont.vhdにはswdiv.vhdのイネーブルを使ってチャタリングを除去するためのDFFがインスタンスしてある。
input_4hex_val.vhdとその下のin4hexsm.vhdは、最初のLCDのカーソルをロータリーエンコーダの右、左の情報で動かそうとした。そのためPicoBlazeにハンドシェークでデータを渡そうとした。right_levelを回路側で1にして、PicoBlazeが受け取ったらright_ackを返す予定だった。(leftも)でも、カーソルが大きくてブリンクしてもキャラの見栄が悪いし、結局今のところ使用していない。

PicoBlazeの入出力ポートも以下のように拡張した。

PicoBlazeの出力ポート仕様
* ポート番号0 : LCD_RWの値(bit0), LCD_RSの値(bit1), 4bit access(bit2), それ以上のビットは空き
* ポート番号1 : 書き込みデータ8ビット。(キャラクタ)読み出しの場合もダミーデータをここに書く。
* ポート番号2 : インターバルタイマー設定値8ビット。50MHzクロックをあらかじめ12ビットのカウンタで分周しているので、1を設定すると82usカウントする。
* ポート番号3 : right_ackを出力
* ポート番号4 : left_ackを出力

PicoBlazeの入力ポート仕様
* ポート番号0 : LCDから読み出したデータ8ビット
* ポート番号1 : インターバルタイマー・タイムアウトフラグ(bit0), LCD操作ステートマシン終了信号(bit1), それ以上は空き
* ポート番号2 : 外から入力されたデータを読むポート、upper_4hex_data(15 downto 8)
* ポート番号3 : 外から入力されたデータを読むポート、upper_4hex_data(7 downto 0)
* ポート番号4 : 外から入力されたデータを読むポート、lower_4hex_data(15 downto 8)
* ポート番号5 : 外から入力されたデータを読むポート、lower_4hex_data(7 downto 0)
* ポート番号6 : ビット0はright_level、ビット1はleft_level、ビット2はcursor_move, ビット7~4はカーソル位置


それに応じてLCD4HexDisp.vhdの対応する回路も増やしてある。
instrom.psmは上の行にカウントアップ、ダウンする桁の番号とステータス、それにモードをMとCで表示するルーチンを付加してある。その部分を下に示す。

LOAD s2, 20 ; スペースを1個書く
CALL CHAR_DISP

INPUT s3, IN_RL_LEVEL_PORT ; RL_LEVEL_PORTの値を2つのキャラクタで書く
CALL 2CHAR_DISP ; 8ビットを2つのASCIIキャラクタにして出力する

LOAD s2, s3
AND s2, CURSOR_MOVE_POS ; CURSOR_MOVEが1かどうかをチェック
LOAD s2, 4D ; 'M'キャラクタ
JUMP NZ, M_CHAR_DISP ; CURSOR_MOVEモードなので'M'キャラクタを表示
LOAD s2, 43 ; Countモードなので'C'キャラクタを表示
M_CHAR_DISP: CALL CHAR_DISP


例によって、PicoBlaze本体を抜いたプロジェクトをここにおいときます。ただし保証はありません。
やり方はスパルタン3EスターターキットのLCD表示回路5を見てください。

これで準備ができたので、次はDDR SDRAMコントローラを組み込んで動くかどうか確かめる。DDR SDRAMコントローラは非公開にすると思う。
  1. 2006年05月19日 20:34 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

スパルタン3Eスタータキットのロータリーエンコーダ1

スパルタン3Eのロータリーエンコーダの回路ができたようだ。
ロータリーエンコーダでLCDの上の行の値を入力するのが目的だ。
仕様としてはCountモードとMoveモードがある。
Countモードではロータリーエンコーダを右に回すとその桁の数字が増え、左に回すと減る。その他の桁には影響を与えない。ロータリーエンコーダを押すとMoveモードになる。Moveモードでは値を入力する桁を移動できる。右に回すと右の桁へ、左に回すと左の桁に移動する。もう一度ロータリーエンコーダを押すとCountモードになり、値を入力できる。
新しいハードはロータリーエンコーダの入力用回路と桁ごとの4ビットカウンタ4つがあり、上の行のデータとしてLCD表示回路につながっている。PicoBlazeとハンドシェークによって信号を伝達する機能も実装してあるが現在は使用していない。
PicoBlazeは上下行の表示と上の行には桁の番号とステータス、それにモードをMとCで示している。
大体うまく行った様だ。これで任意のデータを入力することができるようになった。
今までうまくいかなかった原因としては、ロータリーエンコーダのパルス幅が予想よりも短かったことだ。チャタリングを除くために5msごとにサンプルしていたが、それだとパルスを取りこぼすことがあるようだ。1msごとのサンプルすることにしてOKになったようだ。
Rotary_Encoder_1_060518.jpg

LCDの上の行で"6DB6"がデータ、"13C"の'1'が1桁目を増減、'3'がステータス、'C'がCountモードである。
  1. 2006年05月18日 19:46 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

今日届く予定の本

今日はハリーポッターの6巻ゲド戦記の1巻が届く予定で楽しみだ。
いまはグイン・サーガの107巻を読んでいる。これは壮大な物語だが作者が女性のためか心理描写がくどいところがあるので、その辺は読み飛ばして読んでいる。全体的には面白い。

ロータリーエンコーダの回路はだいぶ進んでハードはだいたい終わって、ソフトに取り掛かった。平日だとやはりなかなか進まない。
本が来てしまうとまた遅れることも考えられるが、こっちもなるべく早く終わらせたい。
  1. 2006年05月17日 05:35 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

スパルタン3Eスタータキットのロータリーエンコーダ、その他お仕事

スパルタン3Eスタータキットのロータリーエンコーダを使用して、この前のLCD表示回路の上の4桁の値を設定する回路を作成中だ。
Xilinxにあるサンプルのロータリーエンコーダのマニュアルを参考に回路を考えている。最初はロータリーエンコーダを回すと桁が移動し、1回ロータリエンコーダを押すと入力モードになって、その桁の数字が増減するという仕様にしようと思っている。

お仕事はやっと基板を作ってもらう段階に入りそうだ。どうもデータバスの波形の悪いのはしょうがないので、だめだったら周波数を落とすことになった。
基板が来るのは楽しみではあるが、ミスがないかどうかこわい気もする。あと、ヒートシンクの取り付け方法などを検討している。
今度作る基板は、今の基板と結構互換性があるので、今までの回路を変更してFPGAに入れてテストすることにした。大体出来上がってシミュレーションでは対向にして通信もできた。だが、まだFLASH ROMのシミュレーションモデルをF社(実際使うメーカは違うのだがVHDLモデルがなかった)からダウンロードしてきたのだが、そのモデルが動作していないようだ。これをデバックしなくちゃ!!!

2006.05.15 : 動かない原因がわかりました。byteモードではアドレスが1本増えてDQ15がA-1になりますが、そこにつなぎ忘れてました。直したら正常動作しました。
  1. 2006年05月14日 11:51 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

スパルタン3EスターターキットのLCD表示回路その後

スタータキットのユーザーズマニュアルに書いてあるLCD操作タイミングとST7066Uのタイミングが違うのではないかというコメントをSimさんからいただいた。
確かにスタータキットのユーザーズマニュアルを見るとST7066Uを使っていると書いてある。
ためしにST7066Uをターゲットにタイミングを書き換えてみた。
ST7066UのE(イネーブル)パルス幅は140nsなので、きりの良い160nsとした。(実際は1クロック遅れるので180nsだが良しとした)
イネーブルクロックのサイクル時間は1.2usなのだが、元から1.28us程度waitしているのでそのままとした。(これはupper 4bit書き込んだ後にlower 4bitを書き込むためのwait時間)

初期化の手順は

1. 40ms待つ
2. 3を書いて37us以上待つ(Function set)
3. 2を書いて、8を書いて37us以上待つ(Function set)
4. 2を書いて、8を書いて37us以上待つ(Function set)
5. 0を書いて、Cを書いて37us以上待つ(Display ON/OFF)
6. 0を書いて、1を書いて1.52ms以上待つ(Display Clear)
7. 0を書いて、6を書いて37us以上待つ(Entry mode set)


実際は37us待つところはインターバルタイマーの粒度の関係から82us程度待っている。
前回からの変更点はLCD_operation.vhdがイネーブルのためのカウントを16から8とした。(160nsカウント)
LCDOPESM.DIAとLCDOPESM.vhdはタイミングの変更に従って、右のステートマシンのみ変更した。
LCD_ST7066U_1_060513.png


instrom.psmの初期化の手順を上の手順に従って変更した。

LOAD s0, F4 ; 20msインターバルタイマーセット
CALL TIMEOUT_CHK

LOAD s0, F4 ; 20msインターバルタイマーセット
CALL TIMEOUT_CHK ; 合計40ms wait

XOR s1, s1 ; s1をクリア LCD_RS, LCD_RW=0
OR s1, ACCESS_4BIT_POS ; 4bitアクセスビットを立てる
OUTPUT s1, OUT_LCD_CTL_PORT
LOAD s2, 03 ; 0x03を書き込む
OUTPUT s2, OUT_LCD_WR_DATA_PORT
LOAD s0, 01 ; 書き込む時間も入れて80us wait
CALL TIMEOUT_CHK

XOR s1, s1 ; s1をクリア LCD_RS, LCD_RW=0, 4bit access bitもクリア
OUTPUT s1, OUT_LCD_CTL_PORT

LOAD s2, 28 ; 8ビットデータ28(Function Set)を書き込む
OUTPUT s2, OUT_LCD_WR_DATA_PORT
LOAD s0, 01 ; 書き込む時間も入れて80us wait
CALL TIMEOUT_CHK

LOAD s2, 28 ; 8ビットデータ28(Function Set)を書き込む
OUTPUT s2, OUT_LCD_WR_DATA_PORT
LOAD s0, 01 ; 書き込む時間も入れて80us wait
CALL TIMEOUT_CHK

LOAD s2, 0C ; 8ビットデータ0C(Display Control)を書き込む
OUTPUT s2, OUT_LCD_WR_DATA_PORT
LOAD s0, 01 ; 書き込む時間も入れて80us wait
CALL TIMEOUT_CHK

LOAD s2, 01 ; 8ビットデータ01(Display Clear)を書き込む
OUTPUT s2, OUT_LCD_WR_DATA_PORT
LOAD s0, 15 ; 書き込む時間も入れて1.65ms wait
CALL TIMEOUT_CHK

LOAD s2, 06 ; 8ビットデータ06(Entry Mode)を書き込む
OUTPUT s2, OUT_LCD_WR_DATA_PORT
LOAD s0, 01 ; 書き込む時間も入れて80us wait
CALL TIMEOUT_CHK

; 初期化終了


この変更をしてインプリメントして実際にやってみたところ、問題ないようである。前の初期化シーケンスと書き込みタイミングが違うが、どっちを使っても問題ないようである。
一応ここにおいておくのでよろしければどうぞ。例によって無保証である。
2006.05.19 注:LCD_sample_for_ST7066U/LCD_4hex_dispフォルダの中のLCD_4hex_disp.ipfを消してください。これを消さないとiMPACTでコンフィギュレーションする場合に絶対パスで指定されたbitファイルを見に行ってエラーとなるようだ。
やはり、ソフトウェアで直すのはハードに比べて楽チンだと思った。

書き忘れていたが、BTN South(RESET)がリセットスイッチだ。ただいまのところ定数しか表示していないので押しても変化なしである。

もう1つ追加。最初にミスって初期化手順のうちの
4. 2を書いて、8を書いて37us以上待つ(Function set)
を忘れていた。そうするとコンフィグ2回に1回くらい表示がおかしくなった。結構初期化手順は厳密にやらないといけないようだ。
  1. 2006年05月13日 06:10 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

DRC、Opteronソケットに実装するFPGAコプロセッサ

今日Impress PC Watchを見ていたら"DRC、Opteronソケットに実装するFPGAコプロセッサ"の記事を発見。
非常に興味がある。ハイパートランスポートはVirtex4LXで受けているのかな?どうやら周辺チップでそれらしいのがないのでそうなのだろう。
DDRインターフェースが128bit幅、(これは64bitx2チャンネルだろうが)ついているそうだ。
研究室のA氏に指摘されたのだが、これはXilinxのXellジャーナル56号のリコンフィギャブルなコンピュータソリューションの設計という記事と関連があるようだ。
いずれにせよ、どのくらい開発環境が使いやすく性能が出るかが非常に興味がある。
DDRインターフェースやハイパートランスポートは位置固定マクロのようなものであろうから残りの部分でどのくらいの性能がが出るようになるのかな?しかも、使いやすく?
  1. 2006年05月10日 05:12 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

スパルタン3EスターターキットのLCD表示回路まとめ

スパルタン3EスターターキットのLCD表示回路のまとめをしようと思う。

仕様を書くのを忘れたので書き足します。

1.upper_4hex_data(15 downto 0)を4桁の16進キャラクタでLCDの左上に表示する。
2.lower_4hex_data(15 downto 0)を4桁の16進キャラクタでLCDの左下に表示する。
3.それ以外のLCDの表示はブランクとする。


スパルタン3EスタータキットのLCDは以下のように初期化する。
まずは4ビット(LCDのデータバスは4ビット分のみFPGAに接続されている)インターフェースで以下の図のように書き込む。(s2esk_startup_rev2.pdfより引用)
Spartan3E_LCD_1_060421.png

図1 スパルタン3EスターターキットのLCD初期化シーケンス1

その後、RS=0,RW=0にして8ビットのコマンドを書く。(s2esk_startup_rev2.pdfより引用)
Spartan3E_LCD_2_060421.png

図2 スパルタン3EスターターキットのLCD初期化シーケンス2

そのときに、4ビットインターフェースなので上位、下位と書いて8ビット分とする。(ug230.pdfの50ページより引用)
Spartan3E_LCD_3_060421.png

図3 キャラクタLCDインターフェースのタイミング

これを全部ステートマシンでやると負担が重いので、図3のupper 4bits書いて1us wait、lower 4bits書く、もしくは4-bit write(lower 4bitsのみ)というシーケンスだけステートマシンで実現して、図1、図2の初期化の手順はFPGAにPicoBlazeプロセッサを組み込んで、PicoBlazeに任せることにした。
LCD_StateMachine_060430.png

図4 upper 4bits, lower 4bits書き込み用ステートマシン

図4はupper 4bits, lower 4bits書き込み用ステートマシンだ。(ファイル名LCDOPESM.DIA, LCDOPESM.vhd)この上の階層はLCD_operation.vhdだ。LCD_operation.vhdにはLCDOPESM.vhdとupper 4bitとlower 4bit間の1usを計るタイマーとLCD_Eの出力時間を計るためのタイマーが実装されている。どちらも回路を削減し、動作周波数を改善するため、最上位のビットを使用しているので、ぴったりの値ではない。
LCD4HexDisp.vhdには、PicoBlaze本体(kcpsm3.vhd)、PicoBlazeのプログラム(instrom.vhd)、先ほどのLCD_operation.vhdがインスタンスされている。
加えてPicoBlaze用の入出力ポート用のロジックが実装されている。出力ポートはPicoBlazeのOUTPUT命令の出力をラッチする。入力ポートはPicoBlazeのINPUT命令に対応するために、IO番地に従って入力を選択するためのセレクタである。
LCDからのデータ入力は一旦input_data_latchにラッチしておいてからポート番号0からのINPUT命令によって読み込む仕組みである。(でもこれはテストしていないので、読み込めない可能性がある。データのホールド時間が少ないとだめかもしれない。)
インターバルタイマーは初期化時最初のwaitの15msを8ビットの値で設定できなければならない。12ビットカウンタをかませて8ビット値をセットできるダウンカウンタを作ると183(10進)で約15msになった。
入出力ポートの割り当ては以下の通り。

PicoBlazeの出力ポート仕様
* ポート番号0 : LCD_RWの値(bit0), LCD_RSの値(bit1), 4bit access(bit2), それ以上のビットは空き
* ポート番号1 : 書き込みデータ8ビット。(キャラクタ)読み出しの場合もダミーデータをここに書く。
* ポート番号2 : インターバルタイマー設定値8ビット。50MHzクロックをあらかじめ12ビットのカウンタで分周しているので、1を設定すると82usカウントする。

PicoBlazeの入力ポート仕様
* ポート番号0 : LCDから読み出したデータ8ビット
* ポート番号1 : インターバルタイマー・タイムアウトフラグ(bit0), LCD操作ステートマシン終了信号(bit1), それ以上は空き
* ポート番号2 : 外から入力されたデータを読むポート、upper_4hex_data(15 downto 8)
* ポート番号3 : 外から入力されたデータを読むポート、upper_4hex_data(7 downto 0)
* ポート番号4 : 外から入力されたデータを読むポート、lower_4hex_data(15 downto 8)
* ポート番号5 : 外から入力されたデータを読むポート、lower_4hex_data(7 downto 0)


Test_LCD4HexDisp.vhdはupper_4hex_dataに"1234"、lower_4hex_dataに"5678"を代入しているだけである。

次にinstrom.psmの説明。

; 出力ポート
constant OUT_LCD_CTL_PORT, 00
constant OUT_LCD_WR_DATA_PORT, 01
constant OUT_INTVAL_TIMER_PORT, 02
;
;入力ポート
constant IN_LCD_RD_DATA_PORT, 00
constant IN_INT_TIMER_TO_PORT, 01
constant IN_UPPER_4HEX_1_PORT, 02 ; upper_4hex_data(15 downto 8)
constant IN_UPPER_4HEX_2_PORT, 03 ; upper_4hex_data(7 downto 0)
constant IN_LOWER_4HEX_1_PORT, 04 ; lower_4hex_data(15 downto 8)
constant IN_LOWER_4HEX_2_PORT, 05 ; lower_4hex_data(7 downto 0)

constant ASCII_0, 30
constant ASCII_1, 31
constant ASCII_2, 32
constant ASCII_3, 33
constant ASCII_4, 34
constant ASCII_5, 35
constant ASCII_6, 36
constant ASCII_7, 37
constant ASCII_8, 38
constant ASCII_9, 39
constant ASCII_A, 41
constant ASCII_B, 42
constant ASCII_C, 43
constant ASCII_D, 44
constant ASCII_E, 45
constant ASCII_F, 46

constant LCD_RW_POS, 01
constant LCD_RS_POS, 02
constant INV_RS_VAL, FD
constant ACCESS_4BIT_POS, 04

constant INTVAL_TO_FLAG_POS, 01
constant LCD_SM_END_FLAG_POS, 02

; s0-インターバルタイマーカウンタセット用
; s1-LCD_RS,LCD_RW,4bit access用
; s2-書き込みデータ


この辺は、入出力ポート番号やビットの意味を定義しているところだ。s0-インターバルタイマーカウンタセット用、s1-LCD_RS,LCD_RW,4bit access用(4bit access以外はLCDの制御信号としてLCDにつながっている)、s2-書き込みデータ というように各レジスタを何に使っているか覚えておくと読みやすいと思う。
後はひたすら初期化データを書き込んで、インターバルタイマーに時間をセットし、そのタイムアウトチェックをするという作業を繰り返す。これは図1、図2に書かれている手順で行っている。
初期化が終了すると、upper_4hex_data(15 downto 8)から順番に読んで、4ビットごとに16進数をアスキーキャラクタに変換する。そのアスキーキャラクタをLCDに書き込んでインターバルタイマのタイムアウトを待つ。これをlower_4hex_data(7 downto 0)まで行う。後はそれを繰り返して表示している。

そういえば書き忘れましたが、テストベンチも入っていますのでシミュレーションも出来ます。プロパティからシミュレーション時間を25ms位にすると全部見られると思います。かなり時間がかかりますが。。。wave.doもあるのでインポートすると主要なsignalも見られます。
  1. 2006年05月08日 13:26 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:4

スパルタン3EスターターキットのLCD表示回路5

スパルタン3EスターターキットのLCD表示回路をここにおいときます。いつもと同様に保証はなしなので、ご自分の責任でお使いください。
2006.05.19 注:LCD_sample/LCD_4hex_dispフォルダの中のLCD_4hex_disp.ipfを消してください。これを消さないとiMPACTでコンフィギュレーションする場合に絶対パスで指定されたbitファイルを見に行ってエラーとなるようだ。
LCD_sample.zipを開くとLCD_sampleフォルダがある。その中のLCD_4hex_dispフォルダを開く。その中のLCD_4hex_disp.iseをダブルクリックして開いてください。XilinxのISE WebPACK8.1iをインストールしてあれば、ISEが起動する。
LCD_sample_1_060507.png

Sourcesペインを見るとPicoBlazeのVHDLファイルのkcpsm3.vhdとそのプログラムのinstrom.vhdがない。
Spartan3用(Spartan3Eも大丈夫のようだ)のPicoBlazeが
http://www.xilinx.co.jp/xlnx/xebiz/designResources/ip_product_details.jsp?iLanguageID=2&sSecondaryNavPick=Design+Tools&key=picoblaze-S3-V2-Pro&BV_UseBVCookie=yes&sGlobalNavPick=PRODUCTS&BV_SessionID=@@@@1181428825.1146965644@@@@&BV_EngineID=cccgaddhjmeelkkcefeceihdffhdfjf.0
もしリンクがない場合はXilinx社のページでPicoBlazeのキーワードでサーチすれば見つかるはずだ。
詳しい入手方法はFPGA LaboratoryさんのPicoBlazeTMの入手法などを参考にしてほしい。

まずはアセンブルの仕方を説明する。
1.KCPSM3.zipの中のAssemblerフォルダの中のROM_form.coeとROM_form.vhd(私はROM_form.vも)をLCD_sample.ZIPを解凍したフォルダLCD_sampleの中に入れる。
2.KCPSM3.zipの中のAssemblerフォルダを適当なフォルダに解答してパスを張る。
3.コマンドプロンプトを起動して、LCD_sampleフォルダに移動して、KCPSM3 instrom.psmを実行する。その場合に| moreをつけるとエラーが見やすくなるようだ。
4.これでinstrom.vhdができた。

この辺の詳しいことはFPGA LaboratoryさんのPicoBlaze�の使用法(出力編)などに書いてある。

5.次にKCPSM3.zipの中のVHDLフォルダにあるkcpsm3.vhdをLCD_sampleフォルダにコピーする。
6.ISEの"project"メニューから"Add Source..."を選んで、kcpsm3.vhdとinstrom.vhdをプロジェクトに追加。

これでインプリメントできるようになったので、インプリメントしてコンフィグデータをダウンロードすると下のようにLCD表示機に"1234"と"5678"が表示される。
LCD_sample_Disp_060506.jpg

ちなみに、LCDのRead Busy Flag and AddressコマンドのBusy Flagは使用していません。つまりLCDからのデータリードはテストしていません。全部インターバルタイマーにコマンドやデータ出力の最長時間をセットしてwaitすることにしています。
LCDは人間の目で見るので、これで十分なようです。(シビアなタイミングは必要ない。どうせ見えない)

最後にいろいろ参考にさせていただき、またリンクをさせていただいたFPGA Laboratoryさんに感謝いたします。ありがとうございました。
  1. 2006年05月07日 19:43 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

スパルタン3EスターターキットのLCD表示回路4

LCD_sample_Disp_060506.jpg


結構PicoBlazeのアセンブラにバグがありましたが、LCDに表示できるようになりました。
一番の原因はカーソルをホームポジションに戻すコマンドを入れてからのウエイト時間が足りなくてめちゃくちゃな値を表示していたようです。
これでDDR SDRAMの書き込み、読み出しデータを表示する環境が整いましたので、DDR SDRAMコントローラと組み合わせてみようと思っています。
後でLCD表示回路を公表しようと思います。起動時に動くLCD表示回路のXilinxのアセンブラプログラムはアセンブラの書き方の例を見ただけでアイデアも参考にしていませんし、このLCD表示回路は私のオリジナルといえると思いますので。
ただし、PicoBlaze本体などは著作権の関係から抜いておきますので、Xilinxからダウンロードしてもらうようにしようと思います。
  1. 2006年05月06日 21:13 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

スパルタン3EスターターキットのLCD表示回路3

LCD表示回路も大分できて来たと思う。
アセンブラも書いて、シミュレーションをしてみた。
アセンブラを書くのは大変で、PicoBlazeのアセンブラを覚えるのは大変だと思っていたが、そんなに大変じゃないみたい。
久しぶりのアセンブラで楽しかった。こんなにアセンブラをやったのは大学時代にZ80プロセッサの独自パソコンを作った時以来だ。
当時はアセンブラも最初はなく、ハンドアセンブルでトグルスイッチでぱちぱち入れていた。
そのうちにテープリーダ、テープパンチャインターフェースを作って、インターフェースに載っていたアセンブラをASR-33でテープパンチして入力したものだ。
そのころは、テープを見てデータがわかったものだ。テープをすかしてデータを見て、ここが違っているとわかった。その前までASR-33でコピーして、もう一度テープパンチしたものだ。

余談はここまでにして、実際のシミュレーション波形を見てみる。
FPGA LaboratoryModelSim® XE Ⅲ 6.0dによるPicoBlaze™のシミュレーションを参考にして、PicoBlazeのオペレーションコードやレジスタの値を表示してみた。
LCD_sample_sim_3_060506.png


次に4ビット幅の初期化アクセスを確認した。スパルタン3EスターターキットのLCD表示回路2の出力ポート番号0のbit2(4bit access)が1の時の動作だ。LCDのデータバスは4ビットだが初期化のために4ビット1回だけ書き込む場合である。(スパルタン3EスターターキットのLCD表示回路1参照
LCD_sample_sim_1_060506.png


次にLCDにキャラクタや制御コードを書くために上位4ビットを書いて、1us waitして下位4ビットを書く時のシミュレーションを示す。
LCD_sample_sim_2_060506.png


これはキャラクタの1(31)を書き込んだ時のシミュレーション波形だ。大体大丈夫そうなので、スパルタン3Eスタータキットにコンフィギュレーションしてみようと思う。うまくいくかどうかお楽しみ。
完全にシミュレーションの結果を精査していないのでバグはあると思う。
  1. 2006年05月06日 10:35 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0

田植えの手伝い

今日は奥さんの実家に田植えの手伝いに行った。
とはいってももう田植えは終わっていて、直しといわれる田植え機で植えられなかったところを手で植える作業も昨日終わったそうだ。これは田んぼの中を歩いて、稲が抜けているところに手植えをする作業だ。田んぼはぬかっているので、歩くだけでも大変である。
というわけで、残っている作業は苗箱洗いだ。苗箱は下の写真のように、苗箱にたぶん紙を敷いて土を入れ種をまく。水をやるとびっしり生えた稲の苗ができる。
taue_2_060504.jpg


この苗を田植え機に入れて田植えをするわけだが、稲の根っこが箱の穴から出ていたりする。それを洗うわけだ。
家族で行ったので手伝いにいったか、邪魔しに行ったかわらないが。。。
最後に苗を植えたばかりの田んぼの写真。奥さんの実家の田んぼではないですけど。。。
taue_1_060504.jpg

  1. 2006年05月04日 20:28 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

サーチワード、トイザラス 任天堂ds

今日は”トイザラス 任天堂ds”というサーチワードで31回もアクセスがあった。
私が4月22日にトイザラスで並んでDS Liteを買ったというブログにヒットしているようだ。
実はトイザラスで購入する以前に、任天堂にDS Liteを買えるのかというのをメールで問い合わせたのだが、返事は予想通り”それは言えない、わからない”ということだった。ただ4月になれば十分な数を出荷できるのとのことだった。買えるとはいわないところがミソなのだろう。
今これだけ、ヒットがあるということは、まだ買えないで、買いたい人が多いということだろう。
失敗したかな? 子供といったので2台買える権利があったのだが、1台しか買わなかった。1台はオークションという手もあったか。。。でも、最近値が下がっているみたいだし、割に合わないような気が。。。
とにかく購入できる様にがんばってください。
  1. 2006年05月03日 22:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

謎のきのこ

kinoko_060503.jpg


庭の柿ノ木の根元に謎のきのこが生えてきた。
ネットで調べてみると何かアミガサタケのようだ。本当だとしたら高級食材とのことだったが、食べる勇気はない。
誰か教えてほしい???
とはいっても、きのこの専門家が実際に見たきのこしか信じてはいけないそうなので、実際に食うことはなさそうだが。。。
  1. 2006年05月03日 15:44 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

スパルタン3EスターターキットのLCD表示回路2

スパルタン3EスターターキットのLCD表示回路2で、PicoBlazeの入出力ポートの仕様だ。自分の覚書のようなものなので読みずらいかもしれない。
PicoBlazeは初期化とLCDに書き込む8ビットのデータを扱う。 LCD書き込み回路にPicoBlazeから与えられるデータは初期化時には4ビットのデータもあるが、通常は8ビットのキャラクタコードである。 PicoBlazeからはLCD_RS, LCD_RWなどの制御信号も出力される。またインターバルタイマの値を設定して、タイムアウトしたかどうかのフラグを読みことができる。
LCDからのデータ読み出しの時は一旦データをラッチしてからINPUT命令でPicoBlazeに読み込む。

PicoBlazeの出力ポート仕様


  • ポート番号0 : LCD_RWの値(bit0), LCD_RSの値(bit1), 4bit access(bit2), それ以上のビットは空き

  • ポート番号1 : 書き込みデータ8ビット。(キャラクタ)読み出しの場合もダミーデータをここに書く。

  • ポート番号2 : インターバルタイマー設定値8ビット。50MHzクロックをあらかじめ12ビットのカウンタで分周しているので、1を設定すると82usカウントする。


PicoBlazeの入力ポート仕様


  • ポート番号0 : LCDから読み出したデータ8ビット

  • ポート番号1 : インターバルタイマー・タイムアウトフラグ(bit0), LCD操作ステートマシン終了信号(bit1), それ以上は空き

  • ポート番号2 : 外から入力されたデータを読むポート、upper_4hex_data(15 downto 8)

  • ポート番号3 : 外から入力されたデータを読むポート、upper_4hex_data(7 downto 0)

  • ポート番号4 : 外から入力されたデータを読むポート、lower_4hex_data(15 downto 8)

  • ポート番号5 : 外から入力されたデータを読むポート、lower_4hex_data(7 downto 0)

  1. 2006年05月01日 05:49 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:0