tar xvfz ./bin2v.tar.gz |
/*
実験 9 ヒント(1):整数乗算命令 mult, ムーブ・フロム・Lo 命令 mflo についてのコメント追加
`define R 6'b000000 R 形式 (add, addu, sub, subu, and, or, slt, jalr, jr, mult, mflo)
*/
/*
実験 9 ヒント(2):整数乗算命令 mult についてのコメント追加
MULT(op = 000000, func = 011000)
MULT {Hi, Lo} <= REG[rs] * REG[rt]; MULT rs,rt
*/
/*
実験 9 ヒント(3):ムーブ・フロム・Lo 命令 mflo についてのコメント追加
MFLO(op = 000000, func = 010010)
MFLO REG[rd] <= Lo; MFLO rd
*/
|
make |
// 実験 9 のヒント(1):ALU モジュールの実体化に関する記述の変更 // clock, reset 信号の追加、乗算結果を保持するレジスタ hi と lo 用 // alu // +----+ // alu_a[31:0]->| | // alu_b[31:0]->| |->alu_y[31:0] // alu_ctrl[3:0]->| |->alu_comp[1:0] // +----+ alu alua(alu_a, alu_b, alu_ctrl, alu_y, alu_comp); を // 実験 9 のヒント(1):ALU モジュールの実体化に関する記述の変更 // clock, reset 信号の追加、乗算結果を保持するレジスタ hi と lo 用 // alu // +----+ // clock->| | // reset->| | // alu_a[31:0]->| | // alu_b[31:0]->| |->alu_y[31:0] // alu_ctrl[3:0]->| |->alu_comp[1:0] // +----+ alu alua(clock, reset, alu_a, alu_b, alu_ctrl, alu_y, alu_comp); に変更 |
// 実験 9 のヒント(2):コメントの追加(1)
// mult(multiply)
// mflo(move from Lo)
// 実験 9 のヒント(3):コメントの追加(2)
// 1011, mult
// 1100, mflo
// 実験 9 のヒント(4):mult, mflo 用の ALU 制御コードの define
`define ALU_MULT 4'b1011
`define ALU_MFLO 4'b1100
// 実験 9 のヒント(5):ALU モジュールの入力ポートの拡張
// clock, reset 信号の追加、乗算結果を保持するレジスタ hi と lo 用
module alu (alu_a, alu_b, alu_ctrl, alu_y, alu_comp); // 入出力ポート
を
module alu (clock, reset, alu_a, alu_b, alu_ctrl, alu_y, alu_comp); // 入出力ポート
に変更
// 実験 9 のヒント(6):mult 命令実行時に alu_a * alu_b の結果を {hi, lo} に格納する記述の追加
input clock, reset; // 入力 クロック, リセット
reg [31:0] hi; //上位
reg [31:0] lo; //下位
always @(posedge clock or negedge reset) begin
if (reset == 1'b0) begin
hi <= 32'h00000000;
lo <= 32'h00000000;
end else begin
{hi, lo} <= (alu_ctrl == `ALU_MULT) ? alu_a * alu_b : {hi, lo};
end
end
の追加
// 実験 9 のヒント(7):mflo 命令実行時に {hi, lo} の lo を result に出力する記述の追加
`ALU_MFLO: begin
result <= lo;
end
|
// 実験 9 のヒント(9):mult, mflo 命令に関するコメントの追加
/* R 形式
MULT(op = 000000, func = 011000)
MULT {Hi, Lo} <= REG[rs] * REG[rt]; MULT rs,rt
MFLO(op = 000000, func = 010010)
MFLO REG[rd] <= Lo; MFLO rd
*/
|
#define EXTIO_SCAN_ASCII (*(volatile unsigned int *)0x0310)
#define EXTIO_SCAN_REQ (*(volatile unsigned int *)0x030c)
#define EXTIO_SCAN_STROKE (*(volatile unsigned int *)0x0308)
#define SCAN_STRORING (unsigned int)0xffffffff
#define EXTIO_PRINT_STROKE (*(volatile unsigned int *) 0x0300)
#define EXTIO_PRINT_ASCII (*(volatile unsigned int *) 0x0304)
#define TRUE 0x1
#define FALSE 0x0
unsigned int sosuu_check(unsigned int kouho);
unsigned int my_a2i();
void my_i2a();
void my_print();
void my_scan();
main() {
unsigned int k;
unsigned int str1[16];
unsigned int str2[16];
/* "HELLO" を print */
str1[0] = 'H'; str1[1] = 'E';
str1[2] = 'L'; str1[3] = 'L';
str1[4] = 'O'; str1[5] = '\n';
str1[6] = '\0';
my_print(str1);
while (1) {
/* "NUM=" を print */
str1[0] = 'N'; str1[1] = 'U';
str1[2] = 'M'; str1[3] = '=';
str1[4] = '\0';
my_print(str1);
/* キーボードから入力された文字列(数字)を str2[] に記憶 */
my_scan(str2);
/* "ECHO " を print */
str1[0] = 'E'; str1[1] = 'C';
str1[2] = 'H'; str1[3] = 'O';
str1[4] = ' '; str1[5] = '\0';
my_print(str1);
/* str2[] を print */
my_print(str2);
/* '\n' を print */
str1[0] = '\n'; str1[1] = '\0';
my_print(str1);
/* 文字列(数字) srt2[] を unsigned int に変換 */
k = my_a2i(str2);
/* k × k を計算 */
k = k*k;
/* unsigned int k を文字列(数字)に変換して print */
my_i2a(k);
/* '\n' を print */
str1[0] = '\n'; str1[1] = '\0';
my_print(str1);
}
}
/* 文字列(数字) srt[] を unsigned int に変換する関数 */
/* unsigned int result を返す */
unsigned int my_a2i(str)
unsigned int *str;
{
unsigned int *str_tmp;
unsigned int k;
unsigned int result;
str_tmp = str;
for (k = 0; *str_tmp != '\0'; k++) {
str_tmp++;
}
result = 0;
str_tmp = str;
if (k == 1) {
result = *str_tmp - '0';
} else if (k == 2) {
for (k = 0; k < (*str_tmp - '0'); k++) {
result = result + 10;
}
str_tmp++;
result = result + (*str_tmp - '0');
} else if (k == 3) {
for (k = 0; k < (*str_tmp - '0'); k++) {
result = result + 100;
}
str_tmp++;
for (k = 0; k < (*str_tmp - '0'); k++) {
result = result + 10;
}
str_tmp++;
result = result + (*str_tmp - '0');
}
return result;
}
/* unsigned int i を文字列(数字)に変換して print する関数 */
void my_i2a(unsigned int i) {
unsigned int counter;
unsigned int s[4];
for (counter = 0; i >= 10; counter++) {
i -= 10;
}
s[0] = counter + '0';
s[1] = i + '0';
s[2] = ' ';
s[3] = '\0';
my_print(s);
}
/* キーボードから入力された文字列を str[] に記憶する関数 */
void my_scan(str)
unsigned int *str;
{
EXTIO_SCAN_STROKE = (unsigned int)0x00000000;
EXTIO_SCAN_REQ = (unsigned int)0x00000001;
EXTIO_SCAN_STROKE = (unsigned int)0x00000001;
EXTIO_SCAN_STROKE = (unsigned int)0x00000000;
EXTIO_SCAN_STROKE = (unsigned int)0x00000001;
while (EXTIO_SCAN_ASCII == SCAN_STRORING) {
EXTIO_SCAN_STROKE = (unsigned int)0x00000000;
EXTIO_SCAN_STROKE = (unsigned int)0x00000001;
}
while ((*str = EXTIO_SCAN_ASCII) != (unsigned int)0x3e) { // 0x3e=RETURN
if ((*str >= 1) && (*str <= 26)) {
*str = 'A' + *str - 1;
} else if ((*str >= 48) && (*str <= 57)) {
*str = '0' + *str - 48;
} else {
if (*str == 0) {
*str = '@';
} else if (*str == 27) {
*str = '[';
} else if (*str == 29) {
*str = ']';
} else if ((*str >= 32) && (*str <= 47)) {
*str = ' ' + *str - 32;
} else if (*str == 58) {
*str = '?';
} else if (*str == 59) {
*str = '=';
} else if (*str == 60) {
*str = ';';
} else if (*str == 61) {
*str = ':';
} else if (*str == 62) {
*str = '\n';
} else {
*str = '@';
}
}
EXTIO_SCAN_STROKE = (unsigned int)0x00000000;
EXTIO_SCAN_STROKE = (unsigned int)0x00000001;
str++;
}
*str = '\0';
EXTIO_SCAN_STROKE = (unsigned int)0x00000000;
EXTIO_SCAN_REQ = (unsigned int)0x00000000;
EXTIO_SCAN_STROKE = (unsigned int)0x00000001;
EXTIO_SCAN_STROKE = (unsigned int)0x00000000;
}
/* 文字列 str[] を表示する関数 */
void my_print(str)
unsigned int *str;
{
while (*str != '\0') {
EXTIO_PRINT_STROKE = (unsigned int)0x00000000;
if ((*str >= 'A') && (*str <= 'Z')) {
EXTIO_PRINT_ASCII = *str - 'A' + 1;
} else if ((*str >= 'a') && (*str <= 'z')) {
EXTIO_PRINT_ASCII = *str - 'a' + 1;
} else if ((*str >= '0') && (*str <= '9')) {
EXTIO_PRINT_ASCII = *str - '0' + 48;
} else {
if (*str == '@') {
EXTIO_PRINT_ASCII = (unsigned int)0;
} else if (*str == '[') {
EXTIO_PRINT_ASCII = (unsigned int)27;
} else if (*str == ']') {
EXTIO_PRINT_ASCII = (unsigned int)29;
} else if ((*str >= ' ') && (*str <= '/')) {
EXTIO_PRINT_ASCII = *str - ' ' + 32;
} else if (*str == '?') {
EXTIO_PRINT_ASCII = (unsigned int)58;
} else if (*str == '=') {
EXTIO_PRINT_ASCII = (unsigned int)59;
} else if (*str == ';') {
EXTIO_PRINT_ASCII = (unsigned int)60;
} else if (*str == ':') {
EXTIO_PRINT_ASCII = (unsigned int)61;
} else if (*str == '\n') {
EXTIO_PRINT_ASCII = (unsigned int)62;
} else {
EXTIO_PRINT_ASCII = (unsigned int)0x00000000;
}
}
EXTIO_PRINT_STROKE = (unsigned int)0x00000001;
str++;
}
}
|
参考書