다운/퍼 가실 때 댓글 부탁드려요. 그리고 받으신 자료 유료 레포트 사이트에 올리지 말아주세요.




1.

. 레지스터를 통한 데이터의 입력과 출력을 구현해본다.

. 레지스터에 각각 초기화, 출력 1, 입력2개에 대한 MUX 두어 컨트롤한다.

. 구현된 레지스터와 ALU를 결합하여 레지스터에서 나온 2개의 데이터에 대한 ALU 연산 결과를 레지스터에 다시 쓰도록 구현한다.


2.
알고리즘

. 레지스터 파일 구조도

1) 레지스터의 개수는 개인 32개를 사용한다.

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

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License