2024.12.04 수업날
< Tcl Console 확인 >
Test Bench Processor의 시뮬레이션을 실행할때, 하나하나 숫자를 대입하면서 시뮬레이션을 실행하기에는 복잡하니까,
for문을 이용해서 시뮬레이션을 실행해보고 결과를 살펴본다.
2중 for문을 사용한 Test Bench Processor code
module tb_Processor();
reg clk, reset_p;
reg [3:0] key_value;
reg key_valid;
wire [3:0] kout;
wire [7:0] outreg_data;
Processor DUT(
clk, reset_p,
key_value,
key_valid,
kout, // cpu가 key 입력을 받았는지 확인함
outreg_data);
initial begin
clk = 0; reset_p = 1;
key_value = 0;
key_valid = 0;
end
always #5 clk = ~clk;
integer i, j;
initial begin
#10; reset_p = 0; #10; // 초기화 끝
for(j = 0; j < 10; j = j + 1)begin
for(i = 0; i < 10; i = i + 1)begin // 베릴로그에는 증감 연산자가 없음
key_value = j; key_valid = 1; #10_000; // 10us
key_value = 0; key_valid = 0; #10_000;
key_value = 4'ha; key_valid = 1; #10_000;
key_value = 0; key_valid = 0; #10_000;
key_value = i; key_valid = 1; #10_000;
key_value = 0; key_valid = 0; #10_000;
key_value = 4'hf; key_valid = 1; #10_000; // f --> '='
key_value = 0; key_valid = 0; #10_000;
$display("%d + %d = %d \n", j, i, outreg_data); // display는 c언어의 print와 똑같음
end
end
$stop;
end
endmodule
2중 for문을 사용하여 display를 통해 시뮬레이션에서 1ms를 실행시키면 Tcl Console에서 계산이 잘 나타나는지 확인할 수 있다.
다음으로 사칙연산에도 for문을 사용하여 결과를 확인해본다.
3중 for문을 사용한 Test Bench Processor code
module tb_Processor();
reg clk, reset_p;
reg [3:0] key_value;
reg key_valid;
wire [3:0] kout;
wire [7:0] outreg_data;
Processor DUT(
clk, reset_p,
key_value,
key_valid,
kout, // cpu가 key 입력을 받았는지 확인함
outreg_data);
initial begin
clk = 0; reset_p = 1;
key_value = 0;
key_valid = 0;
end
always #5 clk = ~clk;
integer i, j, k;
initial begin
#10; reset_p = 0; #10; // 초기화 끝
for(k = 10; k < 15; k = k + 1)begin
for(j = 0; j < 10; j = j + 1)begin
for(i = 0; i < 10; i = i + 1)begin // 베릴로그에는 증감 연산자가 없음
key_value = j; key_valid = 1; #10_000; // 10us
key_value = 0; key_valid = 0; #10_000;
key_value = k; key_valid = 1; #10_000;
key_value = 0; key_valid = 0; #10_000;
key_value = i; key_valid = 1; #10_000;
key_value = 0; key_valid = 0; #10_000;
key_value = 4'hf; key_valid = 1; #10_000; // f --> '='
key_value = 0; key_valid = 0; #10_000;
$display("%d %d %d = %d %d \n", j, k, i, outreg_data, kout); // display는 c언어의 print와 똑같음
end
end
end
$stop;
end
endmodule
결과를 확인할 때, a~f는 아래와 같은 의미의 연산이다.
a(10): +
b(11): -
c(12): and연산
d(13): /
e(14): *
f(15): =
결과를 확인해보려면 1ms 실행 버튼에 아무것도 붙어있지 않은 아이콘을 눌러야한다.
10: 덧셈
11: 뺄셈
11이라고 보여지는 것은 결과값이 음수라는 의미이다.
12: and 연산
13: 나눗셈
결과값에서 앞쪽이 나머지, 뒤쪽이 몫이다.
15라고 보여지는 것은 결과값이 무한대라는 의미이다.
14: 곱셈
< Basys3에서 결과 확인 >
이번에는 Basys3에 4x4 keypad를 연결하여 FND에 연산 결과가 잘 나타나는지 확인해본다.
Basys3에서 결과를 확인하기 위한 Processor top code
module top_processor(
input clk, reset_p,
input [3:0] row,
output [3:0] col,
output [3:0] com,
output [7:0] seg_7);
wire [3:0] key_value;
wire key_valid;
calculator_keypad_cntr_FSM key_pad(
.clk(clk), .reset_p(reset_p),
.row(row),
.col(col),
.key_value(key_value),
.key_valid(key_valid));
wire [3:0] kout;
wire [7:0] outreg_data;
Processor cpu(
.clk(clk), .reset_p(reset_p),
.key_value(key_value),
.key_valid(key_valid),
.kout(kout),
.outreg_data(outreg_data));
wire [15:0] bcd;
bin_to_dec(.bin({4'b0000, outreg_data}), .bcd(bcd));
wire [15:0] value;
assign value = {kout, bcd[11:0]};
fnd_4digit_cntr fnd(.clk(clk), .reset_p(reset_p), .value(value), .seg_7(seg_7), .com(com));
endmodule
Basys3 기준으로
1번자리는 입력값과 결과값이 음수일 때 b를 표시하고, 나눗셈 연산시 몫을 표시한다.
3번자리는 결과값 십의 자리를 표시한다.
4번자리는 결과값 일의 자리를 표시하고, 나눗셈 연산시 나머지를 표시한다.
덧셈
뺄셈
결과값이 음수일 때 FND의 가장 왼쪽 자리에서 b가 표시된다.
and 연산
곱셈
나눗셈
나머지가 있을 경우 FND의 가장 왼쪽 자리에서 몫이 표시되고, 가장 오른쪽 자리에서 나머지가 표시된다.
cpu의 구조와 동작원리6(Tcl Console 확인, Basys3에서 결과 확인) 끝!