ムライボックス (3) --- エコノミー版 (1)

「富豪版」つまり出力ポートの数だけ UART を用意するハードウェア構成の上で、ソフトウェアも「富豪版」にする場合のブロック・ダイアグラムを下に示します。

ソフトウェア部分を一般的、抽象的に「処理」(processing) と表現していますが、ハード/ソフトを通じたデータの流れを文章で表すと、

  • MIDI-IN の DIN 端子から入力される MIDI シリアル・データストリームを、
  • UART 受信ハードウェアにより 8 ビット・パラレルデータに変換し、
  • ソフトウェアで UART 受信バッファ・レジスタから読み取って、
  • 各出力ポートごとに独立な「処理」を行い、
  • 各出力ポートに属する送信用 UART のバッファ・レジスタにデータを書き込むと、
  • 各 UART が互いに独立してパラレル/シリアル変換を行い、各 MIDI 出力ポートから MIDI シリアル・データストリームを送り出す。

ということになります。
「処理」をもう少し具体的に

  • MIDI データ・ストリームから各ポートごとに必要なチャネルのデータを抽出し、対応するポート側へ分配する
  • 分配されたデータ・ストリームのチャネル番号を (必要に応じて) 書き換える

と分割し、この順番で実行する場合のブロック・ダイアグラムを下に示します。

「分配」(distribute) は単にデータ・ストリーム入力から抽出/分配するだけで、データそのものの値は変化させません。
分配されてきたデータ・ストリームは、その出力ポート「専用」となり、ムライボックスの特徴の 1 チャネルへの書き換えだけでなく、データそのものを変化させるような任意の「処理」が可能です。
たとえば、

  • 出力ポート 1 用には、元の 5 チャネルのデータ・ストリームを 1 チャネルに書き換え、
  • 出力ポート 2 用には、元の 4 チャネルのデータ・ストリームを 1 チャネルに書き換え、
    元の 5 チャネルのデータ・ストリームを 2 チャネルに書き換えたものとマージ

のようなことが可能です。
ここで、元の 5 チャネルのデータ・ストリームを 1 チャネルに書き換えたものと、2 チャネルに書き換えたものとの 2 種が同時に存在することになりますが、データ・ストリームの抽出/分配の段階で各出力ポートごとに独立な「専用」のデータ・ストリームとして作成されるので、互いに影響し合う事はありません。
次に、「エコノミー版」つまり 送信 UART ハードウェアは 1 インスタンスだけで、外部にロジック・ゲートを設けて実現する方法のブロック・ダイアグラムを示します。

データ・ストリームの「分配」はロジック・ゲートによりハード的に行なうので、「富豪版」のソフトウェアとは逆の順番で、

  • ソフトウェアによるチャネル番号書き換えなどの処理
  • ハードウェアによるデータ・ストリームの分配

という流れになります。
送信 UART はひとつだけなので、「富豪版」で例に示したような、元はひとつのチャネルを複数のチャネル番号のストリームに書き換えることはできません。
ハード/ソフトを通じたデータの流れを文章で表すと、

  • MIDI-IN の DIN 端子から入力される MIDI シリアル・データストリームを、
  • UART 受信ハードウェアにより 8 ビット・パラレルデータに変換し、
  • ソフトウェアで UART 受信バッファ・レジスタから読み取って、
  • チャネル・メッセージのステータス・バイトならチャネル番号を書き換え (あるいはそのまま)、データ・バイトならそのまま、
  • ロジック・ゲートを操作して出力ポートを選択して、
  • ひとつだけある送信用 UART のバッファ・レジスタにデータを書き込むと、
  • 送信 UART ハードウェアが MIDI シリアル・データストリームを送り出す。
  • ロジック・ゲートによりシリアル・データストリームの必要部分だけが切り取られてポートから出力される。

受信/送信 UART を流れるデータのみに注目すると、 UART 受信データをそのままか、あるいはチャネル番号を書き換えて (データ・バイト数を増やしも減らしもせずに) 送信 UART に流しています。
そして、ロジック・ゲートにより送信 UART からのシリアル・データストリームの中から必要な部分を「時間窓」で切り取って、不要部分はアイドル状態の値 (「H」レベル、論理値「1」) で埋めて出力します。
「時間窓」による「切り取り」がシリアル・データのタイミングに損傷を与えないように、ゲート・タイミングが重要になってきますが、タイミングについては次回説明します。
「エコノミー版」 (1 UART + ロジック・ゲート) の実際の回路の説明として、まずは PSoC5LP の内蔵 UDB で実現した「回路図」を下に示します。

使用する UART は 1 個のみで、その送信出力と出力ポートの "OR" (論理和) を取ったものをピンに出力する回路を 16 ポート分並べたものです。
図の下側に 2 個ある「Control Reg」は UDB (Universal Digital Block) の中のエレメントで、ピンには接続されておらず内部回路へのみ信号出力される出力ポートのようなものです。
「コントロールレジスタ」と名付けられていますが、特定の「コントロール」の機能があるわけではなく、主にコントロール用途に使うための CPU/DMA 側から書き込み可能な汎用レジスタです。
MIDI 出力信号の「極性」としては「通常」の極性で、ピンから 220 Ω を介して直接 MIDI 出力の DIN 端子に出力するか、あるいは実質インバータ 2 段のドライブ回路を経由して MIDI 出力の DIN 端子に出力する場合を想定しています。
インバータ 1 段に相当するオープン・コレクタのトランジスタ 1 段でドライブする場合は、「反転」出力する必要があるので、"OR" ゲートの代わりに "NOR" ゲートを使います。
回路自体は OR ゲートだけで単純ですが、「出力」ひとつ当たり「マクロセル」ひとつを消費するので、16 ポート出力には 16 マクロセル必要になり、UDB 2 個分を消費します。
UDB が 4 個しかない PSoC4 4200 シリーズでも同様の回路で実現できますが、UART (送受両用) 1 ch を UDB 上にインプリメントすると、マクロセルが 21 個必要となり、ムライボックスとしての出力に割り当てる分のマクロセルが足りなくなります。
そのため、PSoC4 4200 シリース用では、UART は UDB リソースを消費しない内蔵固定ファンクションの SCB (Serial Communication Block) を使う必要があります。
PSoC5LP の場合には、固定ファンクションのシリアル・インターフェースは内蔵されていないので UDB 上に UART をインプリメントする必要があります。 PSoC5LP の場合には UDB の数が多いのでムライボックス用の出力が足りなくなることはありません。
SCB による UART と、UDB による UART ではハードウェア仕様が違っていて、API (Application Program Interface) 関数も異なり、コントロールするプログラムも違ってきます。