電子工作

CPLDで、SDカード(Ver.1)とSPIモードで通信(初期化まで)

以前はFT245RLを使って、PCのUSBコネクタ経由でSDカードとSPIモードで通信しました。今度は、CPLDを使って、SDカード(Ver.1)とSPIモードで通信してみました。初期化までを行いました。
いまいちVerilogの書き方とか、順序回路のタイミングなどがわかっていないので、効率がとても悪そう。functionを使わずなんでもalwaysで書いてるので、ラッチができていそう。でも今回は、回路がCPLDに納まって、かつ動けば良いという方針で行きます。


無事通信出来ました。CMD0 -> CMD1 -> CMD1

verilog HDLコードはこちら。170 LE

続きを読む

verilogとかquartus IIとかのちまちましたメモ

シミュレーションもしたいというときには、Quartus II 13.1.0 Web Edition (1.6 GB)だけでなく、model sim altera starter edition (900 MB)のインストールが必要。MAX IIなどのCPLDの規模(2210LEとか)ならば両方共フリー版で動く。
簡単なシミュレーションなら、New -> University program VWFを選ぶとsimulation wave form editorが起動する。Edit -> Insert -> insert node or busで、input指定してあるノードorバスを指定する。overwrite clockなどでクロック信号を入れたりできる。シミュレーションにはタイミングとfunctionとあって、タイミングの方は遅延を入れてくれるよう。
細かいシミュレーションはやり方を忘れたが、シミュレーションファイルを作って、Quartusからゲートレベルシミュレーションを起動。Workフォルダからシミュレーションしたい回路を選んで、実行という流れで、こちらのほうが複雑なシミュレーションができたはず。

Verilog HDLとか論理回路で、並列した回路から同時に代入をしようとすると、値は不定にならないのだろうか、と思ってテストしたら、次のエラーが出てコンパイルできなかった。
Error (10028): Can’t resolve multiple constant drivers for net “CSX” at sample.v(113)
ある変数(reg)に代入する回路を作る場合はひとつにまとめないとだめですね。複数に分けたならそれぞれの出力を拾ってand/orを取ってから代入とか。実際の回路配線を想像すると、そうしないと論理的にならないとわかるか。

always @ posedge clkでreg aに値を代入する回路と並列に、always @ posedge clkでaの値を参照する回路があった時に、参照して得られるaの値は代入前の値か、あとの値かという疑問があったのだけども、シミュレーションでは前の値が得られた。レジスタのサンプリングは少なからず遅延があるので、同種のレジスタを使っている以上それで、代入前の値が必ず入ると考えていいのだろうか、わからん。max iiはCPLDとしては最速らしいけど、遅延に関しては10 nsオーダ?であるらしいので、それでなんとかなるのか。

aitendoのTFT液晶モジュールZY-FGD1442701V1, ST7735をMAX II CPLDで駆動

aitendoで売っている(売っていた?)小型カラー液晶をCPLDでドライブするテストです。
4年ちょっと昔に売られ始めた時に買ったものです。その時はFT245RLあたりのICを使って、PCから制御していましたが、書き換えをもっと早くしたいというのと、CPLDのお勉強も兼ねて。
昔の記事//beiznotes.org/200911071257539777-2/

 

MAX IIのページにSC1602Bキャラクタ液晶の制御例がありましたが、Verilogコードが初心者が書いたみたいになっているのですが、なんなんでしょうか。とりあえずソースコード検索をしようとgoogle codeに行ったら404で、サービス終了で、Koderに行ったらこれもまたサービス移行していた。Ohlohコードサーチでverilogコードを探したらなんとかひとつ見つかって、それを参考にしました。
CPLDではCPUみたいに上から順番に処理するというのがめんどくさいです。ループばかりの本処理にはいってしまえばよいのですが、その前の初期化処理はひとつひとつにステートを割り当てて、ステートマシンで処理しています。

f:id:beiz23:20140208095934j:image:w360
オプティマイズさんのところのMAX II基板に接続しました。
ピンクを表示させたら発色が悪いので、ガンマとか、VCOMとかも設定することにしたけども、それでもまだ悪いです。まあそもそもバックライトムラなどもございますので、妥協すべきことがらなんでしょう。

Verilog HDLコードです。197LE

続きを読む

大気圧表示LCDを立てて置けるように基板にのせました

ブレッドボード上に配置していた大気圧表示LCDを、ユニバーサル基板上に載せて、立てて置いておけるようにしました。緑の基板で色を合わせました。USBケーブルで電源供給です。秋月の新しいガラエポ基板は紙エポよりランドを剥がしにくいという触れ込みのようですが、ランドを2つも剥がしてショックでした。紙エポだとめったに剥がしたことないのに。ランドが小さくなって熱容量も小さくなったからかな。
あとで拡張できるように、SPIピンを開けるため、LCD用のピンを別のピンに移すとかしていたら接続ミスをして、ソフトウェアで吸収しようとしたら時間がかかりました。この温度計はあまりあてにならないようなので、あまっている高精度の温度計をつなげてもよいなあと思います。
今考えるとUSBでとった5Vを3.3Vにレギュレートして、さらに-1.7Vをチャージポンプで作るって、効率が悪い事になってますね。
あとはI2CでEEPROMにデータを記録したりしたいかな。技術的には大気圧モジュールと同じなので、面白みがなくて後回しだけど。I2Cはとりまわしが楽でよいプロトコルだと思う。例えばEEPROMに記録したデータを外に読みだしたいという時も、外からI2Cの2ピンをクリップでつなげばインシステムで読み出せます。FT245RLあたりにつないでPCにデータを移すということとかができそう。SDカードに記録してもよいのですが、データ量が少ない時はファイルシステムを入れるのがめんどそう。
あとは8bitマイコンでもデバッガがあるといいなあと思いました。ロジアナがあるのでなんとかやれていますが。でもAVRのデバッガは5-10kくらいするみたいで高くて買えない。安くできるのがうりですし、ライタもせっかく作ったことですし。まあどうしてもデバッガが必要なような案件というか目標のときにはARMにでも手を出したいと思います。
あと換気扇を回しても、1-2m上に上げても気圧は0.2 hPaくらい下がるんですね。すごーい。