今回は趣向を変えてVGA出力回路の実装をやってみた。表示内容はカラーバーの背景に32x32ドットのパターンをスプライト表示してみる。FPGAのピン数が少ないので、R,G,Bの階調は4階調とした。
今回作成したVGAテストセット
裏面
表示画面
画素数はVGA(640 x 480、ピクセルクロック 25MHz)としている。SVGA(800x600,50MHz)だと僅かにタイミングマージンが不足する。
リソースの使用状況はこんな感じだった。
スプライトで表示している四角のパターンは、ソース上はROMとして推論されるように記述しているのだがROMとして推論されず、CLBに展開されてしまっている。
色々試行錯誤したのだが、どうやってもROMとして推論されなかった。 iCE40には4KbitのBRAMが20個あるが、容量が4Kbit以上の場合は推論されないようだ。仕方がないので、BRAMのプリミティブセルをインスタンスしそれに初期値を設定して使う方法でやってみた。ここで、初期値のロードに$readmemhが使えると楽なのだが、iCE40のプリミティブセル内のメモリ配列が1次元のレジスタとして記述されていて$readmemhが使えないので、以下のようにparameterとして設定した。
ROM化すると回路規模は以下のようになった。
ROM化出来ていない場合に比べ若干小さくなっているように見える。
タイミングマージンは改善されSVGAでもMetするようになった。
リソースには空きがかなりあるので、ブロック崩しゲーム位なら実装できるかも知れないな。
2015年10月25日日曜日
2015年10月11日日曜日
世界最小クラスかも知れないFPGAボード 12 (2枚目作成)
CANも動いたし、作成したFPGAボードは問題なさそうだと判断できるので、もう1つ作ることにした。
以下はFPGAのボールに線材をハンダ付けし始めたところで、実体顕微鏡越しにデジカメで撮影した。こんな感じで0.35mmのピッチのボールに線材を手作業でハンダ付けしていく。
全てのボールにハンダ付けするとこうなる。
目視ではハンダブリッジ等のハンダ付け不良は無さそうなので、1枚目の基板と同様に全てのI/Oピンに順繰りにパルスを出力する回路をFPGAにダウンロードして動作させ、ロジアナで確認した。
1ピンづつパルス出力されており、問題ない。
右が1号機、左が本日ハンダ付けした2号機
1号機はFPGAの配線部を保護する目的で接着剤で固めてある。
2号機はまだその作業を行っていない。
以下はFPGAのボールに線材をハンダ付けし始めたところで、実体顕微鏡越しにデジカメで撮影した。こんな感じで0.35mmのピッチのボールに線材を手作業でハンダ付けしていく。
全てのボールにハンダ付けするとこうなる。
目視ではハンダブリッジ等のハンダ付け不良は無さそうなので、1枚目の基板と同様に全てのI/Oピンに順繰りにパルスを出力する回路をFPGAにダウンロードして動作させ、ロジアナで確認した。
1ピンづつパルス出力されており、問題ない。
右が1号機、左が本日ハンダ付けした2号機
1号機はFPGAの配線部を保護する目的で接着剤で固めてある。
2号機はまだその作業を行っていない。
2015年10月4日日曜日
世界最小クラスかも知れないFPGAボード 11 (CAN IPを実装してみる 7)
CANバス経由でのリードバックを見てみた。
いきなり実機で動かすことはせず、RTLレベルとゲートレベルでシミュレーションをして動くことを確認してから実機で確認することにした。 シミュレーションではこれまでと同様にCANマスタとしてOpenCoresのCAN IPを使用した。
以下のようにCANバスからI2Cコントローラのreg_adrレジスタに0x55を、reg_wdatレジスタに0xAAを書き、次にreg_adrレジスタの値をリードバックしてみた。
以下がRTLシミュレーションの結果である。赤字のref_modelの部分がCANマスタの信号で、data_out[7:0]は受信した(即ち、自作CANIPが送信した)データである。 0x55 が受信できているので期待通りだ。
こちらはゲートレベルシミュレーションの結果で、こちらも期待位通りの結果だった。
I2C busの通信も起動できるかの確認
こちらも期待通りの結果だった。
実機での確認
シミュレーションと同じようにI2C コントローラに値を書いて、それが読めるかを見てみた。
zynq側のプログラム
結果
3行目の「2: xxxxxxxx]の左端がリードバックして受信した値で、55になっているので成功だ。
http://bravo-fpga.blogspot.jp/2015/08/fpga-7.htmlに書いたとおり、I2CバスにはMCP3425ADT (16bit ΔΣ A/D)、 MCP4726A0T (12bit DAC)、 STTS751 (12bit 温度センサ)が接続されているが、今回はSTTS751のレジスタを読んでみることにした。
STTS751のレジスタマップは以下のようになっている。
Manufacturer ID、Revision、Product ID等固定値のレジスタと温度レジスタをリードしてみた。
zynq側のプログラム
結果
固定値の部分はデータシート通りの値が読めている。また、このプログラムを実行した時の室温は29℃だった。1℃の違いはあるが、温度も正しく読めていると考えて良いだろう。
ということで、リードバックは問題無さそうだ。
いきなり実機で動かすことはせず、RTLレベルとゲートレベルでシミュレーションをして動くことを確認してから実機で確認することにした。 シミュレーションではこれまでと同様にCANマスタとしてOpenCoresのCAN IPを使用した。
以下のようにCANバスからI2Cコントローラのreg_adrレジスタに0x55を、reg_wdatレジスタに0xAAを書き、次にreg_adrレジスタの値をリードバックしてみた。
以下がRTLシミュレーションの結果である。赤字のref_modelの部分がCANマスタの信号で、data_out[7:0]は受信した(即ち、自作CANIPが送信した)データである。 0x55 が受信できているので期待通りだ。
こちらはゲートレベルシミュレーションの結果で、こちらも期待位通りの結果だった。
I2C busの通信も起動できるかの確認
こちらも期待通りの結果だった。
実機での確認
シミュレーションと同じようにI2C コントローラに値を書いて、それが読めるかを見てみた。
zynq側のプログラム
結果
3行目の「2: xxxxxxxx]の左端がリードバックして受信した値で、55になっているので成功だ。
http://bravo-fpga.blogspot.jp/2015/08/fpga-7.htmlに書いたとおり、I2CバスにはMCP3425ADT (16bit ΔΣ A/D)、 MCP4726A0T (12bit DAC)、 STTS751 (12bit 温度センサ)が接続されているが、今回はSTTS751のレジスタを読んでみることにした。
STTS751のレジスタマップは以下のようになっている。
Manufacturer ID、Revision、Product ID等固定値のレジスタと温度レジスタをリードしてみた。
zynq側のプログラム
結果
固定値の部分はデータシート通りの値が読めている。また、このプログラムを実行した時の室温は29℃だった。1℃の違いはあるが、温度も正しく読めていると考えて良いだろう。
ということで、リードバックは問題無さそうだ。
登録:
投稿 (Atom)
ERROR: Failed to spawn fakeroot worker to run ...
なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz 家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...
-
ZYBOでLinuxを動かし、その上で X Windowを立ち上げ X アプリを動作させることが出来た。 以下はgnome-terminalとgnome-system-monitorを起動しgnome-screenshotで撮ったscreenshotだ。 これまでDFT ...
-
FT232RというUSB-UART変換ICがある。このICにはBit Bang Modeという機能があって、UART用の端子がGPIO的制御が可能になる。 FT232Rを搭載したUSB-UART変換基板は秋月電子やマルツパーツ等色んなところで売られていて私もSparkfunのF...