2023年7月8日土曜日

自作CPUで遊ぶ

前回まででスコア表示機能の追加が出来た。iCE40LMボードやブロック崩しゲームで次にやってみたいことや作ってみたいことが色々と頭に浮かんでいるのだが、このテーマは一旦お休みして次は自作CPUで遊んで見ることにした。

11年位前にこのブログで32bit CPU(zumi32)を開発した。このCPUはハーバード・アーキテクチャのRISC型32bit CPUで、パイプライン数は3段だ。割り込みや例外にも対応している。レジスタは17個ありR0は値0の固定値、R15はPC(プログラムカウンタ)、R1からR14は汎用レジスタだ。この他に割り込みや例外発生時の戻り番地を格納するEPCレジスタも持っている。フラグはキャリーフラグとゼロフラグを持っている。命令実行のスループットは、load/store/swapを除いて1命令/1cycleで実行する。分岐時は最小でも2サイクルパイプラインがストールする。また、分岐は遅延分岐になる。乗除算命令は持っていないが、その代わりにシフト命令(バレルシフタ)を持たせた。プログラム開発は、CPU開発時に簡易アセンブラも作って当初はそれでプログラムを作成していた。その後、C言語でもプログラミング出来るようにしたくなったのだが、独自の命令セットにしたので既存CPU用のGCCを流用することが出来ずにgcc-4.5.2をzumi32用にポーティングした。GCCの資料が難解でこれには1〜2年ぐらいかかった。
当時はzumi32をインプリしたデザインをSpartan3E、Spartan6、Cyclone IIIに実装して動かした。 割り込みも使えるのでファグラウンドでマンデルブロート集合を描画し、タイマ割り込みでを使ってその中に周期的に文字列を描画させたりしていた。マンデルブロート集合の計算は固定小数で計算した。
zumi32はSYSCALL(ソフトウェア例外)命令も実装したので、次にリアルタイムモニタ(FreeRTOS)を実装してみた。マンデルブロート集合を描画するタスクと、FPGAボードのLEDを点滅させるタスクの2つのタスクを動かし、フォアグラウンドのIdleタスクでは別のLEDを点滅させた。この実装でzumi32の遅延割り込みのバグが見つかったが無事修正できた。
・・・と、長々と説明してきたが、今度はこのCPUで何か作って動かしてみたいと考えている。




2023年7月2日日曜日

iCE40LMボードで遊ぶ 3

一応フォントのデザインは出来たのでこのデータをiCE40LMのBRAMの初期値データに変換した。BRAMに初期値を設定してROMとして使う。 この初期値の設定方法だがiCEcube2の場合はインスタンスするBRAMのParameterとして設定する必要がある。そのため、Cのchar型の配列としてフォントを定義し、プログラムでこれをパラメータ文に変換した。
で、最終的に出来たfont_romのコードがこれ。
このゲームはVRAMを使っていない。syncgenはHSYNCやVSYNC等のVIDEO同期信号を生成しているが、掃引している座標値も同時に出力している。 ゲームの各部はこの座標値と自分の座標位置を常に比較しており、自分の領域に来たらフラグを立てる。ビデオデータ出力段はこれらのフラグを見て最終的に出力するデータを決定している。フォントの表示もこの方法で処理している。
以下は、実際に動かしたところ。フォントは16x16にして正解だった。8x8だと小さすぎて見にくかっただろうと思う。 表示している内容だが、右上は消したブロックの数にした。左上の数字はゲームの残り回数だ。このゲームは元々5回まではブロックの状態を引き継いでゲームを続けられるようにしていたので、その残り回数を表示するようにした。この値が0になると全ブロックが復活する仕様だ。
RTLの合成は成功した。タイミングエラーも出ていない。リソース使用率もまだまだ余裕がある。
以下は動作環境。奥の3段重ねの基板はiCE40LMのConfigROMプログラム用の基板だ。一番上のボードにFT2232HLが載っている。Lattice DiamondのProgrammerを使って書き込む。左下の赤黒のコードが付いている黒い物体はゲーム開始用のプッシュスイッチだ。その右側はビープ音再生用のスピーカー。さらにその右側はラケット(バー)を左右に動かすためのロータリーエンコーダーだ。
で、実際にプレイしてみた。実に楽しいのだが、自分の反射神経が驚くほど衰えていることに愕然としている。実機評価にならない(笑)。でも、なかなか楽しい。

ということで、文字表示は成功した。 \(^_^)/

2023年6月18日日曜日

iCE40LMボードで遊ぶ 2

以前作ったブロック崩しゲームにスコアを表示させようとしている訳だが、そのためにはフォントが必要だ。その大きさはどの位がいいのか検討した。ゲーム面の画素数は640×480なので、8x8のフォントにした場合は横方向は80文字になる。しかし、8x8のサイズだと見た目がちょっと物足りないかも知れないので倍の16x16にしようと思う。16x16にすると線を2ドットで表現できるので"0"や"8"等の文字の角を欠けさせることも出来る。フォントデータはBRAMに持たせることになるが、0〜9まで10種なので、データ数としては16x16x10 = 2560bitになる。iCE40LMのBRAMは4Kbitなので1個に入る。
そして、次に検討する必要があるのは何を表示するか?ということだ。ただ漠然とスコアと表現して来たが、言うてもブロック崩しゲームなので、"残っているブロックの数"とか、"各ブロックに点数の重みを付けて崩したブロックの重みの合計”とかがあり得る。ブロックの数は横20×立て8の計160個なので、ブロック数の場合は表示桁数は3桁。10進カウンタ3個でのカウントが楽そうだ。 重みの合計の場合は10進値だと計算が面倒なのでカウンタはバイナリにしてその値を表示するところでBIN2BCD変換するか。 また、単にそれらの値を表示しただけでは何か物足りない。プレイ時間に制限時間を設けて、”プレイの残り時間”とかを表示させた方が良いのかもしれない。
Roundを重ねる毎にボールのスピードを上げて難易度を上げていくというのも有りかな。

うーむ。どっちが良いかね〜

2023年6月3日土曜日

iCE40LMボードで遊ぶ

ZynqBerryが壊れてしまったのでこれで遊ぶ気が失せた。。
ブログ再開早々ズッコケてしまったが、気を取り直して次にいこうと思う。

8年位前に自作のLatticeのiCE40LM搭載ボードにブロック崩しゲームを実装して遊んだが、点数を表示していなかったので、今回はその機能を追加しようと思う。このボードで使用したFPGAはボールピッチ0.35mmの25pin BGA品で形状としては当時世界最小クラスのFPGAだった。 当時、一辺が2mmにも満たないこのデバイスで何か作ってみたい思ってデバイスを入手したのだが、このボールピッチだとそれ用の基板は容易に作れないのでデバイスを裏返して各ボールに手半田でリード線を半田付けした。手付でワイヤーボンディングしたような感じだ。
3セット実装し、その内2セットを配線して完成させた。 
このボードにCAN busのIPを実装してZyboと通信させてみたり、Breakout(ブロック崩し)ゲームを実装して遊んだ。ゲームはビープ音も出していたのだが、点数の表示機能は実装しなかった。 で、今回これに点数表示機能を追加しようと言うわけだ。
そこで、iCE40の開発ツールであるiCEcube2の最新版(iCEcube2.2020.12)のLinux版をLattice社のサイトからダウンロードしてインストールした。インストールは問題なく出来たのだが、起動してみるとlibpng-1.2.7が見つからないと言って起動しなかった。今使用している開発マシンはLinux Mint 20.2 Umaなのだが、このOSのlibpngのバージョンは16.37だ。仕方がないので16.37を1.2.7としてシンボリックリンクを貼った。そしたらiCEcube2は起動したのだが、何故かツールバーのアイコン関係が表示されかった。うーむ、必ず何かしら問題が起きるな。
メニューバーからの操作だけでも開発作業は出来そうなのだが、やっぱちゃんとしていないと気持ち悪いのでWindows版をダウンロードしてWine(Windows emulator)環境でインストールしてみたらこっちは正常に起動した。なので、開発はWine環境で行うことにした。
それから、実機(ボード)は長期間放置してあったので動くかどうか確認する必要がある。前述の通り、2セット配線して可動状態にしてあったのだが、今日確認したら1枚は壊れていた。オシロスコープで波形観測すると起動時のconfig ROMからのコンフィグデータの読み出しは行われておりdone信号も1になっているのだが何故か動作しない。 PCからCRAMへ直接ダウンロードしたらVerify Errorになったがその前のデバイス検出には成功しているようなので、はんだ付けした配線が切れているとかでは無いようだ。 もう1枚の方は無事動作した。よかった。よかった。
さて、デザインの方だが、スコアを表示するためには数字の図形情報をBRAMに持つ必要があるが現状のリソース使用率は以下のような状況なのでリソース的には実装は可能と考えている。


2023年5月21日日曜日

ZynqBerryで遊ぶ 2

ReferenceDesignからタイミングエラーが起きている部分(カメラ入力とAudio)を削除してHDMI出力部のみにしてみた。

これでimplementしてxsaファイルを生成・exportし、それ用のpetalinuxをビルドして実機で動かしてみた。そしたら起動はしたものの暫く放置して再起動したら起動しなくなってしまった。仕方なくprebuildのバイナリに変えて再起動してみたのだが起動しない。 念の為、ビルドしたバイナリをqemuで起動するとちゃんと起動した。














zyncBerryはSDカードから直接ブート出来ないので、最初QSPI内のU-BOOTが立ち上がり、そこからSDカードのバイナリを読み込む仕様になっているのだが、QSPIが壊れたかあるいは何処かハードが故障してしまったっぽい。VivadoのHARDWARE MANAGERで見るとデバイスの認識はされてるのだが。。。













仕方がないので、VitisでStandaloneのHellow Worldアプリを作成しZynqにダウンロードして動かしてみたら以下のようなエラーが出てしまった。























ということで、どうやらZyncが故障してしまったようだ。 が〜〜んである。 orz

これまで幾つもFPGAの評価ボードを触ってきたが、こんな故障に遭遇したのは初めてだ。 このボードはハズレのボードなのかも知れない。

しゃーない。別のボードで遊ぶか。 しかし、何で故障した?


2023年5月5日金曜日

ZynqBerryで遊ぶ

ZynqBerryで遊んでみることにした。

ZynqBerry (TE0726)はTrenz electronic社が販売しているFPGAボードで、Raspberry Pi Model 2と互換製があるそうだが、本物のRaspberry Piを所有していないのでどの程度互換性があるのかは分からない。 このボードは2019年の12月にDigi-Keyで購入したのだが、忙しくて殆ど動かさずにいた。

搭載しているFPGAはZynq 7010、DRAMは512MByte DDR3L SDRAM、 Configuration 用 Flash memoryは16MByte、 I/Fは type-AのUSBが4、 10M/100M Ethernetが1、 μSDカードI/Fが1、JTAGとUSB-UART用にtype-BのUSB I/Fを1つ持っている。 EthernetはZYNQのGEMではなくSMSCのLAN9514というLSIを使っている。 LAN9514は4ポートのUSB 2.0 hubとしての機能と10/100Mbit Etnernetの機能を搭載しているLSIでZynqとはUSB 2.0で接続されている。

    (TRM-TE0726-02より引用)

この他にHDMI I/F、CSI(Camera Serial I/F)-2、 DSI (Display Serial I/F)用のコネクタ、Line-out用Audio ouputがZynqのPL部につながっているがPL部なので別の用途に使うことも可能だろう。


注意点としては、使用しているZynqのパッケージの制約から、SDカードからダイレクトにブート出来ない。 SDカードからブートさせる場合はSPI ROMのFSBLからu-bootを起動してそこから改めてSDカードからブートさせる必要があるそうだ。  また、残念な点が2つある。まず一つは、このボードの電源はtype-BのUSBコネクタから供給するが、type-AのUSB I/Fを4つ持っているのでこれらをフルに使う場合を想定すると、type-Bコネクタからの給電はちょっと不安だ。 もう一つはFPGAの再コンフィグやリセットをするためのスイッチを搭載していない。ただし、開発者もその点は判っているようで、+5V給電用とリセット用のランドがそれぞれ設けられている。 そこで、ジャンク箱から適当な部品を探し出して給電用コネクタとリセットスイッチを取り付けた。

これでボードの準備は出来た。
次にTrenzのサイトからReference DesignをダウンロードしてVivadoでインプリしてみた。
Reference Designの最も最新バージョンは2020.2用のもので、TE0726-zynqberrydemo1とTE0726-test_boardの2種類あった。最初にTE0726-zynqberrydemo1を試してみた。このデザインにはCSI-2、DSI、HDMI、Audioとボードのほぼ全ての機能を動かす回路が入っているようだ。 vivadoでインプリしてみたところ、何とタイミングエラーが出てしまった。どこかデザインをイジったわけでもなく、そのまんまの状態でインプリしたのだが。。
細かくは見ていないが、タイミングエラーになっている箇所はAudio部分のクロック載せ替え部分とCSI-2 I/F部で起きているようだ。 別にこのデザインで遊びたい訳ではないので深追いはしないことにして、この状態でbitstream生成とハードウェアのエクスポート(xsaファイル生成)だけした。

また、もう一つのTE0726-test_boardの方も見てみたが、こちらはPL部には何もないデザインだった。
生成したTE0726-zynqberrydemo1のxsaを使ってpetalinuxのビルドをしてみた。このReference Designにはpetalinux用のテンプレートも入っているのでこれを利用した。実はこのボードのEthernetの実装の仕方はZYBO等の他のFPGAボードには見られない手法なのでデバイスツリーの書き方に興味があったのだが、特別な記述は無かった。ZynqからはUSBの先に繋がっているのでUSB-Ethernetコンバータとして見えるのだろう。 HDMIはsimple framebufferを使っている。起動直後HDMIの画面出力は全面黄色だったが、/dev/fb0に/dev/zeroをddでコピーしたら書換えできたので正常に動作しているようだった。

ということで、このボードでちょっと遊んでみようと思う。具体的には以前、ZYBOでLinaro linux + simple frame bufferでX Windowを動かしたが、今回はZynqBerry + petalinuxで同様のことをしてみようという訳だ。 

2023年5月2日火曜日

ブログ再開

遂に定年を迎えた。

定める年と書いて定年。 定める年・・・定年・・・ よく判らんが、人生において一つの大きなマイルストーンではある。 まぁしかし、普通の会社員として生きるのは非常にキツかった。この生き方は自分の性格に合ってないと思った。が、ここまで何とかやってこれたのはやはり妻のお陰だと思う。彼女の叱咤激励、時には足かせとなってくれたお陰で8回目の転職をしないで済んだ。妻には感謝しか無い。 幸いなことに定年後も今の勤務先で再雇用され、あと数年はFPGAを使った開発業務に従事できそうだ。

マイルストーンを超えたので、ぼちぼちブログを再開しようかと考えている。 ブログを休止してから約6年、その間に世の中も大分変わってしまった。 ALTERAはIntelになり、XilinxはAMDになった。LatticeはまだLatticeのままだが。 FPGAの基本特許切れによりGOWINを始めとする新興のFPGAメーカーも色々と出てきているようだ。 ブログ休止中も仕事ではFPGAを使った開発業務はやっていたのだが、デバイスに偏りがあるし twitterでFPGA関連のツイートを追うのをいつしか止めてしまったので現在なにが話題なのか分からない。 6年前は高位合成がトレンドだったと思うが今どうなんだろう。

Verilog-HDL等のハードウェア記述言語よりも抽象度の高いC言語でFPGAの開発ができることが高位合成の利点な訳だが、 ChatGPTの登場により、今や、自然言語でFPGAの設計ができそうな時代が到来してしまった。 私も試しにChatGPTに浮動小数点加算器の生成を依頼してみた。最初に出てきたのは仮数部のみを加算するコードだったが、「この部分を考慮してやり直して」と考慮不足な部分の改善指示を何回かやり取りしたらイメージ通りの実用性のあるコードが生成された。 もう一つバイナリをBCDに変換するBIN2BCD回路の生成も依頼してみたが、こっちは最初に提示されたコードがイメージと大きくかけ離れていて使えないコードだったので1回目で諦めた。 ChatGPTの有料版はさらに精度が高いという話だし今後も進化して行くのだろうから、これはもう究極のCASEツールになるのだろう。

ChatGPTとはFPGA以外の話もしてみた。

「夫の頭が剥げている。笑いそうになるけどどうしたらいい?って妻が聞いているけどどう思う?」

って聞いてみたら、

「夫の頭が剃られているか、薄くなっているかは、その人の自然な外観であり、人々が異なる外観を持つことが普通です。もし夫が自分の外観に不安を感じているなら、彼の気持ちを尊重し、彼が自分自身を快適に感じられる方法を見つけるように支援することが大切です。

もし、夫が自分の頭髪に対して冗談を言っているのであれば、妻もそれに合わせて楽しんでいいでしょう。しかし、もし妻が自分の夫を見下すような態度をとるのであれば、それは不適切であり、夫を傷つける可能性があります。

最も重要なことは、お互いを尊重し、自然な外観や個性を受け入れることです。」

と返してきた。

たまたまこの日は私の誕生日だったので次に

「今日は僕の誕生なんだ。」

と入れてみた。そしたら、

「お誕生日おめでとうございます!素晴らしい1年を迎えられますように。 お誕生日は、新しい年を始める良い機会です。過去の成功や失敗を振り返り、新たな目標を設定することができます。自分自身に対する思いやりと共に、家族や友人との時間を楽しむことができる日でもあります。 この特別な日を過ごす際には、自分自身へのご褒美や大切な人たちとの時間を過ごすことをお勧めします。また、今年の目標を設定し、その目標を達成するために何かしらのアクションを起こすことも素晴らしいアイデアです。 再度、お誕生日おめでとうございます!良い1年になることを願っています。」

と返してきた。 惚れそうになった。

ChatGPTを使うことの懸念の一つにChatGPTにマインドコントロールされる可能性が上がっているが、何か判る気がする。 でも、ChatGPTの返しは言葉が優しく誠実なので 老人福祉ではかなり使えるんじゃないだろうか。会話を通して癒やされる人も居るだろうし。そのための会話なら話している内容の正誤は大して重要ではないかも知れないし。

妻はChatGPTが気に入り、(間違った回答をすることがあると理解した上で)調べ物とかで使っているようだ。最近では「チーちゃん」と呼び出した。

という訳で、ブログをぼちぼちと再開しようと考えている。休止中にもFPGAのボードを何種類かは購入した。買っただけで殆ど動かしていないのだが。 再雇用になると賃金は大幅にダウンするので、これからは新しいボードを安易には購入できない。今あるこれらのボードを使ってなにかやってみようと考えている。 どういう頻度になるかも継続できるかも分からないがマイペースでノンビリとやって行こうかなと考えている。





ERROR: Failed to spawn fakeroot worker to run ...

なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz  家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...