マイコンのペリフェラルの1つとして,自由に構成可能なディジタル回路(CLB)を持ったPIC16F13145で遊んでみた.
ターゲットボードはPIC16F13145 Curiosity Nano(Microchip)である.オンボードでデバッガを持っているので,PICKITなどが無くても開発可能なようだ.
Microchipの開発環境
開発用ソフトウェアが高機能になり,煩雑でよく分からない(PIC初めて使った).CLBで遊ぶのに必要なものを3つ列挙する.
1:MPLAB X IDE
統合開発環境本体.コードを書いてビルドするもの.なんとNetbeansベースである.統合環境でありデバッガなども含まれる.
これをインストールすれば,下の2つも入るようだ.
2:MPLAB Code Configurator(MCC)
コードジェネレータ.例えば,GUIでピンアサインを設定すると,それを反映した初期化コードを生成してくれる.CLB用に合成・配置配線するための,CLB SynthesizerもMCCの中の1つという雰囲気である.
3:CLB Synthesizer
GUIによる回路図エディタを持っている.ゲートやFFの組み合わせで回路図を書き,Synthesizeボタンを押すと,ビットストリームを生成してくれる.内部的にはVerilogを吐くようである.
さらに,Verilogで入力した回路と,回路図入力した回路を結びつけることもできそうな雰囲気である(試してはいないが).
MPLABをダウンロードしなくても,ウェブアプリとしてCLB Synthesizerだけを利用することもできる.
https://logic.microchip.com/clbsynthesizer/
合成した結果を,MPLAB X IDEのプロジェクトにインポートすることも可能である.
開発環境の構築 -Prepare Environment-
筆者の環境はWindows 11
PIC18F16Q41 Curiosity Nano Hardware User Guide(DS50003048A)にそって進める.
MPLAB X IDEをダウンロード(1)
ダブルクリックしてインストール.
MPLAB XC Compilerのインストール・ウィザードも起動するので,インストール.
XCC16 XCC8があればよいと思われる.8bitなんだねこれ.
Packsインストール
DFP
MPLAB X IDEを起動して,[Tools]-[Packs]をクリック.
必要なDFPをインストール.
PIC16F1xxxx_DFPがあればよいと思われ.筆者は,1.25.389を利用した.
コンパイラのPATH
コンパイラにPATHを通すか,IDEでコンパイラの場所を指定するかしなければならない.筆者はIDEに設定した.
[Tools]-[Option]でダイアログを開く.Embededをクリックして,Build Toolsタブを開く.
[Add…]をクリックして,コンパイラのbinフォルダを選択する.
コンパイラは,MPLAB X IDEとは別にダウンロードも可能で,MPLAB X IDE以外にも,VSCodeに対応していると書いてある.
サンプル・プロジェクトを開く -Open Sample Project-
次のサンプルを取得する.
CLB用のコンフィグレーションを2つ持ち,それを動的に切り替えるサンプルらしい.
それぞれのコンフィグはDuty50の矩形波を出力するもので,周波数(1KHzと125Hz)が異なっているらしい.
Getting Started with Multiple Configurations for the Configurable Logic Block (CLB) - Use Case for the PIC16F13145 Microcontroller with MCC Melody
プロジェクトの配置場所について,OS上でPATHの長さ制限を超えないように注意する.ただでさえ,プロジェクト名が長いので注意.筆者はハマった orz
サンプルプロジェクトのCLBをCLBシンセサイザーで見たところ.
GUIで回路を描いて,「Synthesize」ボタンを押せば,ビットストリームを生成できる.
内部的にVerilogコードも生成されている.合成したファイルをダウンロードする(.zip)と,Verilogコードも入っている.
(その後,「Generate」も押さないと,既存コードへ反映されないようである)
サンプルの動作を変更してみる -Edit Sample Project-
CLB
サンプルプロジェクトは,複数のCLBコンフィグを動的に切り替えるプロジェクトになっている.ビルドした後,ボードに書き込めば動く.
独自に複数の回路を作りたい場合
Generateする前に,プロジェクト内にある既存のCLBビットストリームのファイル名(clbBitstream.s)を変更しておくことで,Generateしても上書きされず,2つ目のビットストリーム・ファイルを得られる.次の図は,3つ目のビットストリームを生成したところ.
clbBitstream.s内のコードについて,識別子はプロジェクト全体でユニークでなければならない.
後から生成したものと被らないように,5か所のラベル(識別子)を変更しておく.
(下記画像では生成された,clb_config を clb_config_alt に変えた)
これに合わせてapp.cのコードも変更する.
(下記画像ではベースとして使ったサンプル・プロジェクトに対して,さらに1つCLBコンフィグを追加したので,alt2 も足してある.その場合, NUMBER_OF_CONFIGS も変えること)
ピンアサイン
サンプルをビルドすれば実行できるが,結果を確認するために外部に測定器をつなぐのが面倒なので,CLBコンフィグが切り替わったことをオンボードのLEDを使って確認したい.
サンプルの設定
inputはRC3にアサインされており,これはオンボードのスイッチである.
outputはRA5にアサインされておりボード外周のピンヘッダとして引き出されているが,何かをつなげないと動作確認できない(サンプルはオシロかロジアナをつないで動作確認する前提のようである.Data VisualizerではCLBの出力は見れないようである).
せっかく,オンボードのLED(RC2)があるので,CLBからの出力をそこへ変更する.
ピンアサインはGUIで変更できるので,変更したあと,Generateすると,既存コードに対する変更分をMergeするか確認する画面になる.その画面で,>>をクリックしてMergeする.
そのように,出力したコードを反映する(既存のコードに対してMerge)必要がある.これを行わないと,既存のコードに反映されない.
ピン設定は, pins.h に記述されるようだ.
と,やったものの,2つのCLBコンフィグともに,PWM周波数が高いので目視では違いが分からない orz
CLBコンフィグ
仕方がないので,新たにCLBコンフィグを作った.スイッチ(RC4)直結の出力(RC2)である.
ブレッドボードに刺さるスイッチがなかった(探すのがめんどくさかった)ので,ジャンパで代用.
●RC4にVCC
LEDはアクティブローなので点灯しない.
さらに変更
CLBに遅いクロックを供給するために,Timerを使った.1msタイマをCLB側で 128分周.
CLBへ供給するクロックの設定は,CLBコンフィグ間で共有される.CLBコンフィグと共にクロックも切り替える場合は,サンプル・プログラムで行っているCLBコンフィグレーションの書き換えとは別に,クロック設定変更を行うコーディング(app.cなどで)が必要となるようだ.
CLB付きのPICを動かしてみた.複数の回路を動的に入れ替えできる.
— Lathe[léis] (@Lathe_Mariel) January 13, 2025
最初は「GPIO(ジャンパでon/offしてる)とLEDを繋げただけ」の回路.
オンボードsw押すと,「FFで信号反転してLED駆動する回路」に入れ替わる(クロックはタイマで作った1msをCLB側で分周を使ってる) pic.twitter.com/IkYPyeVycT
CLBの中でFF動作用のクロックは自動で決まる(全体で同じ)ようで,独自に設定できないようなので,少し書きにくさはありそうな気がする.
MPLAB Discoverという所で,他のサンプルプロジェクトを検索できる.
参考文献
(1)MPLAB X IDE Download
https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide#tabs
(2)PIC16F13145Product Family
https://www.microchip.com/en-us/products/microcontrollers-and-microprocessors/8-bit-mcus/pic-mcus/pic16f13145#System%20Features
(3)秋月電子通商,PIC16F13145 DIPパッケージ
https://akizukidenshi.com/catalog/g/g130192/
(4)Microchip store, PIC16F13145 CURIOSITY NANO EVALUATION KIT(ドキュメントはここから探す)
https://www.microchip.com/en-us/development-tool/ev06m52a
(5)FPGA.tokyo, 写真
https://fpga.tokyo/pic-2/