SFL演習問題/第8回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[SFL演習問題]]
*アキュムレータマシンの設計その2 [#ob6d5d29]
8ビットに拡張したメモリ付きアキュムレータマシンSimple 8bit Accumulator Processor (SAP8)を設計する。
----
#contents
**ダウンロード [#h5d756d0]
&ref(ex08.tar.gz);
**目的 [#j79703df]
-メモリを用いたアキュムレータマシンの設計。
**仕様 [#u367ba72]
-8ビットのALUおよび、インクリメンタは用意されている。
-プログラムカウンタの値をアドレスとして命令メモリから8ビットの命令コードを受け取る。
--プログラムカウンタは1命令につき1つずつ加算していく。
--inst<7:4>はオペランドとしてAND, OR, ADD, SUB, HLT, LD, ST命令をサポートする。各命令の対応表は次の通り。
|AND|0x0|論理積|
|OR|0x1|論理和|
|ADD|0x2|加算|
|SUB|0x3|減算|
|HLT|0x5|命令実行終了|
|LD|0x8|メモリロード|
|ST|0x9|メモリストア|
--inst<3:0>は4ビットの即値データとして扱う。
-内部に8ビットレジスタ(アキュムレータ)を持ち、演算結果を累積させる。
-ALUの入力の一方は常にアキュムレータを入力させ、もう一方には8ビットに拡張した即値データ(4#0b0 || inst<3:0>)を入力させる。
-命令フェッチステージ、命令実行ステージを作成し、順次実行する。
-ファイル名はsapcore.sflとする。
/******************************************
Simple 8bit Accumulator Processor (SAP8)
******************************************/
/* 命令OPコード */
%d AND 0x0
%d OR 0x1
%d ADD 0x2
%d SUB 0x3
%d HLT 0x5
%d LD 0x8
%d ST 0x9
/* 8ビットALUの宣言 */
declare alu8 {
input ina<8>;
input inb<8>;
input alu_sel<2>;
output alu_out<8>;
instrin do;
instr_arg do(ina, inb, alu_sel);
}
/* 8ビットインクリメンタの宣言 */
declare inc8 {
input in<8>;
output out<8>;
instrin do;
instr_arg do(in);
}
/* SAPメインモジュールの記述 */
module sapcore {
/* 入出力の宣言 */
input inst<8>; /* 命令データ */
input datai<8>; /* データメモリ読み出し用データ */
output datao<8>; /* データメモリ書き込み用データ */
output iadrs<8>; /* 命令メモリ読み出し用アドレス */
output adrs<8>; /* データメモリ読み出し用アドレス */
instrin start; /* 開始命令 */
instrout inst_read; /* 命令メモリ読み込み命令 */
instrout memory_read; /* データメモリ読み出し命令 */
instrout memory_write; /* データメモリ書き込み命令 */
/* レジスタ宣言 */
reg_wr acc<8>; /* 演算データを保持するアキュムレータ */
reg pc<8>; /* プログラムカウンタ */
/* サブモジュール宣言 */
alu8 alu; /* 演算用8ビットALU */
inc8 inc; /* PCインクリメンタ用8ビットALU */
/* 制御端子の仮引数 */
instr_arg memory_write(adrs, datao);
instr_arg memory_read(adrs);
instr_arg inst_read(iadrs);
/* ステージ定義 */
stage_name inst_fetch { /*** 内容を記述 ***/ }
stage_name exec { /*** 内容を記述 ***/ }
/* 開始条件 */
/*** 内容を記述 ***/
/* 命令フェッチステージ */
stage inst_fetch {
par {
/* 命令フェッチ */
/*** 内容を記述 ***/
/* 次のステージの呼び出し */
/*** 内容を記述 ***/
}
}
/* 命令実行ステージ */
stage exec {
par {
/* 命令デコードと命令実行 */
/*** 内容を記述 ***/
/* メモリ操作 */
/*** 内容を記述 ***/
/* 次のステージの呼び出し */
/*** 内容を記述 ***/
}
}
}
/* 8ビットインクリメンタの記述 */
circuit inc8 {
input in<8>;
output out<8>;
instrin do;
instruct do out = in + 0x01;
}
**手順 [#pd2be3f3]
+CPUの動きを理解して、足りないSFL記述を完成させてください。
**シミュレーション [#g491caf8]
-次のファイルを同じディレクトリに置いたことを確認し、
--Makefile
--alu8.sfl
--sap.sfl
--sapcore.sfl
--inst_data
--asm2sec2/ (inst_dataを読み込んでsap.simを出力する簡易コンパイラ)
---Makefile
---asm2sec2.c
% make sim
-回路が正しければ以下のような出力を得ます。
1 : PC(uu) inst= acc=00000000 if:0 ex:0
2 : PC(uu) inst= acc=00000000 if:0 ex:0
3 : PC(00) inst=00100001 acc=00000000 if:1 ex:0
4 : PC(00) inst= acc=00000000 if:0 ex:1
5 : PC(01) inst=00100100 acc=00000001 if:1 ex:0
6 : PC(01) inst= acc=00000001 if:0 ex:1
7 : PC(02) inst=00110011 acc=00000101 if:1 ex:0
8 : PC(02) inst= acc=00000101 if:0 ex:1
9 : PC(03) inst=10011010 acc=00000010 if:1 ex:0
10 : PC(03) inst= acc=00000010 if:0 ex:1
11 : PC(04) inst=00000000 acc=00000010 if:1 ex:0
12 : PC(04) inst= acc=00000010 if:0 ex:1
13 : PC(05) inst=10010011 acc=00000000 if:1 ex:0
14 : PC(05) inst= acc=00000000 if:0 ex:1
15 : PC(06) inst=00000000 acc=00000000 if:1 ex:0
16 : PC(06) inst= acc=00000000 if:0 ex:1
17 : PC(07) inst=00100100 acc=00000000 if:1 ex:0
18 : PC(07) inst= acc=00000000 if:0 ex:1
19 : PC(08) inst=10001010 acc=00000100 if:1 ex:0
20 : PC(08) inst= acc=00000100 if:0 ex:1
21 : PC(09) inst=01010000 acc=00000010 if:1 ex:0
22 : PC(09) inst= acc=00000010 if:0 ex:1
23 : PC(09) inst= acc=00000010 if:0 ex:0
24 : PC(09) inst= acc=00000010 if:0 ex:0
memory:
0 1 2 3 4 5 6 7 8 9 a b c d e f
0: uu uu uu 00 uu uu uu uu uu uu 02 uu uu uu uu uu
10: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
20: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
30: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
40: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
50: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
60: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
70: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
80: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
90: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
a0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
b0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
c0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
d0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
e0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
f0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
**発展問題 [#eb43f5d7]
-inst_dataを自由に改変してシミュレーションしてみましょう。
--命令はAND, OR, ADD, SUB, HLT, LD, STに対応しています。
--即値命令は10進数表現で0〜15までを指定可能。
-記述例:
add 1
add 4
sub 3
st 10
and 0
st 3
and 0
add 4
ld 10
hlt 3
-さらに設計をしてみたい人は[[SFL演習問題/第9回]]を参照してください。
**設計例 [#tf0ffd3e]
&ref(ex08_answer.tar.gz);
終了行:
[[SFL演習問題]]
*アキュムレータマシンの設計その2 [#ob6d5d29]
8ビットに拡張したメモリ付きアキュムレータマシンSimple 8bit Accumulator Processor (SAP8)を設計する。
----
#contents
**ダウンロード [#h5d756d0]
&ref(ex08.tar.gz);
**目的 [#j79703df]
-メモリを用いたアキュムレータマシンの設計。
**仕様 [#u367ba72]
-8ビットのALUおよび、インクリメンタは用意されている。
-プログラムカウンタの値をアドレスとして命令メモリから8ビットの命令コードを受け取る。
--プログラムカウンタは1命令につき1つずつ加算していく。
--inst<7:4>はオペランドとしてAND, OR, ADD, SUB, HLT, LD, ST命令をサポートする。各命令の対応表は次の通り。
|AND|0x0|論理積|
|OR|0x1|論理和|
|ADD|0x2|加算|
|SUB|0x3|減算|
|HLT|0x5|命令実行終了|
|LD|0x8|メモリロード|
|ST|0x9|メモリストア|
--inst<3:0>は4ビットの即値データとして扱う。
-内部に8ビットレジスタ(アキュムレータ)を持ち、演算結果を累積させる。
-ALUの入力の一方は常にアキュムレータを入力させ、もう一方には8ビットに拡張した即値データ(4#0b0 || inst<3:0>)を入力させる。
-命令フェッチステージ、命令実行ステージを作成し、順次実行する。
-ファイル名はsapcore.sflとする。
/******************************************
Simple 8bit Accumulator Processor (SAP8)
******************************************/
/* 命令OPコード */
%d AND 0x0
%d OR 0x1
%d ADD 0x2
%d SUB 0x3
%d HLT 0x5
%d LD 0x8
%d ST 0x9
/* 8ビットALUの宣言 */
declare alu8 {
input ina<8>;
input inb<8>;
input alu_sel<2>;
output alu_out<8>;
instrin do;
instr_arg do(ina, inb, alu_sel);
}
/* 8ビットインクリメンタの宣言 */
declare inc8 {
input in<8>;
output out<8>;
instrin do;
instr_arg do(in);
}
/* SAPメインモジュールの記述 */
module sapcore {
/* 入出力の宣言 */
input inst<8>; /* 命令データ */
input datai<8>; /* データメモリ読み出し用データ */
output datao<8>; /* データメモリ書き込み用データ */
output iadrs<8>; /* 命令メモリ読み出し用アドレス */
output adrs<8>; /* データメモリ読み出し用アドレス */
instrin start; /* 開始命令 */
instrout inst_read; /* 命令メモリ読み込み命令 */
instrout memory_read; /* データメモリ読み出し命令 */
instrout memory_write; /* データメモリ書き込み命令 */
/* レジスタ宣言 */
reg_wr acc<8>; /* 演算データを保持するアキュムレータ */
reg pc<8>; /* プログラムカウンタ */
/* サブモジュール宣言 */
alu8 alu; /* 演算用8ビットALU */
inc8 inc; /* PCインクリメンタ用8ビットALU */
/* 制御端子の仮引数 */
instr_arg memory_write(adrs, datao);
instr_arg memory_read(adrs);
instr_arg inst_read(iadrs);
/* ステージ定義 */
stage_name inst_fetch { /*** 内容を記述 ***/ }
stage_name exec { /*** 内容を記述 ***/ }
/* 開始条件 */
/*** 内容を記述 ***/
/* 命令フェッチステージ */
stage inst_fetch {
par {
/* 命令フェッチ */
/*** 内容を記述 ***/
/* 次のステージの呼び出し */
/*** 内容を記述 ***/
}
}
/* 命令実行ステージ */
stage exec {
par {
/* 命令デコードと命令実行 */
/*** 内容を記述 ***/
/* メモリ操作 */
/*** 内容を記述 ***/
/* 次のステージの呼び出し */
/*** 内容を記述 ***/
}
}
}
/* 8ビットインクリメンタの記述 */
circuit inc8 {
input in<8>;
output out<8>;
instrin do;
instruct do out = in + 0x01;
}
**手順 [#pd2be3f3]
+CPUの動きを理解して、足りないSFL記述を完成させてください。
**シミュレーション [#g491caf8]
-次のファイルを同じディレクトリに置いたことを確認し、
--Makefile
--alu8.sfl
--sap.sfl
--sapcore.sfl
--inst_data
--asm2sec2/ (inst_dataを読み込んでsap.simを出力する簡易コンパイラ)
---Makefile
---asm2sec2.c
% make sim
-回路が正しければ以下のような出力を得ます。
1 : PC(uu) inst= acc=00000000 if:0 ex:0
2 : PC(uu) inst= acc=00000000 if:0 ex:0
3 : PC(00) inst=00100001 acc=00000000 if:1 ex:0
4 : PC(00) inst= acc=00000000 if:0 ex:1
5 : PC(01) inst=00100100 acc=00000001 if:1 ex:0
6 : PC(01) inst= acc=00000001 if:0 ex:1
7 : PC(02) inst=00110011 acc=00000101 if:1 ex:0
8 : PC(02) inst= acc=00000101 if:0 ex:1
9 : PC(03) inst=10011010 acc=00000010 if:1 ex:0
10 : PC(03) inst= acc=00000010 if:0 ex:1
11 : PC(04) inst=00000000 acc=00000010 if:1 ex:0
12 : PC(04) inst= acc=00000010 if:0 ex:1
13 : PC(05) inst=10010011 acc=00000000 if:1 ex:0
14 : PC(05) inst= acc=00000000 if:0 ex:1
15 : PC(06) inst=00000000 acc=00000000 if:1 ex:0
16 : PC(06) inst= acc=00000000 if:0 ex:1
17 : PC(07) inst=00100100 acc=00000000 if:1 ex:0
18 : PC(07) inst= acc=00000000 if:0 ex:1
19 : PC(08) inst=10001010 acc=00000100 if:1 ex:0
20 : PC(08) inst= acc=00000100 if:0 ex:1
21 : PC(09) inst=01010000 acc=00000010 if:1 ex:0
22 : PC(09) inst= acc=00000010 if:0 ex:1
23 : PC(09) inst= acc=00000010 if:0 ex:0
24 : PC(09) inst= acc=00000010 if:0 ex:0
memory:
0 1 2 3 4 5 6 7 8 9 a b c d e f
0: uu uu uu 00 uu uu uu uu uu uu 02 uu uu uu uu uu
10: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
20: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
30: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
40: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
50: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
60: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
70: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
80: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
90: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
a0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
b0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
c0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
d0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
e0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
f0: uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu uu
**発展問題 [#eb43f5d7]
-inst_dataを自由に改変してシミュレーションしてみましょう。
--命令はAND, OR, ADD, SUB, HLT, LD, STに対応しています。
--即値命令は10進数表現で0〜15までを指定可能。
-記述例:
add 1
add 4
sub 3
st 10
and 0
st 3
and 0
add 4
ld 10
hlt 3
-さらに設計をしてみたい人は[[SFL演習問題/第9回]]を参照してください。
**設計例 [#tf0ffd3e]
&ref(ex08_answer.tar.gz);
ページ名: