ズッキーニの味噌煮込みBlog版

コンピュータのこと、食べ物のこと、なんでもないこと、とんでもないこと。

FPGAでチャタリングを退治する

2016年05月29日 09時01分07秒 | FPGA

一週間のご無沙汰でした、的な。古すぎるか。^^;

メインの仕事であるクライアント企業の親方が無茶振りしてくれたので、頭がそっちでいっぱいになっている。とはいえ、ちょっと先のための勉強を放り出すほどアホではない。頑張って進めていくからね。

CQムックの付録基板FBボードに書き込むためのJBボードは、Ubuntuではjtagサーバが認識してくれない(2016/05/28現在)ので、悟空というAltera USB Blaser互換製品を導入したことは前回書いた。純正品の1/20ほどの価格にもかかわらず、しっかりと動いてくれてありがたい。自分で手ハンダしたJBボードが使えないのは残念だが、VMWare Fusion上のWindows10ではあまりにも遅すぎてストレスが溜まる。JBボードはFBボードに重ねるようにして使うのでFBボードのタクトスイッチが押しにくかったんだが、悟空だとフラットケーブルでつながるので楽になった。怪我の功名みたいなもんか。^^;

さて取りあえずの開発環境が整ったので、いろいろ実験してみたい。まずは「タクトスイッチを押すたびにデータスタックポインタがひとつ上がる」という、スタックマシンとしては基本中の基本をやってみようと思った。コードは書けたんだが、どうも動作が不安定だ。タクトスイッチを一度押しただけなのにスタックポインタが2つも3つも上がる。しかも不安定だ。

あぁこりゃ、チャタリングだよねとすぐにわかった。最近はあまりチャタリングが問題になるような回路を組んでいなかったので、面白いネタができたのが嬉しい。

チャタリングの性質とその対策については、「回路図で学べるFPGA入門」が役に立った。サブタイトルが「回路図は読める人のためのHDLガイド」となっていて若干敷居が高そうだし価格も価格。少し躊躇したが思い切って買っておいてよかった。この本はテーマごとに回路図(必要ならタイミングチャートなどの図)、VHDL記述、Verilog HDL記述が解説されていて、とてもていねいに書かれている。これでじっくり腰を据えて勉強して、チャタリングの性質を大まかに理解することができた。

Verilog HDLで非常に簡単な実装をやってみたのだが、思いのほかきれいに効いてくれた。やはり理屈を理解して書くコードはちゃんと動く(当たり前だ)。

チャタリング問題が解決し、スタックマシンもこちらが考えたとおりに動いていることがわかった。もっともスタックマシンと言ったってメモリ上の配列とインデスクでできているのだから、ちゃんと動いて当たり前だが。そこでFORTHの仮想コードを書いて、スタックマシンが想定どおりに動いていることを確認してみた。

3 DUP +

これまた至極当然だが、我が超マシンはスタックに6という値を積んだ。背筋がぞくっとした。これぞ長年の夢、汎用CPUのソフトでシミュレートするのではなく、ハードウェアで実現したスタックマシンだ。それがいま動いたんだよおっかさん。

もちろんまだ実験段階だ。ちゃんとした実装にはなっていない。これからちょっとずつ、実装を進めていくつもりだ。

また来週。(^^)


FPGAの開発環境を整備した(悟空+Quatus Prime on Ubuntu on VMWare Fusion on MacOSⅩ)

2016年05月21日 14時33分28秒 | FPGA

まず残念なお知らせだけど、CQ出版社の「FPGA電子工作スーパーキット」に付属している基板MAX10-JBは、タイトルの環境下ではMAX10-FBにコンフィグレーション用データを書き込むことができない(2016/05/21現在)。

基板が付属しているムックではWindows上での動作についてしか触れられていないので、Ubuntuで動かないからといってブーたれるつもりはない。せっかくのセットだし自分で部品を取り寄せてハンダ付けした基板なのだから、使いたいのは山々だ。Windows10の上ではまったく問題なく動いていたのだから、なおのことだ。悪いのはアタシだ。あぁそうだよ、アタシだよ。

------- *

そもそも独立したWindows機を持っていない。いや正確に言えば半分シャレで買ったスティックコンピュータがあるにはあるんだが、ディスク容量が小さすぎてQuartus Primeを入れられない。そこでしかたなくMacOSⅩに入れてあるVMWare Fusionに入れてある(ぉぃ)Windows10を使うことにした。さすがに仮想環境の霊験あらたかなりて、ちゃんと動いた。ここで満足していれば良かったのだ。繰り返すが悪いのはアタシだよ。あぁそうだよ、アタシだよ。

重いってか遅いってか、まったくストレスがポイント10倍付きで溜まっていく。いくら仮想環境下とは言え、これではたまらん。情報を探ったらUbuntuでの動作が確認できたので、試してみることにした。Windows10とおなじくVMWare FusionにOSを新規でインストールして、Quartus Primeのインストールまでは難なく進んだ。いやもぉ早いのなんのって。4GB食わせたWindows10とは比較したくもないほどOS自体もアプリも小気味よく立ち上がってくる。たった1GBしか割り当てていないのに。おかげで仮想環境を動かしていても母艦のiMacの動作が引っ張られることもなく、実に快適だ。

ここまでは良かったんだが、困ったことに書き込みができない。FPGAへのコンフィグレーションができないのだ。ダメじゃん。orz

------- *

ほとんど丸一日取っ組み合いをやったが、どうにもいうことを聞いてくれない。さすがのGoogle先生もこの出たばかりのムックについては情報の持ち合わせがないらしい。しかしAltera純正のダウンロードケーブルUSB Blasterは20K円もする。とてもとても。だが心配ない。世の中には互換機というものがある。Amazonで1,200円で売っている悟空なる互換ケーブルでQuartus PrimeからMAX10へのコンフィグレーションに成功したという情報も見つけた(これも役に立った)

さっそく取り寄せて今朝から試しているが、ありがたいことになんのトラブルもなくコンフィグレーションに成功している。参考にしたサイトの情報では /etc/udev/rules.d/に拡張子 .rules で権限設定のルールを記述するようにとなっているが、これがアタシの環境ではどうも効いていないようだ。#udevadm --control reload-rules が効いていないのかと思ったが、アプリを起動し直してもOSをリブートしても変わらない。ここで立ち往生は情けないとさらに調べていったら、./altera_lite/16.0/quartus/bin/jtgconfig という妖しの呪文を見つけた。

起動してみるとjtagチェーンが切れているとか言われたが、登録されているデバイスをいったん --remove して再接続したらリンクが設定されたようだ。もしかしたら16.0以降にこのあたりの仕組みが少し変わったのかも知れない。とにかくこれで、目出度く書き込みができるようになった。開発環境も快適だ。文句があるとしたらMAX10-JBならばUSBバスパワーでMAX10-FB(MAX10が乗った本体のボード)にも電源を供給してくれるのに、悟空はさすがにそこまではしてくれないことくらい。これはあとで手持ち部品を使って簡単な電源回路でも作ることにしよう。

------- *[後記]

何度か実験してみたが、やはり /etc/udev/rulrs.d/ のファイルは必要みたいだ。rules.d下に情報どおり 51-usbblaster.rules というファイルを置いている。内容は下記のとおり。

---

ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666"
ATTRS{idVendor}=="09fb", ATTRS{idProduct}="6001", MODE="666"

---

情報元によってATTRだったりATTRSだったりするので、両方書いてある。^^;

 


FPGAのワークベンチ写真

2016年05月15日 19時19分45秒 | FPGA

やってみて覚える派としては、とにかく動くものが必要。ありがたいことに「FPGA電子工作スーパーキット」という基板付きのムックがCQ出版から出ているので、これを使うことにした。

実はこの付録の基板だけではなにもできなくて、MAX10が乗ったFB基板には各種コネクタ(ピンヘッダ、ソケット)が必要だし、書き込み(コンフィグレーション)を行うJB基板は文字どおり「基板」であって部品は実装されていない。これらについては「マルツさんの紹介ページ」を参照してもらいたい。アタシもこの追加部品セットを購入した。ページの先頭は完成基板の紹介なので、めげずに下までスクロールしていこう。でもハンダ付けに自信がないか手間を省きたい人は、素直に完成基板を買った方がいい。(^^)

アタシは仕事がらいろんな部品を持っているので、外付けのボードなんか用意したぐらいにして楽しんでいる。写真はその一例。

ムックのサンプルにLチカがあったが、基板上のフルカラーLEDが七色に点滅するというだけでは面白くない。Verilog HDLの勉強のつもりで8桁のLEDを制御できるようにしてみた。オリジナルにちょっと手を加えただけだが、この程度だとまず失敗はない上に意外と学べることもある。

たとえばフルカラーLEDは3bitで制御しているんだが、外付けの8桁LEDは8bit制御。ここに持っていくためにトーシローのおっかなびっくりをやる。まずはフルカラーLEDとおなじ3bitの情報を引き出して3個だけの点滅をやってみた。これで新しいwireの追加やら、それを外に持っていくための接続の仕組みを復習。やはり本に書いてあるとおりにやっただけでは実感が湧かない。自分で考えたものを追加することで、あぁ、なるほど(ぽん)と腹に落ちるというものだ。

つぎはこれを8bitに拡張。ここで専用のreg変数を定義してもいいんだが、ふと思い立ってオリジナルがフルカラーLEDを点灯させるために定義した[2:0]のreg変数を[7:0]に拡張してみた。フルカラーLEDの方は最下位から3bitを使えばいいので、ひとつの8bitのreg変数が両方で共有できることになる。

この辺り、実際に基板上でやっていたら配線がやり直しになる。けっこうな手間がかかるのでめげてしまうが、FPGAならばVerilog HDLのソースを書き換えるだけだ。それでいてMAX10の内部では新しい回路ができていくというのだから嬉しい。なんだか不思議な感覚だが、これがFPGAというものなのだろう。

ところで写真の左上端に小さな青い部品が見えると思う。これはコンデンサだ。Lチカをやっているうちに、こいつの周期をうんと短くしてやれば音を出せるじゃないかと思いついた(若いころと違って思いつくのが遅い^^;)。さっそくVerilog HDLにサウンド用の記述を追加し、周波数計で期待どおりの周波数がでていることを確認した。

なんだか楽しくなってきたぞ。来週はいよいよ、この子にスタックの論理を教えるのだ。

------- *同日追記

それにしてもどうにもこのWindowsの汚いフォントには慣れない。

なんとかならんかとGoogle検索エンジンをぶん回していたらVirtualBoxにUbuntuを入れてAlteraの開発環境Quartus Primeを使っているという人の記事を見つけた。VirtualBoxを入れなくても、アタシのiMacにはVMWare Fusionがある。試しにUbuntuデスクトップをインストールしてみているが、フォントが実に美しく(Windows10比)て嬉しくなった。

これでQuartus Primeが快適に動いてくれたらいいなぁ。


FPGA三昧の連休が終わる(ちょっと追加)

2016年05月13日 18時33分24秒 | FPGA

週に一度の専門学校の授業以外はほとんど自宅で仕事をしている。時間を効率的に使えるので週末とか連休とか関係ないと言えば、ない。

とはいえ世間さまが大型連休と浮かれており、どこからも連絡が来なくなるこの時期はなにかを集中的にやっつける好機だ。今回はおかげでFPGAの勉強を死ぬほどやれた。MAX10評価ボードの半完成品と基板だけの書き込み器に部品を実装し、FPGA版Lチカはさほどの苦労もなく成功した。これからいよいよスタックマシンの構築に向けてさらにお勉強。

もっとも連休は今日で終わりなので、週末にボチボチ進めることにする。断片的にだが、チョロリと動いているんだけどね。^^;

------- *

たいして分量がないので、ここに追加しちゃう。

将来の飯の種になる可能性はうんと高いが、いまのところFPGAはアタシの趣味の世界。平日はコンサルで開発に参加させてもらっている企業の仕事が8割で、臨時講師を務める専門学校の授業とその準備が2割。週末の土日だけは自分の時間としてFPGAに取り組んでいる。平日でも夜は晩酌をチビチビやりながら参考書を読んだりはするけどね。

XilinxにしてもAlteraにしても、開発環境にはロジックシミュレータを用意している。ロジアナ相当の機能を開発対象のFPGAに組み込んでしまうというすごい仕組みもあるんだが、ここは趣味の楽しみ方。ディップスイッチやLEDをユニバーサル基板にポチポチとハンダ付けして楽しみたい。LEDはソース点灯だとMAX10に負担をかけそうだから電源を別個にしてシンクドライブにしようとか、入力デバイスとして接続するディップスイッチはプルアップ抵抗が必要かと思ったらMAX10の内部にプルアップ抵抗を持っていることがわかって喜んだり。

FPGAはこのごろ出てきたデバイスじゃないが、最初は使うのが大変だったに違いない。情報が少なかったり、開発環境が整備されていなかったり。別にその辺が整備されるのを待っていたわけではないが、良い時期に始めたような気がする。

楽しまなくちゃね。(^^)


FPGAでFORTHマシンを楽しみながら作る(少し具体的な)方法

2016年05月04日 08時34分46秒 | FPGA

最終的な姿として描いているのは、1個のFPGAの中にコンパイラと実行時インタプリタとスタックマシンが収まったものだ。ソースコードは外部からシリアル通信などで持ち込む。

コンパイラを論理回路で構成するのは、どう考えても無理筋だ。不定長の文字列を処理するのでね。不可能とまでは言わないが、「登山道の入り口で頂上を見上げてそのまま帰ってくる」ことになるだろう。

そこで、Alteraが用意してくれているNiosⅡというCPUコアを使うつもりだ。これはFPGAの中に実装される汎用のCPUで、これを動かすソフトウェアはC言語で書ける。FORTHの特徴のひとつである実行時インタプリタも、こいつ(NiosⅡ + C言語)で書いてしまおう。少なくとも初期段階では。

そして実行時インタプリタを支えるデータスタック、パラメータスタック、それらを操作するプリミティブなワード群は論理回路で構築する。全体をひとつのCPUと見立てると、これがマイクロコードみたいなものかも知れない。ちょっと違うかも知れない。どっちだよ。

こんなふうに分けたのは、まだFPGAを自在に操ることができないし実力のほども把握していないからだ。だから無理をしない。現時点でできそうだと当たりを付けたことをまずやってみる。そのうちだんだんとFPGAというものがわかってくるだろうから(もともとそのために始めたんだぞ。忘れるなよ> アタシ)、この役割分担は変えていってもいい。

------- *

FORTHコンパイラは何度か書いたが、このところはとんとご無沙汰。感覚を取り戻すためにArduinoの上で動くTinyFORTHを書いている。ディクショナリの構造を試してみるのに役立ちそうだと思っている。FPGA側にスタックマシンだけでも実装できれば、このTinyFORTHからそれを呼び出してみることができると思う。

FORTHという言語を知らない人には、何が何だかさっぱりな話だと思う。もともと説明のために書いているのではなく、自分自身の備忘録のつもりなのでお許しを。わからなければさっさと諦めていただくのがお互いの身のためだ。なんなんだよと、我ながら笑ってしまう。^^;

FPGAの方はCQ出版のムックに付いていた基板に、取り寄せた部品を実装し終えたところ。一応の動作確認は済ませており、開発環境一式はインストールした。MacOSだといいのに、こういうものはとにかくWindowsだ。フォントが汚くて(一体どういう工夫をすればフォントをこんなに汚く描画できるのだ)目に良くない。

ブツブツ文句を言いながら、連休はあと残り5日ほど。本も読みたいので、時間配分を考えなくちゃ。充実した5月の連休だ。