PSoCにはごく小規模な電子回路プログラマーが搭載されており、FPGAほどではないにせよ、電気信号の入出力をCPUの計算なしで処理させることができます。逆に言うと、この機能を使わないのであれば、STM32など他の汎用マイコンの方がよほど使い勝手がよいです。

独自の電子回路(カスタムコンポーネント)の制作における大まかな流れは

  1. シンボルウィザードで入出力端子を定義する
  2. Verilog言語で入出力される信号の処理を記述する
  3. メインプロジェクトに作成したコンポーネントを組み込む

となります。ピンからピンへと受け渡すだけの回路であればVerilogだけの知識で作れるので、手始めに論理回路の定番・フリップフロップ回路(電気信号を受け取るたびにHighとLowが恒久的に切り替わる)によるLチカを試してみましょう。

以前紹介したPSoC4入門のように新しいからのプロジェクトを作成します。今回はターゲットキットに「CY8CKIT-059」を使用しています。

Workspace Explorerから「Components」タブを選び、プロジェクトの箇所を右クリックし、「Add Component Item」を選択し、一覧から「Symbol Wizard」を選び、「Component name」に任意の名称を記入し、「Create New」ボタンをクリックします。
今回はボタン入力とLED出力の2つを用いるので、シンボルウィザードでこの図のように指定します。タイトルに使う色は機能には影響しません。
回路図が作成されたら、空白の箇所を右クリックして表示されるメニューより「Generate Verilog」を選択し、Verilogプログラムファイルを作成します。
次にVerilogファイルを編集します。言語の解説をするとかなりの量になるので、ここではざっくりと解説します(仕様としては厳密な説明ではありません)。
`include "cypress.v"

module flipflop (
    input   button_in,
    output  led_out
);

reg ff;

always @(posedge button_in)
begin
    ff = ~ff;
end

assign led_out = ff;

endmodule
button_inの信号が立ち上がった(posedge button_in)ときは常に(always)「begin~end」間を実行し、ffの値を都度反転させる。regは回路内にだけ存在する変数のようなもの。これを「led_out」と結線(assign)することで回路外部の信号とつながる。


プログラムを入力したら「Build→Generate Application」でコンポーネントをビルドします。ビルドに成功したら「TopDesign.cysch」を開き、先ほどのカスタムコンポーネントを配置し、「Digital Input Pin」「Digital Output Pin」をそれぞれつなぎ合わせます。

ボタン入力のピンをダブルクリックして設定を開き、「Drive mode」を変更してプルアップ抵抗を有効にします。
スイッチを使った電子工作で問題になるのが、電気的な振動が発生するチャタリング現象。一般的なマイコンではコンデンサーをつないだり、ボタン入力から一定時間監視するソフトウェアチェックを行わなければいけませんが、こういったこともハードウェアとして実装できるのがPSoCの強みです。

コンポーネント一覧から「Debouncer」を探し出して、図のようにつなぎます。
一定間隔の監視を行うため、クロックモジュールもつなぐ必要がありますが、この周波数は50~100Hzが適当です。周波数を増やしすぎると、チェックの間隔が非常に短くなり、かえってフィルタリングができなくなります。

似たようなコンポーネントに「Glitch Filter」がありますが、こちらはうっかりボタンを二度押ししたなどの、短い周期での連続した入力を無視するようにする機能が備わっています。

続いてICの物理ピンとつなぎ合わせます。CY8CKIT-059ではタクトスイッチが[2.2]に、LEDが[2.1]ピンに始めからつながっているので、「Design Wide Resources→Pins」よりそれぞれのピンを割り当てています。
ピン同士は直接つながっているため、main.cにプログラムを記述する必要はありません。プログラムを書き込んで再起動したら、スイッチを押すたびに点灯・消灯が入れ替わるかを確認してみましょう。