2015年12月23日水曜日

ZYBO 25 ( I2S コントローラの作成 16 )

遂に、スクラッチ音が出来るようになった。 \(^_^)/



ここまでのデータ一式をGitHubに置いた。

https://github.com/BravoFpga/I2S-control-IP-for-ZYBO-zynq-/blob/master/my_I2S_20151227.zip

Rawをクリックするとzipファイルをダウンロードできる。

2015年12月6日日曜日

ZYBO 24 ( I2S コントローラの作成 15 )

久しぶりのI2Sコントローラだ。
ちょうど Vivado 2015.4 がリリースされたので、2015.4をインストールしてI2Sの開発を再開しようとしたらハマってしまった。

Vivado 2015.4でプロジェクトを開きBlock Designで使われている各IPをUpgradeして合成、bitstreamの生成と進み出来上がったbitstreamとHardwareをSDKにexportしてSDKを立ち上げた。そしたら、割込みを使っているプログラムがエラーとなってコンパイル出来なくなってしまった。エラーの内容を見ると、I2S IPの割込み番号を定義しているマクロ(XPAR_FABRIC_I2S_CTL_INTR)が存在しないとある。

XPAR_FABRIC_I2S_CTL_INTRは本来であればxparameters.h内に定義されているもので、xparameters.hはBoard Support Package(**_bsp)下のincludeディレクトリにある。
xparameters.hを開いて検索したが、やはりそのマクロは見つからなかった。

Board Support Packageを再生成してみたが状況は変わらなかった。

Board Support Packageはsystem_wrapper_hw_platform_* 配下の情報を元に生成されるようであり、この時点では古い方(system_wrapper_hw_platform_0)を参照している。
bspが参照しているsystem_wrapper_hw_platformを途中で変更することが出来ないようなので、新たに、system_wrapper_hw_platform_1を参照するBoard Support Packageを生成することにした。



生成したBoard Support Packageのxparameters.hを確認すると、XPAR_FABRIC_I2S_CTL_INTRが定義されていた。

次に、アプリケーションプログラムが新しく作成したBoard Support Packageを参照するように変更する。

これでOKかと思ったら、今度は別のエラーが出た。

xilffs (Generic Fat File System Library)のバージョンが上がって、f_mountという関数の引数の仕様が変わったようだ。


そこで、新しい仕様に合わせてプログラムを修正したらコンパイルが通った。





2015年11月23日月曜日

告知の結果と次のテーマ

FPGAボードプレゼントへの応募者はゼロでした。
このテーマはこれで一旦終了して、次は中途半端に中断していたZYBOでI2S IPを利用したスクラッチ音生成を再開しようと思う。


2015年11月7日土曜日

世界最小クラスかも知れないFPGAボード 15 (ブロック崩しゲームの実装 2)

現在実装中のブロック崩しゲームだがゲームとして遊べるレベルにはなった。

バーの操作はロータリーエンコーダで行うことにした。エンコーダの左側にある基板上の部品は押しボタンスイッチでゲーム開始の操作に使用する。

また、画像だけだとつまらないので音も発生するようにした。
このままだと操作しづらいので以下のように段ボール箱を筐体代わりにして組み上げた。

箱の内部はエンコーダのケーブルがとぐろを巻いているだけだ。


電源を入れると、以下の画面表示になる。

ここで押しボタンスイッチを押すとボールが下方に動き始めゲームが開始される。

プレイしている様子
プレイしてみて、自分の反射神経の衰えを実感してしまった。orz
が、中々楽しい。なんじゃこりゃーおもしろいぞー!ってな感じだ。


アーキテクチャと最上位のRTLは以下のようになっていて結構シンプルだ。


syncgenで同期信号と描画座標を生成してbreakoutモジュールに渡す。
breakoutモジュールは描画座標とボールや各ブロックの座標とを比較して衝突判定して処理をおこなっている。


回路規模はこんな感じ



タイミングもMetしている。


2015年11月1日日曜日

世界最小クラスかも知れないFPGAボード 14 (ブロック崩しゲームの実装 1)

ブロック崩しゲームを実装中だ。

ボールを打ち返す部分はまだ実装していない。
残りは、ボールの加速度を縦方向と横方向別個に設定できるようにするのと、ラケットの部分の実装だ。ラケットの操作はロータリーエンコーダにしようか押しボタンにしようか思案中だ。ボードの改造(ポートの追加)もしなければ。

リソースのusageはこんな感じで、前回のカラーバー+αの回路と大差ない。

今のところ、思ったよりも小規模で済んでいる。


2015年10月25日日曜日

世界最小クラスかも知れないFPGAボード 13 (VGA I/Fを実装してみる)

今回は趣向を変えて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月11日日曜日

世界最小クラスかも知れないFPGAボード 12 (2枚目作成)

CANも動いたし、作成したFPGAボードは問題なさそうだと判断できるので、もう1つ作ることにした。
以下は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℃の違いはあるが、温度も正しく読めていると考えて良いだろう。


ということで、リードバックは問題無さそうだ。


自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...