다운/퍼 가실 때 댓글 부탁드려요. 그리고 받으신 자료 유료 레포트 사이트에 올리지 말아주세요.
1. 개 요
가. 레지스터를 통한 데이터의 입력과 출력을 구현해본다.
나. 레지스터에 각각 초기화, 출력 1개, 입력2개에 대한 MUX를 두어 컨트롤한다.
다. 구현된 레지스터와 ALU를 결합하여 레지스터에서 나온 2개의 데이터에 대한 ALU 연산 결과를 레지스터에 다시 쓰도록 구현한다.
2. 알고리즘
가. 레지스터 파일 구조도
|
|
1) 각 레지스터의 개수는
2) 각 데이터들은 8비트이며 control(MUX)에 의해서 레지스터에 읽거나 써진다.
3) 레지스터의 작동은 싱글 사이클 시 클록의 상승에지일 때 동작한다.
나. 레지스터와 ALU 결합도
|
|
1) 레지스터는 총 32개의 공간으로 이루어져 있고 각 control신호에 의해서 제어가 된다.
2) read_enable 신호가 1이 되면 read_adress1,2에 해당하는 주소의 레지스터에 쓰여져 있던 데이터가 read_data1,2에 읽혀진다.
3) 읽혀진 데이터는 ALU연산을 통해서 계산되고 연산된 결과는 write_enalbe control에 의해서 레지스터에 쓰여질지 결정된다.
4) 레지스터의 write_enable 신호가 1이 되면 연산되었던 결과는 wirte_adress에 맞는 레지스터에 그 값이 기록된다.
3. 코 드
|
module alu_reg(a, b, func_sel, result_sel, result, clk, rst, read_enable1, read_enable2, write_enable, read_adress1, read_adress2, write_adress); wire [7:0] a, b, result; input [4:0] read_adress1, read_adress2, write_adress; input [1:0] result_sel; input func_sel, clk, rst, read_enable1, read_enable2, write_enable; output [7:0] a, b, result; m_alu alu1(a, b, func_sel, result_sel, result); // alu 모듈 시행 m_register register1(clk, rst, read_enable1, read_enable2, write_enable, read_adress1, read_adress2, write_adress, a, b, result); // 레지스터 모듈 시행 endmodule module m_register(clk, rst, read_enable1, read_enable2, write_enable, read_adress1, read_adress2, write_adress, read_data1, read_data2, write_data); input clk, rst, read_enable1, read_enable2, write_enable; input [4:0] read_adress1, read_adress2, write_adress; input [7:0] write_data; output [7:0] read_data1, read_data2; reg [7:0] read_data1, read_data2; reg [7:0] rom_table[0:31]; // 레지스터 테이블 always@(posedge clk or negedge rst) // 클록이 상승에지일 경우 수행 begin if(rst == 1'b0) // 레지스터 초기화 begin rom_table[0] = 8'b00000000; rom_table[1] = 8'b00000001; rom_table[2] = 8'b00000010; rom_table[3] = 8'b00000011; rom_table[4] = 8'b00000100; rom_table[5] = 8'b00000101; rom_table[6] = 8'b00000110; rom_table[7] = 8'b00000111; rom_table[8] = 8'b00001000; rom_table[9] = 8'b00001001; rom_table[10] = 8'b00001010; rom_table[11] = 8'b00001011; rom_table[12] = 8'b00001100; rom_table[13] = 8'b00001101; rom_table[14] = 8'b00001110; rom_table[15] = 8'b00001111; rom_table[16] = 8'b00010000; rom_table[17] = 8'b00010001; rom_table[18] = 8'b00010010; rom_table[19] = 8'b00010011; rom_table[20] = 8'b00010100; rom_table[21] = 8'b00010101; rom_table[22] = 8'b00010110; rom_table[23] = 8'b00010111; rom_table[24] = 8'b00011000; rom_table[25] = 8'b00011001; rom_table[26] = 8'b00011010; rom_table[27] = 8'b00011011; rom_table[28] = 8'b00011100; rom_table[29] = 8'b00011101; rom_table[30] = 8'b00011110; rom_table[31] = 8'b00011111; end else begin if(write_enable == 1'b1) // write_adress에 해당하는 레지스터에 data 기록 rom_table[write_adress] = write_data; if(read_enable1 == 1'b1) // read_adress1에 해당하는 레지스터에 데이터 읽음 read_data1 = rom_table[read_adress1]; if(read_enable2 == 1'b1) // read_adress1에 해당하는 레지스터에 데이터 읽음 read_data2 = rom_table[read_adress2]; end end endmodule |
|
/* 이하 소스는 ALU 구현과 동일함 */ module m_alu(a, b, func_sel, result_sel, result); input [7:0] a, b; input func_sel; input [1:0] result_sel; output [7:0] result; reg [7:0] result; reg [7:0] adder_result; reg [7:0] and_result; reg [7:0] or_result; m_adder adder1(a, b, adder_result, func_sel); m_and and1(a, b, and_result); m_or or1(a, b, or_result); always@(result, adder_result, and_result, or_result, result_sel) case(result_sel) 2'b00 : result = adder_result; 2'b01 : begin if(adder_result >= 0) result = 8'b00000000; else result = 8'b00000001; end 2'b10 : result = and_result; 2'b11 : result = or_result; endcase endmodule module m_adder(a, b, adder_result, func_sel); input [7:0] a, b; input func_sel; output [7:0] adder_result; wire [7:0] c; wire [7:0] b1; m_complement com1(b, b1, func_sel); m_half_adder ha(a[0], b1[0], c[0], adder_result[0]); m_full_adder fa1(a[1], b1[1], c[0], c[1], adder_result[1]); m_full_adder fa2(a[2], b1[2], c[1], c[2], adder_result[2]); m_full_adder fa3(a[3], b1[3], c[2], c[3], adder_result[3]); m_full_adder fa4(a[4], b1[4], c[3], c[4], adder_result[4]); m_full_adder fa5(a[5], b1[5], c[4], c[5], adder_result[5]); m_full_adder fa6(a[6], b1[6], c[5], c[6], adder_result[6]); m_full_adder fa7(a[7], b1[7], c[6], c[7], adder_result[7]); endmodule module m_full_adder(a, b, cin, cout, adder_result); input a, b, cin; output cout, adder_result; wire c1, c2, s1; m_half_adder ha1(b, cin, c1, s1); m_half_adder ha2(a, s1, c2, adder_result); assign cout = c1 | c2; endmodule |
|
module m_half_adder(a, b, c, adder_result); input a, b; output c, adder_result; assign adder_result = a ^ b; assign c = a & b; endmodule module m_complement(b, b1, func_sel); input [7:0] b; input func_sel; output [7:0] b1; reg [7:0] tmp; always@(b, tmp, func_sel) case(func_sel) 1'b0 : tmp = b; 1'b1 : tmp = ~b + 1; endcase assign b1 = tmp; endmodule module m_and(a, b, and_result); input [7:0] a, b; output [7:0] and_result; assign and_result = a & b; endmodule module m_or(a, b, or_result); input [7:0] a, b; output [7:0] or_result; assign or_result = a | b; endmodule |
4. 파형 및 분석
|
|
가. 레지스터를 통해서 입력을 받은 데이터를 ALU 연산을 통하여 다시 레지스터에 쓰는 프로그램을 구현하여 출력하였다.
나. (1)에서 rst를 0으로 줘서 각 32개의 레지스터의 값을 00000~11111로 초기화 하였다.
다. (2)에서 read_enable1과 read_enable2가 1이므로 해당 주소값인 01011과 01011의 데이터를 읽어서 read_data1과 read_data2에 넘겨주며 이는 ALU의 a, b의 입력데이터로 들어가게 된다. 따라서 a와 b에 해당 데이터값이 기록되어있는 것을 볼 수 있다.
라. (3)에서 write_enable값이 1이므로 주소 01111 레지스터에 값을 기록하게 되는데, 이 때의 write_data는 들어온 a, b의 ALU연산의 결과값이며 result_sel이 00이고 func_sel이 0이므로 add연산을 한 결과인 00010010이 기록된다.
마. (4)에서 read_adress1의 주소값 0111에서 데이터를 읽어와서 a에 저장하게 되는데 아까 write를 통해서 레지스터 값을 바꿨으므로, 그 때의 결과값 0001010+0001100인 00010110이 기록된다. 하지만 딜레이에 의해서 한 클록 뒤에 a의 값이 00010110으로 바뀌어 있는 것을 확인할 수 있다.
※ 참고 문헌
가. IBM PC 어셈블리 프로그래밍(교보문고 / Peter Abel 저)
나. IBM PC 매크로 어셈블리 프로그래밍(진영사 / Ytha Yu, Charles Marut 저)
다. http://vision.kongju.ac.kr/lecture/digital/chap11/digital11.htm
'레포트 자료' 카테고리의 다른 글
| 컴퓨터구조 설계 및 실험 - 16bit CPU (I-type 추가) (0) | 2009/02/02 |
|---|---|
| 컴퓨터구조 설계 및 실험 - 16bit CPU (Instruction Fetch & Decode) (2) | 2009/02/02 |
| 컴퓨터구조 설계 및 실험 - register (0) | 2009/02/02 |
| 컴퓨터구조 설계 및 실험 - ALU (1) | 2009/02/02 |
| 컴퓨터구조 설계 및 실험 - 유한상태기계(FSM - Finite State Machine) (2) | 2009/01/30 |
| 컴퓨터구조 설계 및 실험 - ripple carry adder(가산기) 및 감산기 (5) | 2009/01/29 |


alu_reg.zip



