PSoC UDB 内 PLD/マクロセルによるアップダウン・カウンタ (1)

OPL3 の AM LFO を構成する 7 ビット・アップダウン・カウンタ部分を、 PSoC 5LP の UDB (Universal Digital Block) 内の PLD/マクロセルのみを使う方法で実装したところ 1 UDB 内のリソースで実現することができました。
7 ビット・カウンタなので、本来 UDB 内のデータパス・セルによる実現の方が適していますが、あえて「ランダム・ロジック」である PLD/マクロセル部分を使ってみました。
まず、今回は PLD/マクロセル部分の「演算モード」について説明します。
下に PLD/マクロセル部分の構造の図を示します。

多くの FPGA が採用している SRAM 上にルックアップ・テーブル (LUT) を実現する方式ではなく、以前の PAL (Programmable Array Logic) や GAL (Generic Array Logic) のような PLD (Programmable Logic Device) と同様の AND-OR アレイで論理を実現する方式を採用しています。
PAL 風の命名法でいうと、「12C4」、つまり、12 入力 4 出力で出力は正論理/負論理切り替え可能 (complementary) になっています。 (正確には OR アレイ出力は正論理で、マクロセル内で論理反転をする)
ただし、入出力数は入力 12 本、出力 4 本に固定で、出力を削って入力に回すことはできません。
AND アレイ、OR アレイともにプログラム可能で、中間のプロダクト・ターム (product term) 数、つまり、AND アレイ出力数は 8 となっています。
4 本の OR アレイ出力それぞれにマクロセルが接続されています。 PLD 部とマクロセル部との接続は固定で、変更できません。
ひとつの UDB につき 2 組の PLD/マクロセル部が含まれています。 同じ PLD に属する 4 つのマクロセルのクロックは共通です。 UDB 内の 2 つの PLD/マクロセル部 (PLD0, PLD1) は、それぞれ独立な別のクロックで動作させることができます。
マクロセル内部の構造の図を PSoC5LP TRM (Technical Reference Manual) から転載します。

PLD 部からの OR アレイ出力は、エクスクルーシブ OR (XOR) ゲートを通してマクロセル内の D-FF に接続されています。
D-FF 出力をマクロセル出力とする「Registered」モードと、D-FF をバイパスして、XOR ゲート出力をマクロセル出力とする「Combinational」モードを選択できます。 バイパスして「組み合わせモード」にした場合、D-FF は他の用途には使えず、単に利用されないままになります。
D-FF 入力に接続されている XOR ゲートのもうひとつの入力に関しては、XOR フィードバック・マルチプレクサ (XORFB MUX) により動作モードを選択できるようになっています。
MUX の入力 0 が有効な場合、レジスタの CONST ビットが XOR に入力され、CONST = 0 では PLD の OR アレイ出力値がそのまま D-FF に入力され、CONST = 1 では OR アレイ出力値を反転したものが D-FF の入力となります。 (12C4 の 'C' の機能)
MUX の入力 2 が選ばれている場合、XOR ゲートには D-FF の Q 出力がフィードバックされるので、OR アレイ出力が「1」の場合のみ FF が反転する T-FF モードになります。
同様に、MUX の入力 3 が選ばれている場合、XOR ゲートには D-FF の QB 出力がフィードバックされるので、OR アレイ出力が「0」の場合のみ FF が反転する T-FF モードになります。
MUX の入力 1 が有効な場合には「演算」(arithmetic) モード、あるいは「キャリー・チェイン」(carry chain) モードとなり、加算/減算などに適したモードとなります。 ちょっと見えにくいのですが、MUX の入力 1 は「負論理」になっています。
「キャリー・チェイン」として、下位ビットとなる隣接するマクロセルからの桁上げが「selin」に入力され、上位ビットとなる隣接するマクロセルに対して桁上げが「selout」から出力されます。
キャリーの伝播の方向は、ひとつの PLD/マクロセル内ではマクロセルの番号の小さい方から大きい方へ、UDB 内では PLD0 から PLD1 へ、UDB 間でも物理的な配置位置により接続方向が決まっています。
マクロセル間のキャリー・チェーン接続は固定で変更できません。 論理合成ソフトウェアのプレース・アンド・ラウトの段階でセルへの割り付けを調整して正しく機能するような配置が選ばれます。
また、キャリー・チェイン出力 selout を選択する MUX のふたつの入力 (cpt0, cpt1) には、プロダクト・ターム、つまり AND アレイ出力が直接に接続され、その接続先も固定されています。 (見えにくいですが、cpt1 は負論理入力)
この PSoC 3/4/5LP の UDB のマクロセルは、Cypress 社の CPLD (Complex Programmable Logic Device) である Delta39K などと同様の構成のようです。
Cypress 社のドキュメント

The Delta39K/Quantum38K Carry Chain

からマクロセルの構造の図を転載します。

PSoC 3/4/5LP の UDB に付属するクロック・セレクト/イネーブルのための回路は、TRM では「Reset and Control Module」という別の項目で説明されているので、Delta39K の回路との差異を無視すると、2 点を除いてほぼ同一であることが分かります。
違いの 1 点目は、Delta39K では新たなキャリー・チェインを始めるために連鎖を断ち切るための AND ゲートがキャリー入力 selin 側に付いているのに対し、PSoC ではキャリー出力側のマクロセルの selout 側に付いていることです。
これは、単にキャリー・チェイン開始のマクロセル内でゲートするか、あるいは、(キャリー・チェインとは関係のない) ひとつ前のマクロセル内でゲートするかの違いであり、論理合成ソフトウェアが適切に処理をしてくれるので、差異を気にする必要はありません。
もうひとつの違いは、Delta39K のマクロセルではキャリー出力 selout が XOR 入力 MUX に入力されているのに対し、PSoC のマクロセルではキャリー入力 selin が XOR 入力 MUX に入力されている点です。 (PSoC の XOR MUX の入力 1 は負論理なので、MUX 出力には論理反転されたものが現れる)
これは大きな違いで、PLD の AND-OR アレイ部で実現すべき論理式が異なってきます。
以下では、PSoC のマクロセルの場合に限って述べます。 キャリー・チェインに注目して、arithmetic モードでのマクロセル回路を簡略化した図を下に示します。

cpt0, cpt1 をデータ入力とし、キャリー入力 selin をセレクト入力とする 2-to-1 MUX でキャリー出力 selout を作り出しています。
アダーの SUM 部分は PLD 部分で作り出した結果と、キャリー入力 selin (の反転) とを XOR しています。
4 マクロセル全てをarithmetic モードとし 4 ビット加算器を実現した場合の PLD 部分の AND アレイ、OR アレイの設定、およびプロダクト・タームとマクロセルとの間の結線も含んだ図を下に示します。

SUM 出力を作り出すメインの XOR 入力には cpt0 と cpt1 とを OR したものが使われており、それもマクロセル内に含めて表示したマクロセル回路を下に示します。

入力をそれぞれ A, B とし、S = A + B の計算の n ビット目のスライスを表しています。
まず、キャリー入力 selin[n] = 0 の場合、cpt0 入力が選ばれ、selout[n] の値となります。
selin[n] = 0、つまり下位ビットからのキャリーなしにもかかわらず上位ビットへのキャリー出力が発生するのは A[n] = 1 かつ B[n] = 1 の条件に限られます。
したがって、

cpt0 = (A[n] & B[n])

というプロダクト・タームを AND アレイで作り出します。
次に、キャリー入力 selin[n] = 1 の場合、cpt1 入力を反転したものが選ばれ、selout[n] の値となります。
selin[n] = 1、つまり下位ビットからのキャリーがあり、さらに上位ビットへキャリーが伝播するのは A[n] = 1 または B[n] = 1 の条件に限られます。
したがって、

~cpt1 = (A[n] | B[n])
cpt1 = ~(A[n] | B[n]) = (~A[n] & ~B[n])

というプロダクト・タームを AND アレイ部で作り出します。
SUM を計算している XOR のひとつの入力にはキャリー入力 selin[n] を反転したものが加えられています。 したがって、

out[n] = (~selin[n] ^ XORin)
         = (~selin[n] ^ ~(A[n] ^ B[n]))
         = (selin[n] ^ A[n] ^ B[n])
 
XORin = ~(A[n] ^ B[n])
         = ((A[n] & B[n]) | (~A[n] & ~B[n])) = (cpt0 | cpt1)

となり、(cpt0 | cpt1) を OR アレイ部で計算すればよく、それ以外のプロダクト・タームは必要ありません。
マクロセルひとつ当たり 2 本の専用プロダクト・タームを使うので、4 マクロセル合計で PLD の 8 プロダクト・タームを過不足なくすべて使い切ることになります。
次回は、マクロセルの arithmetic モードを利用する方法について説明します。