サイプレス社の「プログラムできるSoC」ことARM 32bit搭載マイコン・PSoC。Verilog言語を通じてFPGAのような論理回路をハードウェアレベルで作れるというのが最大の売り文句なのですが、C言語で組んだARMマイコン制御ブロックと連携しようとすると難易度は格段に跳ね上がります。C言語とVerilogを橋渡しする方法はいくつかあるので、私が独自に調べた手法を紹介していきます。

はじめはステータスレジスタとコントロールレジスタを介してデータを取得するする方法です。これは本来データの取得とは独立してコンポーネントの状態・制御を行うために使用するレジスタなのですが、これらレジスタのための標準コンポーネントとAPIがPSoC Creatorに含まれているので、手っ取り早さならこれが一番です。

欠点は、複数本のワイヤを引き出すことより、8bit、16bitとデータ幅が大きいほど、追加のコンポーネントリソースを追加せざるを得ず、結果としてリソースの消費が激しくなることです。

まずはPSoC CreatorのSynbol Wizardでクロック入力端子と8bit幅を持つ出力端子をもつを作成します。
このコンポーネントではクロックエッジが立ち上がるたびにresultの値を1つずつ増やしています。
オリジナルコンポーネントをメインプロジェクトに配置します。
この回路では10Hzのクロックソースを「Frequency Divider」によって分周して、UART経由でデータを目視できる速度にまで落としています。一番右の「Status_Reg」は「Component Catalog→Cypress→Registers→Status Register」に収録されているものを使っています。
プロパティの「Display as Bus」にチェックを入れると、ピンが一つにまとまります。

値を取得するプログラム例です。「Generate Application」で生成されるAPIに対象コンポーネントが保有するステータスレジスタを読み込むための「`Status`_Reg_Read()」があるので、割り込みが発生する(クロックが立ち上がる)たびに、ここより結果となる値を取得して、UARTでパソコンに送信しています。
サンプルプロジェクトのダウンロードはこちらからどうぞ。