以上のレジスタは簡単のためSFLではすべてreg_wr(パワーオンリセットで
クリアされるレジスタの宣言)で宣言すること.
1.2 メモリ空間
メモリ空間は512バイトでバイト単位に指定される.0バイト目から255バイト 目はプログラム領域とよばれ,プログラムまたはデータを格納する領域として 利用する.256バイト目から511バイト目まではデータ領域と呼ばれ,データを 格納する領域としてのみ利用する.
プログラム領域またはデータ領域を指定するアドレスの最上位ビット(第8ビッ
ト)は命令コード内のビットから生成される.このビットで,プログラム領
域またはデータ領域のいずれにアクセスするかが決められる.なお,すべての
メモリ空間はKUE-CHIP2の外部にある.
1.3 データ語の構成
KUE-CHIP2のデータ語は最上位ビット(第7ビット)が符号に対応し,2の補数表 示で負の数を表す.
KUE-CHIP2の命令サイズは1バイトまたは2バイトであり,以下の4種類の形式で 構成される.
NOP,HLT,OUT,IN,RCF,SCF
)
Bcc
)
Ssm,Rsm
)
KUE-CHIP2の第2オペランドのアドレスモードを以下に示す.
レジスタ指定(第1オペランド及び第2オペランド)ACC
:アキュムレータIX
:インデックスレジスタ アドレス指定(第2オペランド)d
:即値アドレス[d]
:絶対アドレス(プログラム領域を指定)(d)
:絶対アドレス(データ領域を指定)[IX+d]
:インデックス修飾アドレス(プログラム領域を指定)(IX+d)
:インデックス修飾アドレス(データ領域を指定)
アキュムレータACCとインデックスレジスタIXの2つのレジスタ指定と,メモリ アクセス時のアドレス指定ができる.メモリアクセス時のアドレス指定には5 つのモードがあり,即値アドレス,絶対アドレス(プログラム領域指定とデー タ領域指定),インデックスレジスタによる修飾アドレス(プログラム領域指定 とデータ領域指定)がある.
即値アドレスではオペランドの内容がそのままデータとなる.絶対アドレ
スではオペランドの内容がデータの格納されているアドレスを示す.イン
デックス修飾アドレスではオペランドの内容とインデックスレジスタIXの
内容を加算して決まる値がオペランドのアドレスとなる.インデックス修
飾アドレスを計算する際のオーバフローは無視される.
2.3 命令セット
命令語は1バイトあるいは2バイトで構成され,命令はプログラム領域の0バイ ト目から格納される.命令の2バイト目は1バイト目の次のアドレスに置かれ, 分岐命令が成功する場合を除いて次のアドレスの命令が次に実行される.
命令は19種で,入出力命令2,シフト命令2,算術論理演算命令8,フラグセッ ト命令2,ロード命令,ストア命令,ブランチ命令,NOP命令,停止命令からな る.
各命令の簡単な動作は以下のとおりである.
[タイプ1] NOP (No OPeration) 何もしない. HLT (HaLT) 停止命令. OUT (OUTput) 出力命令.ACCの内容をOBUFへ移す. IN (INput) 入力命令.IBUFの内容をACCへ移す. RCF (Reset CF) 桁上げフラグCFをリセットする. SCF (Set CF) 桁上げフラグCFをセットする. [タイプ2] Bcc (Branch cc) 分岐命令.分岐条件ccは分岐する条件を指定. [タイプ3] Ssm (Shift sm) シフト命令.smはシフトモードを指定. Rsm (Rotate sm) 巡回シフト命令.smはシフトモードを指定. [タイプ4] LD (LoaD) ロード命令.メモリの内容をレジスタへ移す. ST (STore) ストア命令.レジスタの内容をメモリへ移す. SBC (SuBtract with Carry) 減算命令.桁上げフラグCFを考慮する. ADC (ADd with Carry) 加算命令.桁上げフラグCFを考慮する. SUB (SUBtract) 減算命令.桁上げフラグCFを考慮しない. ADD (ADD) 加算命令.桁上げフラグCFを考慮しない. EOR (Exclusive OR) ビット毎の排他的論理和演算命令. OR (OR) ビット毎の論理和演算命令. AND (AND) ビット毎の論理積演算命令. CMP (CoMPare) 比較命令.
命令コードと動作の詳細を以下に示す.下記の命令コードに違反した命令に対
する設計は不要である.以下の説明で{ACC}などはACCの内容を表す
命令形式 略記号 命令コード 命令の動作 タイプ1 NOP 0 0 0 0 0 - - - 何もしない HLT 0 0 0 0 1 - - - 停止 OUT 0 0 0 1 0 - - - {ACC}->DBo,1->OBUF_WE IN 0 0 0 1 1 - - - {DBi}->ACC,1->IBUF_RE RCF 0 0 1 0 0 - - - 0->CF SCF 0 0 1 0 1 - - - 1->CF タイプ2 Bcc 0 0 1 1 cc 条件が成立すれば,分岐アドレス->PC タイプ3 Ssm 0 1 0 0 A 0 sm {op1}->(shift)->op1,はみ出したビット->CF Rsm 0 1 0 0 A 1 sm {op1}->(rotate)->op1,はみ出したビット->CF タイプ4 LD 0 1 1 0 A B {op2}->op1 ST 0 1 1 1 A B {op1}->op2 (注)ST命令の場合,B=100,101,110,111のみ可能. SBC 1 0 0 0 A B {op1}-{op2}-{CF}->op1 ADC 1 0 0 1 A B {op1}+{op2}+{CF}->op1 SUB 1 0 1 0 A B {op1}-{op2}->op1 ADD 1 0 1 1 A B {op1}+{op2}->op1 EOR 1 1 0 0 A B {op1}eor{op2}->op1 OR 1 1 0 1 A B {op1}and{op2}->op1 AND 1 1 1 0 A B {op1}or{op2}->op1 CMP 1 1 1 1 A B {op1}-{op2}
ここで,op1,op2は各々第1,第2オペランドである.またA,Bは各々第1オペ ランドと第2オペランドのアドレスモードを指定している.第1オペランドは
A=0 ACC A=1 IX
で指定される場所であり,第2オペランドは以下のアドレスモードにより指定
される場所である
B=000 ACC B=001 IX B=01- d B=100 [d] B=101 (d) B=110 [IX+d] B=111 (IX+d)
RA 0 0 Right Arithmetically LA 0 1 Left Arithmetically RL 1 0 Right Logically LL 1 1 Left Logically
A 0 0 0 0 Always VF 1 0 0 0 on oVerFlow VF=1 NZ 0 0 0 1 on Not Zero ZF=0 Z 1 0 0 1 on Zero ZF=1 ZP 0 0 1 0 on Zero or Positive NF=0 N 1 0 1 0 on Negative NF=1 P 0 0 1 1 on Positive (NF and ZF)=0 ZN 1 0 1 1 on Zero or Negative (NF or ZF)=1 NI 0 1 0 0 on No Input IBUF_FLG_IN=0 NO 1 1 0 0 on No Output OBUF_FLG_IN=1 NC 0 1 0 1 on Not Carry CF=0 C 1 1 0 1 on Carry CF=1 GE 0 1 1 0 on Greater than or Equal (VF eor NF)=0 LT 1 1 1 0 on Less Than (VF eor NF)=1 GT 0 1 1 1 on Greater Than ((VF eor NF) or ZF)=0 LE 1 1 1 1 on Less than or Equal ((VF eor NF) or ZF)=1
シフト命令Ssmと巡回シフト命令Rsmの動作を以下に示す.SLAとSLLでは,実行後の各フラグの状態のみが異なる.
SRA命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア 実行後 :d7 d7 d6 d5 d4 d3 d2 d1 d0 SLA命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア 実行後 :d6 d5 d4 d3 d2 d1 d0 0 d7 SRL命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア 実行後 : 0 d7 d6 d5 d4 d3 d2 d1 d0 SLL命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア 実行後 :d6 d5 d4 d3 d2 d1 d0 0 d7 RRA命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 cf 実行後 :cf d7 d6 d5 d4 d3 d2 d1 d0 RLA命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 cf 実行後 :d6 d5 d4 d3 d2 d1 d0 cf d7 RRL命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア 実行後 :d0 d7 d6 d5 d4 d3 d2 d1 d0 RLL命令 レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ 実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア 実行後 :d6 d5 d4 d3 d2 d1 d0 d7 d7
次に,各命令の実行に影響するフラグ及び命令実行後のフラグの設定条件(実 行後の状態)を以下に示す.
命令 実行への影響 実行後の状態 CF VF NF ZF CF VF NF ZF NOP No OPeration - - - - - - - - HLT HaLT - - - - - - - - OUT OUTput - - - - - - - - IN INput - - - - - - - - RCF Reset Carry Flug - - - - 0 - - - SCF Set Carry Flug - - - - 1 - - - SRA Shift Right Arithmetically - - - - b0 0 N Z SLA Shift Left Arithmetically - - - - b7 V N Z SRL Shift Right Logically - - - - b0 0 N Z SLL Shift Left Logically - - - - b7 0 N Z RRA Rotate Right Arithmetically o - - - b0 0 N Z RLA Rotate Left Arithmetically o - - - b7 V N Z RRL Rotate Right Logically - - - - b0 0 N Z RLL Rotate Left Logically - - - - b7 0 N Z LD LoaD - - - - - - - - ST STore - - - - - - - - SBC SuBtract with Carry o - - - C V N Z ADC ADd with Carry o - - - C V N Z SUB SUBtract - - - - - V N Z ADD ADD - - - - - V N Z EOR Exclusive OR - - - - - 0 N Z OR OR - - - - - 0 N Z AND AND - - - - - 0 N Z CMP CoMPare - - - - - V N Z BA Branch Always - - - - - - - - BVF Branch on oVerFlow - o - - - - - - BNZ Branch on Not Zero - - - o - - - - BZ Branch on Zero - - - o - - - - BZP Branch on Zero or Positive - - o - - - - - BN Branch on Negative - - o - - - - - BP Branch on Positive - - o o - - - - BZN Branch on Zero or Negative - - o o - - - - BNI Branch on No Input - - - - - - - - BNO Branch on No Output - - - - - - - - BNC Branch on No Carry o - - - - - - - BC Branch on Carry o - - - - - - - BGE Branch on Greater than or Equal - o o - - - - - BLT Branch on Less Than - o o - - - - - BGT Branch on Greater Than - o o o - - - - BLE Branch on Less Than or Equal - o o o - - - -
ここで記号の意味は以下の通りである.
実行への影響
o : 影響する. - : 影響しない.
実行後の状態
C : 桁上げまたは桁落ちが発生した場合に1が設定される. V : オーバフローが発生した場合に1が設定される. N : 演算結果の第7ビットの値が設定される. Z : 演算結果が0の場合に1が設定される b7: 第1オペランドの第7ビットの値が設定される. b0: 第1オペランドの第0ビットの値が設定される. 0 : 0が設定される. 1 : 1が設定される. - : 変化しない.
KUE-CHIP2は以下の外部入出力端子を持つ.これらの与えられた外部インターフェースは変更してはならない.
上記4つの外部端子については,PARTHENONで自動生成される端子であり, SFLでは記述しない.
MEM_REとMEM_WE,IBUF_REとMEM_RE,OBUF_WEとMEM_WEは各々同時にアク ティブとなってはならない.
与えられた外部インターフェースのSFL記述を以下に示す.なお,KUE-CHIP2の SFL記述でのモジュール名はKUE_CHIP2とする.
declare KUE_CHIP2 { input DBi<8> ; output DBo<8> ; output AB<9> ; instrout MEM_WE; instrout MEM_RE; instrin IBUF_FLG_IN; instrout IBUF_RE; instrin OBUF_FLG_IN; instrout OBUF_WE; instrin start; }
性能の客観的な評価を行う基準として,4.1および4.2に示す2つのベンチマー クプログラムの実行時間(マシンサイクル数)をシュミレータで測定して,設計 データに添付することが望ましい.ただし,実行時間のみが設計の良さを判定 する基準ではない.
256個の逆順に並んだデータ
127(7FH),126(7EH),...,0(00H),-1(FFH),-2(FEH),...,-128(80H)
を下記のプログラムでソートする.
[プログラムの説明]
バブルソートによって,データ領域のDATA(00H番地)から始まる,N(80H番地)
バイトのデータを昇順に整列する.ここで,データは,2個から256個の範囲と
する.ただし,データが256個の場合はNを0とする.なお,ベンチマークプロ
グラムでは,ソートの完了判定に桁上げフラグcfを利用している.
[プログラムの入出力例]
入力: 80 : 08 (ソートするデータの長さ) 100 : 10 FF 40 80 C0 D8 7F CD (ソートするデータ) 出力: 100 : 80 C0 CD D8 FF 10 40 7F (ソート結果)
*** KUE-CHIP2 Assembler ver.1.0 by H.Ochi *** * Bubble Sorting * Programmed by Akira Uejima, May. 3, 1992 * Data(singned) on data page 00 : DATA: EQU 00H * Data Length(byte) on program page 80 : N: EQU 80H * Work Area(loop counter) on program page 90 : WORK1: EQU 90H * Work Area(swap area) on program page 91 : WORK2: EQU 91H 00 : 6C 80 LD IX, [N] 02 : AA 01 SUB IX, 1 04 : 7C 90 ST IX, [WORK1] 06 : C9 LP1: EOR IX, IX 07 : 20 RCF 08 : 67 00 LP2: LD ACC, (IX+DATA) 0A : F7 01 CMP ACC, (IX+DATA+1) 0C : 3F 19 BLE SKIP 0E : 74 91 ST ACC, [WORK2] 10 : 67 01 LD ACC, (IX+DATA+1) 12 : 77 00 ST ACC, (IX+DATA) 14 : 64 91 LD ACC, [WORK2] 16 : 77 01 ST ACC, (IX+DATA+1) 18 : 2F SCF 19 : BA 01 SKIP: ADD IX, 1 1B : FC 90 CMP IX, [WORK1] 1D : 31 08 BNZ LP2 1F : 35 29 BNC FIN 21 : 6C 90 LD IX, [WORK1] 23 : AA 01 SUB IX, 1 25 : 7C 90 ST IX, [WORK1] 27 : 31 06 BNZ LP1 29 : 0F FIN: HLT END
課題1の入力データならびに出力データ(ともに256バイト)に対してCRC(Cyclic
Redundancy Check)コードを下記のプログラムによって生成する.
[プログラムの説明]
シフト/ローテート命令や論理演算命令を使用して,データ領域のDATA(00H
番地)から始まるN(80H番地)バイトのデータのCRCコードを計算する.データの
最大長は256バイトである.ただし,データ長が256バイトの場合は,バイト数
Nを0とする.尚,CRCコードの生成多項式として,CCITT X.25規格の
X16+X12+X5+1を用いている.
[プログラムの入出力例]
入力: 80 : 08 (データのバイト数) 100 : 62 FF 75 CO 75 C1 C9 7D (データ) 出力: C0 : B0 8A (CRC)
*** KUE-CHIP2 Assembler ver.1.0 by H.Ochi *** * Calculate CRC(Cyclic Redundancy Check) Code * Programmed by Akira Uejima, May. 3, 1992 * Data on date page 00 : DATA: EQU 00H * Data Length(byte) on program page 80 : N: EQU 80H * Resultant CRC on program page C0 : C1: EQU 0C0H C1 : C2: EQU 0C1H * Work Area on program page F0 : WORK: EQU 0F0H 00 : 62 FF LD ACC, 0FFH 02 : 74 C0 ST ACC, [C1] 04 : 74 C1 ST ACC, [C2] 06 : C9 EOR IX, IX 07 : 7C F0 ST IX, [WORK] 09 : 64 C0 LP1: LD ACC, [C1] 0B : C7 00 EOR ACC, (IX+DATA) 0D : 74 C0 ST ACC, [C1] 0F : 6A 08 LD IX, 8 11 : 64 C1 LP2: LD ACC, [C2] 13 : 43 SLL ACC 14 : 74 C1 ST ACC, [C2] 16 : 64 C0 LD ACC, [C1] 18 : 45 RLA ACC 19 : 74 C0 ST ACC, [C1] 1B : 35 27 BNC SKIP 1D : C4 42 EOR ACC, [P1] 1F : 74 C0 ST ACC, [C1] 21 : 64 C1 LD ACC, [C2] 23 : C4 43 EOR ACC, [P2] 25 : 74 C1 ST ACC, [C2] 27 : AA 01 SKIP: SUB IX, 1 29 : 33 11 BP LP2 2B : 6C F0 LD IX, [WORK] 2D : BA 01 ADD IX, 1 2F : FC 80 CMP IX, [N] 31 : 7C F0 ST IX, [WORK] 33 : 31 09 BNZ LP1 35 : 64 C1 LD ACC, [C2] 37 : C2 FF EOR ACC, 0FFH 39 : 74 C1 ST ACC, [C2] 3B : 64 C0 LD ACC, [C1] 3D : C2 FF EOR ACC, 0FFH 3F : 74 C0 ST ACC, [C1] 41 : 0F HLT * CRC Generator Polynomial on program page * CCITT(X^16 + X^12 + X^5 + 1) -> 1 0001 0000 0010 0001 * 1 0 2 1 42 : 10 P1: PROG 10H 43 : 21 P2: PROG 21H END