| 一般情報 | |
|---|---|
| 発売 | 1988 (1988年) |
| 共通メーカー | |
| パフォーマンス | |
| 最大CPUクロックレート | 0 Hz~2 MHz |
| データ幅 | 8 (RAM)、8 (ROM) |
| アドレス幅 | 8(RAM)、15(ROM) |
| 物理的仕様 | |
| パッケージ | |
| アーキテクチャと分類 | |
| 応用 | 埋め込み |
| 命令セット | COP8 |
| 命令の数 | 69 |
| 歴史 | |
| 前任者 | COP400 |
| 後継 | なし |
ナショナルセミコンダクターのCOP8は、8ビットCISCコアマイクロコントローラです。COP8は、従来のCOP400 4ビットマイクロコントローラファミリ の強化版です。COP8の主な機能は以下のとおりです。
- 多数のI/Oピン
- コードとデータ用の最大32KBのフラッシュメモリ/ ROM
- 非常に低いEMI
- 多数の統合周辺機器(シングルチップ設計を意味する)
- インシステムプログラミング
- 無料のアセンブラツールチェーン。商用Cコンパイラも利用可能
- 無料のマルチタスクOSとTCP/IPスタック
- 1秒あたり200万命令のピーク
COP8の基本命令サイクル時間はクロック周波数の1/10です。最大10MHzのクロックで、最大1MHzの命令実行速度が得られます。(10MHzクロックは一部のタイマー周辺機器によって直接使用されます。)最大命令実行速度は1バイトあたり1サイクルで、ほとんどの1バイト命令は1命令サイクルで実行されます。一部の命令、特に分岐命令は1~2サイクル多くかかります。一部のモデルにはクロックダブラーが搭載されており、最大10MHzの入力クロックを受け付けますが、内部で20MHzのマスタークロックに倍増することで、2MHzの命令実行速度を実現します。[ 1 ] : 7,32
このチップは、任意の遅いクロックを許容できる静的ロジック設計である。 [ 1 ]:10 ほとんどのモデルには2番目の 電力を節約するために高速クロックを無効にしている間、CPU クロックに使用できる 32 768 Hzクォーツ クロック水晶発振器。
レジスタとメモリマップ
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
COP8は命令空間とデータ空間を別々に使用します(ハーバードアーキテクチャ)。[ 2 ] : 2-1 [ 3 ] : 2-4 命令アドレス空間は15ビット(最大32KiB)で、データアドレスは8ビット(最大256バイト、バンク切り替えにより拡張)です。
ソフトウェアのバグを検出できるように、無効な命令アドレスはすべて0(トラップ命令)として読み出されます。スタックの上位にある無効なRAMはすべて1(無効なアドレス)として読み出されます。
CPUは8ビットのアキュムレータと15ビットのプログラムカウンタを備えています。さらに16個の8ビットレジスタ(R0~R15)と8ビットのプログラムステータスワードがメモリマップされています。これらにアクセスするための特別な命令もありますが、一般的なRAMアクセス命令も使用できます。
メモリ マップは、次のように半分が RAM、半分が制御レジスタに分かれています。
| 住所 | 使用 |
|---|---|
| 0x00~6F | スタックに使用される汎用RAM |
| 0x70~7F | 未使用、スタックのアンダーフローをトラップするためにすべて 1 (0xFF) として読み取られます |
| 0x80~8F | 未使用、未定義と読み取り |
| 0x90–BF | 追加の周辺制御レジスタ |
| 0xC0–CF | 周辺機器制御レジスタ。 |
| 0xD0–DF | 汎用I/OポートL、G、I、C、D |
| 0xE0~E8 | 予約済み |
| 0xE9 | マイクロワイヤシフトレジスタ |
| 0xEA–ED | タイマー1レジスタ |
| 0xEE | CNTRLレジスタ、マイクロワイヤとタイマー1の制御ビット |
| 0xEF | PSW、CPUプログラムステータスワード |
| 0xF0–FB | R0~R11、オンチップRAMをレジスタとしてマッピング |
| 0xFC | R12(別名X)、二次間接ポインタレジスタ |
| 0xFD | R13(別名SP)、スタックポインタレジスタ |
| 0xFE | R14(別名B)、プライマリ間接ポインタレジスタ |
| 0xFF | R15(別名S)、データセグメント拡張レジスタ |
RAMがバンク化されていない場合、R15 (S) は単なる汎用レジスタです。RAMがバンク化されている場合、データアドレス空間の下位半分(アドレス0x00~7F)は、Sによって選択されたRAMバンクに送られます。データアドレス空間の上位半分にある特殊用途レジスタは常に参照可能です。0xF xのデータレジスタは、バンク間でデータをコピーするために使用できます。
バンク0以外のRAMバンクは、128バイトすべて利用可能です。スタック(スタックポインタでアドレス指定)は、Sレジスタの設定に関わらず、常にバンク0にあります。
管理権の移転
JMPLアドレス空間全体をアドレス指定できる3バイト命令と命令に加えてJSRL、これらの命令の2バイト版である命令JMPとJSR命令は、4Kページ内でジャンプできます。命令はPCの下位12ビットを指定し、上位3ビットは保持されます。(これらは主に最大4KのROMを搭載したモデルを対象としています。)短距離分岐には、JPPC-32からPC+31へのPC相対分岐を実行する1バイト命令が63個あります。これは15ビットの加算であり、ページ境界の要件は適用されません。
また、アキュムレータの内容をアドレスの下位 8 ビットとして使用するジャンプ間接命令とロード アキュムレータ間接命令もあり、現在の PC の上位 7 ビットは保持されます。
条件分岐自体は存在せず、プロセッサは従来のZCVNステータスフラグも提供しません。ただし、プログラムステータスワードには、マルチバイト演算用のキャリーフラグとハーフキャリーフラグが含まれています。代わりに、いくつかの比較スキップ命令があります。例えば、IFEQ2つのオペランドを比較し、等しくない場合は次の命令をスキップします。スキップできる命令は分岐命令に限らず、任意の命令です。
このメカニズムの興味深い拡張として、リターンアンドスキップ命令があります。この命令により、任意のサブルーチンは条件付きで呼び出し後の命令をスキップできます。これにより、サブルーチンから ブール値をRETSK返すための非常にコンパクトな方法が提供されます。
COP8アーキテクチャ特有のもう一つの特徴は、IFBNE命令です。この1バイト命令は、B(メモリポインタ)レジスタの下位4ビットと4ビットの即値定数を比較し、Bが小さなバッファ(最大16バイト)の終端に達するまでループ処理を実行するために使用できます。他にも1バイトLD B,#imm4命令があります。
命令セット
COP8のオペランドは、デスティネーション、ソースの順に並べられます。ほとんどの命令では、アキュムレータAがオペランドの1つとして使用されます。もう1つのオペランドは通常、8ビットの即値、8ビットのRAMアドレス、または[B]Bレジスタによって選択されたRAMアドレス( )から選択されます。LDおよびX(アキュムレータとの交換)命令は、Xレジスタ([X])によるRAMアドレス指定と、後置インクリメント/デクリメントバリアント([B+]、[B−]、[X+]、[X−])もサポートしています。
B を介した間接アドレス指定は特に高速であり、命令が実行されるのと同じサイクルで実行できます ( X A,[B]1 サイクルの命令であっても)。
一方、絶対RAMアドレス指定は、、、、、の5つの命令に対してのみ直接エンコードされます。後者は「直接アドレス指定」オペコードプレフィックスであり、オペランドを持つ任意の命令の先頭に付加でき、オペランドを指定されたメモリ位置に変更します。(条件スキップ命令は、プレフィックスと後続の命令をペアとしてスキップします。)、、命令との併用については、専用命令の方が効率的であるため、文書化されていません。 LD A,addr8X A,addr8IFEQ addr8,#imm8LD addr8,#imm8DIR addr8[B]DIRLD A,[B]X A,[B]LD [B],#imm8
すべての「移動」命令は、LDたとえ宛先がメモリアドレス()であっても、(ロード)命令として呼び出されます。通常、アキュムレータをソースとする命令はありません。ストアは、アキュムレータとメモリオペランド を交換し、Aをストアし、以前のメモリ内容をロードする命令で実行する必要があります。LD addr8,#imm8LDX
ROM内のテーブルからデータをフェッチする命令があります。これらの命令は、プログラムカウンタ(PCU)の上位7ビットとアキュムレータを組み合わせ、そのアドレスから1バイトをフェッチし、アキュムレータ(LAID命令)またはプログラムカウンタPCLの下位8ビット(JID命令)に格納します。次に実行される命令は、テーブル自体と同じ256バイトのROMページに存在する必要があるため、256エントリのテーブルは実現できません。
| オペコード | オペランド | ニモニック | サイクル | 説明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | b2 | b3 | |||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — | — | 国際 | 7 | ソフトウェア割り込み(PCをプッシュ、PC ← 0x00ff) |
| 0 | 0 | 0 | オフセット | — | — | JP +表示5 | 3 | PC ← PC + offset ; 1~31バイト前方にジャンプ (offset≠0) | ||||
| 0 | 0 | 1 | 0 | 高い | 低い | — | JMPアドレス12 | 3 | PC[11:0] ← addr . PCの上位3ビットは保持されます。 | |||
| 0 | 0 | 1 | 1 | 高い | 低い | — | JSRアドレス12 | 5 | サブルーチンにジャンプ: PC を押して、JMP として続行します。 | |||
| 0 | 1 | 0 | 0 | け | — | — | IFBNE # imm4 | 1 | (B & 15) = kの場合、次の命令をスキップします。 | |||
| 0 | 1 | 0 | 1 | け | — | — | LD B、# imm4 | 1 | B ← 15 − k(ゼロ拡張) | |||
| 0 | 1 | 1 | 0 | 0 | オペコード | — | その他の指示 | |||||
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | け | — | ANDSZ A,# imm8 [ a ] | 2 | A & k = 0 (=IFBIT #ビット、A) の場合はスキップ |
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 住所 | — | JSRBアドレス8 [ b ] | 5 | PCを押して、アドレス[ 1 ]のブートROMサブルーチンにジャンプします。 |
| 0 | 1 | 1 | 0 | 0 | 0 | 1 | – | — | — | (ブートROM用に予約)[ b ] [ 1 ] | ||
| 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | — | — | CLR A | 1 | A ← 0 |
| 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | — | — | スワップA | 1 | A ← A<<4 | A>>4; ニブルを交換 |
| 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | — | — | DCOR A | 1 | BCD加算 後の小数点の修正 |
| 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | — | — | Aを押す[ a ] | 3 | [SP] ← A, SP ← SP−1 |
| 0 | 1 | 1 | OPCC | 少し | — | — | [B] [ c ]のビット操作 | |||||
| 0 | 1 | 1 | 0 | 1 | 少し | — | — | RBIT #ビット、[B] [ c ] | 1 | RAMの指定されたビットをリセット(0にクリア) | ||
| 0 | 1 | 1 | 1 | 0 | 少し | — | — | IFBIT #ビット、[B] [ c ] | 1 | RAMの指定されたビットをテストし、ゼロの場合はスキップします | ||
| 0 | 1 | 1 | 1 | 1 | 少し | — | — | SBIT #ビット、[B] [ c ] | 1 | RAMの指定されたビットを(1に)設定する | ||
| 1 | 0 | 0 | メートル | 0 | オペコード | わかった? | — | 二項演算、A ← A opオペランド | ||||
| 1 | 0 | 0 | 0 | 0 | オペコード | — | — | OP A、[B] [ c ] | 1 | A ← A op [B] | ||
| 1 | 0 | 0 | 1 | 0 | オペコード | け | — | OP A、# imm8 | 2 | A ← A op k | ||
| 1 | 0 | 0 | メートル | 0 | 0 | 0 | 0 | わかった? | — | ADC A、オペランド | C,A ← A +オペランド+ C; キャリー付き加算 | |
| 1 | 0 | 0 | メートル | 0 | 0 | 0 | 1 | わかった? | — | SUBC A、オペランド | C,A ← A + ~オペランド+ C (A −オペランド− ~C) | |
| 1 | 0 | 0 | メートル | 0 | 0 | 1 | 0 | わかった? | — | IFEQ A、オペランド | A ≠オペランドの場合はスキップ | |
| 1 | 0 | 0 | メートル | 0 | 0 | 1 | 1 | わかった? | — | IFGT A、オペランド | A ≤オペランドの場合はスキップ | |
| 1 | 0 | 0 | メートル | 0 | 1 | 0 | 0 | わかった? | — | ADD A、オペランド | A ← A +オペランド(繰り上がりは変更されません!) | |
| 1 | 0 | 0 | メートル | 0 | 1 | 0 | 1 | わかった? | — | AND A、オペランド | A ← A &オペランド | |
| 1 | 0 | 0 | メートル | 0 | 1 | 1 | 0 | わかった? | — | XOR A、オペランド | A ← A ^オペランド | |
| 1 | 0 | 0 | メートル | 0 | 1 | 1 | 1 | わかった? | — | OR A、オペランド | A ← A |オペランド | |
| 1 | 0 | 0 | 0 | 1 | オペコード | — | — | ゼロオペランド命令 | ||||
| 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | — | — | IFC | 1 | キャリークリアの場合はスキップ |
| 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | — | — | IFNC | 1 | キャリーセットの場合はスキップ |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | — | — | INC A | 1 | A ← A + 1 (繰り上がりは変更なし) |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | — | 12月A | 1 | A ← A − 1 (繰り上がりは変更なし) |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | — | — | ポップA [ a ] | 3 | SP ← SP+1, A ← [SP] |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | — | — | レツク | 5 | PCをポップし、1つの命令をスキップします |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | — | — | RET | 5 | ポップPCハイ、ポップPCロー |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | — | レティ | 5 | 割り込みを返して有効にする |
| 1 | 0 | 0 | 1 | 1 | オペコード | け | — | 即値オペランドを持つ命令 | ||||
| 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | け | — | LD A、# imm8 | 2 | A ← k |
| 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | け | — | IFNE A、# imm8 [ a ] | 2 | A = kの場合はスキップ |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | け | — | LD [B+]、# imm8 | 3 | [B] ← k , B ← B + 1 |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | け | — | LD [B−],# imm8 | 3 | [B] ← k , B ← B − 1 |
| 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 住所 | — | XA、アドレス8 | 3 | A ↔ [住所]、交換 |
| 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 住所 | — | LD A、アドレス8 | 3 | A ← [住所] |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | け | — | LD [B]、# imm8 | 2 | [B] ← k |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | け | — | LD B、# imm8 [ a ] | 2 | B ← k (=LD R14,# k、1サイクル速い) |
| 1 | 0 | 1 | オペコード | 0 | c | その他の指示 | ||||||
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | — | — | RC | 1 | C ← 0; キャリーを0にリセット |
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | — | — | SC | 1 | C ← 1; キャリーを1にする |
| 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | — | — | レイド | 3 | A ← ROM[PCU:A]; ROMからロード |
| 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | — | — | JID | 3 | PCL ← ROM[PCU:A]; ROMテーブル経由でジャンプ |
| 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | — | — | RLC A [ a ] | 1 | C,A ← A,C; キャリーで左回転 (=ADC A,A) |
| 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 住所 | け | IFEQアドレス8、# imm8 [ a ] | 3 | [ addr ] ≠ kの場合はスキップ |
| 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 高い | 低い | JMPLアドレス15 | 4 | PC ←アドレス |
| 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 高い | 低い | JSRLアドレス15 | 5 | PC、PC ←アドレスを押す |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | — | — | RRC A | 1 | A,C ← C,A; 繰り上がりで右回転 |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | — | — | (予約済み) | ||
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | — | — | VIS [ a ] | 5 | PC ← ROM[ベクターテーブル]; ベクター割り込み選択 |
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | — | — | RPND [ a ] | 1 | 保留中の割り込みフラグをリセットする |
| 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | — | — | いいえ | 1 | 操作なし |
| 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | — | — | IFNE A,[B] [ a ] [ c ] | 1 | A = [B]の場合はスキップ |
| 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 住所 | け | LDアドレス8、# imm8 | 3 | [住所] ← k |
| 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 住所 | — | ディレクトリアドレス8 | 3 | 次の命令のオペランドを[B]から[ addr ] に変更する |
| 1 | 0 | 1 | R | L | = | 1 | ± | — | — | ロード/交換操作 | ||
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | — | — | XA、[B+] | 2 | A ↔ [B], B ← B+1 |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | — | — | XA、[B−] | 2 | A ↔ [B], B ← B−1 |
| 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | — | — | XA,[B] | 1 | A ↔ [B] |
| 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | — | — | LD A、[B+] | 2 | A ← [B]、B ← B+1 |
| 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | — | — | LD A、[B−] | 2 | A ← [B], B ← B−1 |
| 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | — | — | LD A,[B] | 1 | A ← [B] |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | — | — | XA,[X+] | 3 | A ↔ [X], X ← X+1 |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | — | — | XA,[X−] | 3 | A ↔ [X], X ← X−1 |
| 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | — | — | XA,[X] | 3 | A ↔ [X] |
| 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | — | — | LD A,[X+] | 3 | A ← [X], X ← X+1 |
| 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | — | — | LD A,[X−] | 3 | A ← [X], X ← X−1 |
| 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | — | — | LD A,[X] | 3 | A ← [X] |
| 1 | 0 | 1 | — | 1 | 1 | 1 | — | — | (予約済み) | |||
| 1 | 1 | 0 | 0 | 登録する | — | — | DRSZレジスタ | 3 | レジスタ←レジスタ− 1、結果がゼロの場合はスキップ | |||
| 1 | 1 | 0 | 1 | 登録する | け | — | LDレジスタ、# imm8 | 3 | レジスタ← k (=LD 0xf0+レジスタ、# k、1バイト短い) | |||
| 1 | 1 | 1 | オフセット | — | — | JP −表示5 | 3 | PC ← PC − 32 + offset ; 1~32バイト後方にジャンプ | ||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | b2 | b3 | ニモニック | サイクル | 説明 |
注目すべき用途
参考文献
- ^ a b c d「COP8SBR9/COP8SCR9/COP8SDR98ビットCMOSフラッシュベースマイクロコントローラ(32kメモリ、仮想EEPROM、ブラウンアウト機能搭載)」(PDF) (データシート)。ナショナル セミコンダクター。2002年4月。 2021年1月6日閲覧。
- ^ a b COP8 基本ファミリ ユーザーズマニュアル(PDF) . リビジョン 002. National Semiconductor . 1996年6月. 文献番号 620895-002 . 2021年1月2日閲覧。
- ^ a b Aleaf, Abdul (1996年7月). 「COP878xと拡張COP8SAx7ファミリの比較 - ハードウェア/ソフトウェアの考慮事項」(PDF) .ナショナルセミコンダクター. アプリケーションノート1043.
- ^ COP8機能ファミリユーザーズマニュアル。リビジョン005。ナショナルセミコンダクター。1999年3月。資料番号620897-005。圧縮されたISO イメージ530094-003_COP8_Tools_Docs_Aug1999.zip から抽出され、2020 年 1 月 7 日に取得されました。
- ^ 「COP8SAx 設計者ガイド」(PDF) .ナショナルセミコンダクター. 1997年1月 . 文献番号 620894-001.
- ^ Liberatore, David (2006年5月11日). FMU-139C/B電子爆弾信管設計の最新情報(PDF) . 第50回NDIA信管会議. 2024年11月7日閲覧。
- ^ Dennis, Marc; Hanrahan, Bob; Brackmann, Chris (1991年11月).アプリケーションノート761 - Electronic Fuzing (PDF) . Texas Instruments . 2024年11月7日閲覧。
外部リンク
- ナショナル セミコンダクター 組み込みマイクロコントローラ( CR16および COP8)
- マイクロコントローラに関するFAQ/COP8、1995年
- 「ナショナル・セミコンダクターCOP8」。EDN第25回マイクロプロセッサ/マイクロコントローラ・ディレクトリ。EDN 。 1998年9月24日。