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というのがいかにすごいかわかります。
上は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ファミリーのひとつがこれ。
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