【講習会のページに戻る】

第2回ASICデザインコンテスト規定課題
「8ビットマイクロプロセッサKUE-CHIP2」

1. 内部レジスタ構造とメモリ空間
2. 命令セット
3. 外部端子
4. ベンチマークプログラム

情報工学教育用に開発された8ビットマイクロプロセッサKUE-CHIP2の命令 セットアーキテクチャを実現することを課題とする.但し,外部インタフェー スは与えられたものを変更してはならない.また,KUE-CHIP2のSFL記述でのモ ジュール名はKUE_CHIP2とする.

1. 内部レジスタ構造とメモリ空間

1.1. 内部レジスタ構造

(1)アキュムレータACC:
演算に使用する8ビットのレジスタ.演算のオペランドや演算結果を保持 する.
(2)インデックスレジスタIX:
演算に使用する8ビットのレジスタ.演算のオペランドや演算結果を保持 する.また,修飾アドレス指定のときのアドレス修飾にも利用される.
(3)フラグFLAG:
桁上げフラグCF,ネガティブフラグNF,桁あふれフラグVF,零フラグZFの4ビッ トからなるレジスタ.命令の実行結果に従ってセット/リセットされる.
(4)プログラムカウンタPC:
8ビットのレジスタ.次に実行すべき命令のアドレスを保持する.

1.2. メモリ空間

メモリ空間は512バイトでバイト単位に指定される.0バイト目から255バイ ト目はプログラム領域とよばれ,プログラムまたはデータを格納する領域とし て利用する.256バイト目から511バイト目まではデータ領域と呼ばれ,データ を格納する領域としてのみ利用する.

プログラム領域またはデータ領域を指定するアドレスの最上位ビット(第9ビッ ト目)は命令コード内のビットから生成される.このビットで,プログラム領 域またはデータ領域のいずれにアクセスするかが決められる.なお,すべての メモリ空間はKUE-CHIP2の外部にある.

1.3. データ語の構成

KUE-CHIP2のデータ語は最上位ビット(第7ビット)が符号に対応し,2の補数 表示で負の数を表す.

2. 命令セット

2.1. 命令形式

KUE-CHIP2の命令サイズは1バイトまたは2バイトであり,以下の4種類の形式で 構成される.

(1)タイプ1(1バイト形式)
命令コード(5ビット) + ドントケア(3ビット)
(2)タイプ2(2バイト形式)
命令コード(4ビット) + 条件コード(4ビット) + 分岐アドレス(8ビット)
(3)タイプ3(1バイト形式)
命令コード(4ビット) + 第1オペランド(1ビット) + 巡回モード(1ビット) + シフト・モード(2ビット)
(4)タイプ4(1バイトまたは2バイト形式)
命令コード(4ビット) + 第1オペランド(1ビット) + 第2オペランドのアド レスモード(3ビット) { + 第2オペランド(8ビット) }
(注)第2オペランドのアドレスモードの指定により1バイトまたは2バイトとなる.

2.2. アドレス・モード

KUE-CHIP2のアドレスモードの一覧を以下に示す.

        ACC     :アキュムレータ
        IX      :インデックスレジスタ
        d       :即値アドレス
        [d]     :絶対アドレス(プログラム領域)
        (d)     :絶対アドレス(データ領域)
        [IX+d]  :インデックス修飾アドレス(プログラム領域を指定)
        (IX+d)  :インデックス修飾アドレス(データ領域を指定)

アキュムレータACCとインデックスレジスタIXの2つのレジスタ指定と,メモリ アクセス時のアドレス指定ができる.メモリアクセス時のアドレス指定には5 つのモードがあり,即値アドレス,絶対アドレス(プログラム領域指定とデー タ領域指定),インデックスレジスタによる修飾アドレス(プログラム領域指定 とデータ領域指定)がある.

即値アドレスでは第2オペランドの内容がそのままデータとなる.絶対アドレ スでは第2オペランドの内容がデータの格納されているアドレスを示す.イン デックス修飾アドレスでは第2オペランドの内容とインデックスレジスタIXの 内容を加算して決まる値が第2オペランドのアドレスとなる.インデックス修 飾アドレスでのオーバフローは無視される.

2.3. 命令セット

命令語は1バイトあるいは2バイトで構成され,命令はプログラム領域にアドレ スの若番から老番に格納される.すなはち,命令の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 vsm)         巡回シフト命令.

[タイプ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)            比較命令.

命令コードと動作の詳細を以下に示す.下記の命令コードに違反した命令に対 する動作の保証は不要である.

        略記号 命令コード               命令の動作
        NOP    0 0 0 0 0 - - -          何もしない 
        HLT    0 0 0 0 1 - - -          停止
               0 1 0 1 - - - -          未使用(HLT) 
        OUT    0 0 0 1 0 - - -          (ACC)->OBUF
        IN     0 0 0 1 1 - - -          (IBUF)->ACC 
        RCF    0 0 1 0 0 - - -          0->CF
        SCF    0 0 1 0 1 - - -          1->CF
        Bcc    0 0 1 1    cc            条件が成立すれば,分岐アドレス->PC
        Ssm    0 1 0 0 A 0 sm           (op1)->(shift,rotate)->op1 
        Rsm    0 1 0 0 A 1 sm           はみ出したビット->CF
        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オペランドである.第1,第2オペランドのア ドレスモードを示すA,Bの意味を以下に示す.

        A=0     ACC
        A=1     IX 
      
        B=000   ACC
        B=001   IX
        B=01-   d
        B=100   [d]
        B=101   (d)
        B=110   [IX+d]
        B=111   (IX+d)

シフトモードsmの意味を以下に示す.

        RA   0  0   Right Arithmetically
        LA   0  1   Left Arithmetically
        RL   1  0   Right Logically
        LL   1  1   Left Logically

条件コードccの意味を以下に示す.

        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 or 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 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        ドントケア
            実行後          :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が設定される. 
                - : 変化しない.

3. 外部端子

KUE-CHIP2は以下の外部入出力端子を持つ.

・VDD
電源の+5.0Vを接続する.
・VSS
電源のグラウンド(0V)を接続する.
・m_clock
マスタークロック
・p_reset
チップ内のすべての記憶素子を非同期的にリセット(論理値0に)する.

上記4つの外部端子については,PARTHENONで自動生成される端子であり, SFLでは記述しない.

・DBi(0:7) (Data Bus for input)
IBUFまたはメモリからのデータ(命令を含む)が入力される.
・DBo(0:7) (Data Bus for output)
OBUFまたはメモリへ書き込むデータが出力される.
・AB(0:8) (Address Bus)
アクセスすべきメモリのアドレスを出力する.
・MEM_WE (MEMory Write Enable)
メモリへ書き込む契機を出力する.このとき,ABにはアドレスが,DBoには書き込むべきデータが出力される.
・MEM_RE (MEMory Read Enable)
メモリから読み込む契機を出力する.このとき,ABにはアドレスが出力され,DBiの値が入力される.
・IBUF_FLG_IN (IBUF FLaG IN)
IBUFのフラグIBUF_FLAGの値が入力され,分岐命令で参照される.IBUF_FLAGはIBUFにデータが存在することを示している.
・IBUF_RE (IBUF Read Enable)
IN命令によりアサートされる.この契機によりIBUFの内容がDBiへ出力されるものとする.
・IBUF_FLG_CLR (IBUF FLaG CLeaR)
IN命令によりIBUF_REに遅れてアサートされる.この契機によりIBUFのフラグIBUF_FLAGがリセットされるものとする.なお,IBUF_FLAGのセットはIBUFへデータが用意された時に行われるものとする.
・OBUF_FLG_IN (OBUF FLaG IN)
OBUFのフラグOBUF_FLAGの値が入力され,分岐命令で参照される.OBUF_FLAGはOBUFにデータが存在することを示している.
・OBUF_WE (OBUF Write Enable)
OUT命令によりアサートされる.この契機によりDBoの内容がOBUFに書き込まれるものとする.またこの契機によりOBUFのフラグOBUF_FLAGがセットされるものとする.なお,OBUF_FLAGのリセットはOBUFのデータが使われた時に行われるものとする.

4. ベンチマークプログラム

性能の客観的な評価を行う基準として,4.1および4.2に示す2つのベンチマー クプログラムの実行時間(マシンサイクル数)をシュミレータで測定して,設計 データに添付することが望ましい.ただし,実行時間のみが設計の良さを判定 する基準ではない.

4.1. 課題1. バブルソートによる整列

256個の逆順に並んだデータ 127(7FH),126(7EH),...,0(00H),-1(FFH),-2(FEH),...,-128(80H)を下記のプロ グラムでソートする.

[プログラムの説明]

バブルソートによって,データ領域のDATA(00H番地)から始まる,N(80H番地) バイトのデータを昇順に整列する.ここで,データは,2個から256個の範囲と する.ただし,データが256個の場合はNを0とする.なお,ベンチマークプロ グラムでは,ソートの完了判定にキャリーフラグを利用している.

[プログラムの入出力例]

        入力:
         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

4.2. 課題2. CRCコードの計算

課題1の入力データならびに出力データ(ともに256バイト)に対してCRC(Cyclic Redundancy Check)コードを下記のプログラムによって生成する.

[プログラムの説明]

シフト/ローテート命令や論理演算命令を使用して,データ領域のDATA(00H 番地)から始まるN(80H番地)バイトのデータのCRCコードを計算する.データの 最大長は256バイトである.ただし,データ長が256バイトの場合は,バイト数 Nを0とする.尚,CRCコードの生成多項式として,CCITT X.25規格の $X^{16}+X^{12}+X^5+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