TMS32010

DSPと呼ばれる一群の専用プロセッサの最初期の製品のひとつが、このTMS32010です。
アナログ信号をデジタルの数値に変換してしまえば、従来はアナログ回路で実現していたことが計算処理によって実現できる。このアイディアをデジタル信号処理と呼びます。実際、デジタル信号処理を行えば、アナログ回路の置換が可能なばかりか、精度や調整の困難さによってアナログ回路では事実上実現不可能であった処理まで再現性をそこなうことなく実現可能な応用があります。
デジタルシグナルプロセッサ(DSP)がLSIによって1チップになるまでは、デジタル信号処理を行う回路は巨大で高価なものだったため、軍用や一部特殊用途にしか採用できませんでした。しかし、1980年にNECがLSI化DSPであるuPD7720を発表したり、それに続いて1983年にTexas Instruments社がTMS32010を発表して、他社も同様の製品を開発するにつれて、急速に普及していきます。今やモデムや携帯電話などの通信分野を中心に、さまざまな機器に組み込まれています。

TMS32010は1983年にTI社から発表されました。20 MHzクロックで動作し(外部バスクロックは5 MHz)、200 nsで16 bit乗算を実行できます。プログラムメモリは1語16 bitで、最大4096語まで使えます。データメモリは144語を内蔵しています。スタックは4レベルまで内蔵されています。入出力ポートは8個までアドレッシング可能。これらのスペックからわかるように、組み込み用途に特化したプロセッサで、一見4004に先祖返りしてしまったかのようです。当時の集積度では高速乗算器を実装するだけでチップのかなりの面積を使用してしまうため、命令解釈やアドレッシングモードなどは極端に切り詰められています。デジタル信号処理では畳み込み演算が中心で乗算と加算を多用する傾向があり、特に乗算を高速化する必要があります。当時の16 bitプロセッサで16 bit同士の整数の乗算を行うと、8086 (8 MHz)で約15 us、MC68000 (8 MHz)では8.75 us、80286 (6 MHz)でも3.5 usかかったことを考えれば、200 nsというのがいかにすごいかわかります。

TMS32010, TMS320C10
上はTMS32010JDLで下はCMOS版で高速化されたTMS320C10NL-25。

写真下のTMS320C10はTMS32010がCMOS化されたものの高速版で、25 MHzクロックで動作し、160 nsで16 bit乗算を行えます。TMS32010は20 MHzクロック動作時の消費電流が最大275 mAと大きかったのが、CMOS版となって20 MHz動作時に最大55 mAと1/5に、25 MHz動作時でも最大65 mAと大幅に少なくなっています。そのため、安価なプラスチックパッケージが使えて、組み込み用途に使いやすくなります。(資料によると、熱抵抗特性の優れた特別なプラスチックパッケージを用いたTMS32010も存在したようです。)

TMS32010の開発後、さらにDSPファミリが進化するにつれて、浮動小数点処理や4 GByteのメモリ空間など汎用の32 bitプロセッサと大差ないスペックの製品が現れてきますが、それでもデジタル信号処理用のアドレッシングモードや複数演算の同時実行など、デジタル信号処理に特化したアーキテクチャがいろいろと工夫されています。
TI社は1970年頃はTTLファミリの盟主でしたし、その後もワンチップマイクロコンピュータの基本特許を保有し各種マイクロプロセッサなどを筆頭にデジタル・アナログ両方のICメーカとして多様な製品を出荷し重要な地位にありました。が、最近は開発の主力をDSPに集中していますね。おもちゃにも組み込める低価格品から、多数の演算ユニットを内蔵して並外れた浮動小数点演算能力を持つDSPまで、実に広いレンジのDSPを開発販売しています。その始まり、DSPとしての最初の製品が、このTMS32010だったのです。

基本データ型は16 bitで1 Wordとなっていますが、16 bit×16 bitの乗算結果を次々と積算する都合上、アキュムレータは32 bit幅になっています。アキュムレータへの加減算は、対象とする数値を任意のビット数シフトしてから加減算を行なえるようになっていて、32 bit幅のアキュムレータを活用できます。また、アキュムレータのロードやストアもシフトをしたり、上位下位ワードに分割したりして、32 bit幅のアキュムレータと16 bit基本データとの折り合いを付けています。
乗算回路の一方の入力はTレジスタに固定されており、他の入力をメモリの内容や定数として与えられるようになっています。乗算回路の結果が格納されるのは専用の32 bit幅のPレジスタに固定されていて、Pレジスタの出力は算術論理演算回路を通してアキュムレータに達する経路しかありません。そのため、乗算結果は、必ずアキュムレータを介してしか利用できません。
データメモリのポインタとして、補助レジスタが二つ存在します。データメモリのアドレッシングモードとしては、直接アドレッシングの他、補助レジスタを用いた間接参照、さらに間接参照後のオートインクリメントやオートデクリメントなどが可能になっています。

以下に命令だけ列挙します。
mne.Cy W       機械命令            動作
ABS  1 1 0111 1111 1000 1000    アキュムレータの絶対値
ADD  1 1 0000 SSSS IDDD DDDD    データシフトおよびアキュムレータへの加算
ADDH 1 1 0110 0000 IDDD DDDD    アキュムレータ上位16 bitへの加算
ADDS 1 1 0110 0001 IDDD DDDD    符号拡張無しのアキュムレータへの加算
AND  1 1 0111 1001 IDDD DDDD    アキュムレータとのAND
LAC  1 1 0010 SSSS IDDD DDDD    データシフトおよびアキュムレータへのロード
LACK 1 1 0111 1110 KKKK KKKK    アキュムレータへの定数ロード
OR   1 1 0111 1010 IDDD DDDD    アキュムレータとのOR
SACH 1 1 0101 1XXX IDDD DDDD    アキュムレータ上位16 bitのシフトおよびストア
SACL 1 1 0101 0000 IDDD DDDD    アキュムレータ下位16 bitのストア
SUB  1 1 0001 SSSS IDDD DDDD    データのシフトおよびアキュムレータからの減算
SUBC 1 1 0110 0100 IDDD DDDD    条件付き減算(除算用)
SUBH 1 1 0110 0010 IDDD DDDD    アキュムレータ上位16 bitからの減算
SUBS 1 1 0110 0011 IDDD DDDD    符号拡張無しのアキュムレータからの減算
XOR  1 1 0111 1000 IDDD DDDD    アキュムレータとのEx-OR
ZAC  1 1 0111 1111 1000 1001    アキュムレータの0クリア
ZALH 1 1 0110 0101 IDDD DDDD    アキュムレータの0クリアおよび上位16 bitロード
ZALS 1 1 0110 0110 IDDD DDDD    アキュムレータの0クリアおよび符号拡張無しの下位16 bitロード
LAR  1 1 0011 100R IDDD DDDD    補助レジスタへのロード
LARK 1 1 0111 000R KKKK KKKK    補助レジスタへの定数ロード
LARP 1 1 0110 1000 1000 000K    補助レジスタポインタへの定数ロード
LDP  1 1 0110 1111 IDDD DDDD    データメモリページポインタへのロード
LDPK 1 1 0110 1110 0000 000K    データメモリページポインタへの定数ロード
MAR  1 1 0110 1000 IDDD DDDD    補助レジスタおよびポインタの変更
SAR  1 1 0011 000R IDDD DDDD    補助レジスタのストア
APAC 1 1 0111 1111 1000 1111    Pレジスタをアキュムレータへ加算
LT   1 1 0110 1010 IDDD DDDD    Tレジスタへのロード
LTA  1 1 0110 1100 IDDD DDDD    TレジスタへのロードおよびPレジスタのアキュムレータへの加算
LTD  1 1 0110 1011 IDDD DDDD    Tレジスタへのロード、Pレジスタへのアキュムレータへの加算、データ転送
MPY  1 1 0110 1101 IDDD DDDD    Tレジスタとの乗算
MPYK 1 1 100K KKKK KKKK KKKK    定数とTレジスタとの乗算
PAC  1 1 0111 1111 1000 1110    Pレジスタの内容をアキュムレータにロード
SPAC 1 1 0111 1111 1001 0000    Pレジスタをアキュムレータから減算
B    2 2 1111 1001 0000 0000    無条件分岐
BANZ 2 2 1111 0100 0000 0000    補助レジスタが0以外なら分岐
BGEZ 2 2 1111 1101 0000 0000    アキュムレータが0以上なら分岐
BGZ  2 2 1111 1100 0000 0000    アキュムレータが0より大きければ分岐
BIOZ 2 2 1111 0110 0000 0000    BIO端子が0なら分岐
BLEZ 2 2 1111 1011 0000 0000    アキュムレータが0以下なら分岐
BLZ  2 2 1111 1010 0000 0000    アキュムレータが0未満なら分岐
BNZ  2 2 1111 1110 0000 0000    アキュムレータが0以外なら分岐
BV   2 2 1111 0101 0000 0000    オーバーフローなら分岐
BZ   2 2 1111 1111 0000 0000    アキュムレータが0なら分岐
CALA 2 1 0111 1111 1000 1100    アキュムレータの指すサブルーチンの呼び出し
CALL 2 2 1111 1000 0000 0000    サブルーチン呼び出し
RET  2 1 0111 1111 1000 1101    サブルーチンからの復帰
DINT 1 1 0111 1111 1000 0001    割り込み禁止
EINT 1 1 0111 1111 1000 0010    割り込み許可
LST  1 1 0111 1011 IDDD DDDD    ステータスレジスタのロード
NOP  1 1 0111 1111 1000 0000    何もしない
POP  2 1 0111 1111 1001 1101    スタックトップをアキュムレータにポップ
PUSH 2 1 0111 1111 1001 1100    アキュムレータの内容をスタックにプッシュ
ROVM 1 1 0111 1111 1000 1010    オーバーフローモードのリセット
SOVM 1 1 0111 1111 1000 1011    オーバーフローモードのセット
SST  1 1 0111 1100 IDDD DDDD    ステータスレジスタのストア
DMOV 1 1 0110 1001 IDDD DDDD    次のデータメモリロケーションへデータコピー
IN   2 1 0100 0AAA IDDD DDDD    ポートからのデータ入力
OUT  2 1 0100 1AAA IDDD DDDD    ポートへのデータ出力
TBLR 3 1 0110 0111 IDDD DDDD    プログラムメモリからデータRAMへのデータ読み出し
TBLW 3 1 0111 1101 IDDD DDDD    データRAMからプログラムメモリへのデータ書き込み

mne.はニーモニックの欄。Cyは命令実行に必要なサイクル数で、最高クロック周波数で動作させた場合に1サイクルが200 nsに相当する。Wは命令のワード数を表す。
Sはシフト量で、命令によって0から15までの任意の値をとれます。Xもシフト量ですが、0, 1, 4しか指定できません。Kは定数を表します。Rは二つある補助レジスタのひとつを選択するビットです。AはI/Oポートアドレスを指定するビットです。
IとDはデータメモリアドレスを指定するためのビットです。Iは直接参照か間接参照かを表すビットで、Iが0のときに直接アドレッシングとなりD部分はデータメモリアドレスの意味になります。Iが1だと間接アドレッシングで、Dは特別な意味を持ちます。DのビットをLSBからD0, D1, ..., D6と名付けると、D0がARP、D3がNAR、D4がDEC、D5がINCという名称を持ちます。残りのD1, D2, D6は常に0になります。間接参照の場合、ステータスレジスタ中の補助レジスタポインタビットで、二つある補助レジスタのうちのどちらかをポインタとして使用するか決定します。INCかDECはどちらか一方を1にすることができて、INCが1の場合には使用された補助レジスタを命令実行直後にインクリメントし、DECが1ならデクリメントします。INCもDECも0のときには補助レジスタの内容は変化しません。NARが1の場合には命令実行直後に補助レジスタポインタビットにARPの値をロードします。NARが0の場合には補助レジスタポインタビットは変化せず、ARPは無視されます。このように、間接参照を用いると、補助レジスタ関係の命令を追加せずに(よけいなサイクルタイムを消費せず)、二つの補助レジスタの内容を変化させながら交互に二つの補助レジスタをポインタとして使用することができ、デジタル信号処理に適した命令体系になっています。

TMS32010は、その後命令や機能を拡張したTMS32020やTMS320C30などに発展していきますが、命令体系をそのままにして内蔵メモリ容量やI/O類を拡張した部分改良品も次々と開発されて、TMS32010ファミリーと呼べるような一群のDSPが揃います。もちろん、TMS32020やTMS320C30にも、それぞれファミリーが形成されます。そのうちのTMS3201xファミリーのひとつがこれ。

TMS320P15
TMS320P15FNLで44ピンPLCCパッケージに納められたTMS320E15の変種。サイズは約18 mm角。

TMS32010をCMOS化したのがTMS320C10で、そのTMS320C10の内蔵メモリを増やしたのがTMS320C15です。具体的にはTMS320C10の内蔵プログラムメモリ1.5 KWordをTMS320C15では4 KWordに、内蔵データメモリ144 Wordを256 Wordに増やしています。これらの内蔵プログラムメモリはマスクROMでしたが、それを紫外線消去型のUVEPROMにして、ユーザがプログラムできるようにしたのがTMS320E15です。ただTMS320E15では石英ガラス窓付きの高価なパッケージに封入されていてコストダウンできないので、少量生産用にTMS320E15を窓無しのプラスチックパッケージに封入したのがTMS320P15です。窓がないため消去できませんが、TMS320E15を用いて充分にデバッグしてから、たとえば数百個の生産時にTMS320P15を使用すると、コストダウンと短い納期を両立させられます。
さらにTMS320C15に電話用の音声圧縮伸長ハードウェアやシリアルポートやタイマを付加したTMS320C17などや、以上のDSPの高速クロックバージョンなど、さまざまな変種があります。

Return to IC Collection