Baud Rate을 생성하고, Over Sampling을 하기 위한 코드 작성 (baud_rate_gen.v)
- oversampling을 위해 bit count를 진행해야 한다.
- 첫 신호에서 start bit가 들어오면 bit_cnt_std 8번째에 샘플링을 시작하고, 그 이후부터는 16번째에 샘플링을 하면 data bit의 중앙에서 데이터를 샘플링할 수 있다,
- 1개의 baud rate 주기 안에 들어가는 clock의 개수를 구하기 위해서
baud rate 주기 / clk 주기 = clk freq / baud rate freq을 계산한다. - 위에서 계산한 값을 16으로 나누어 그 값을 bit count standard로 잡으면 이 기준의 16배가 baud rate의 주기가 된다.
- 첫 신호에서 start bit가 들어오면 bit_cnt_std 8번째에 샘플링을 시작하고, 그 이후부터는 16번째에 샘플링을 하면 data bit의 중앙에서 데이터를 샘플링할 수 있다,
- bit count standard만큼의 신호가 8번 진행되면 Baud Rate의 주기의 절반 지점에 도달하게 된다.
위의 예시로 살펴보면, bit count standard인 1s의 신호가 8번 진행되면 8개의 clock이 나타나고, 이 때가 샘플링 시점이 된다. - 8번째 이후로는 16개의 bit count standard(이하 bit_cnt_std)가 16번 나타날 때마다 baud rate의 중간 지점이 되므로, 이 때 enable 신호를 1로 만들어 데이터를 샘플링하도록 output으로 enable을 설정한다.
[ baud_rate_gen.v ]
더보기
`timescale 1ns / 1ps
module baud_rate_gen(
input clk,
input rst,
output enable
);
parameter clk_freq = 125_000_000;
parameter baud_rate = 9600;
parameter bit_cnt_std = clk_freq/(baud_rate*16);
reg [15:0] bit = 16'd0;
reg [12:0] cnt = 13'd0;
reg en;
assign enable = en;
always@(posedge clk)begin
if(rst) begin
en = 0;
bit = 0;
//cnt = 0;
end
else begin
cnt = cnt+1;
if(cnt > bit_cnt_std) bit = bit+1;
if(((bit+8) % 16) == 0) begin
en = 1;
bit = 0;
cnt = 0;
end
else en = 0;
end //else end
end
endmodule
Baud Rate에 따른 Enable 신호를 검증하기 위해 testbench 작성
앞서 만든 Enable 신호를 생성하는 모듈을 검증하기 위해 테스트벤치 코드 작성
- baud_rate_gen 모듈에서 사용한 parameter의 값을 변경하여 bit_cnt_std의 값은 유지하되, testbench에서는 주기가 8.0인 Clock Frequency를 사용하기 위해 다음과 같이 코드를 작성했다.
- baud_rate_gen의 인스턴스화 과정에서 사용한 #(.clk_freq (13020), .baud_rate(1)) 부분은 해당 모듈 내부에서 선언한 parameter 값을 이 테스트벤치에서 괄호 안의 값으로 수정한다는 코드이다.
- 사용 예시) module_name #( .param0 (value0), .param1(value1), ...) uut (
.port0 (portname0), .port1(portname1), ...);
더보기
`timescale 1ns / 1ps
module baud_rate_tb();
parameter CLK_PD = 8.0;
reg CLK, RST;
wire ENABLE;
baud_rate_gen #(.clk_freq (13020), .baud_rate (1)) uut0(
.clk (CLK),
.rst (RST),
.enable (ENABLE)
);
initial begin
RST = 1'b1;
#(CLK_PD*10);
RST = 1'b0;
end
initial CLK = 1'b0;
always #(CLK_PD/2) CLK = ~CLK;
initial begin
repeat(10) @(posedge ENABLE);
#100;
$finish;
end
endmodule
[ 테스트벤치 실행 결과 ]
'자습시간 > Verilog' 카테고리의 다른 글
UART 설계(3) - UART RX 설계 / 최종 설계 완료 (0) | 2024.07.29 |
---|---|
UART 설계(2) - UART TX 설계 (0) | 2024.07.26 |
Verilog 자료형 (0) | 2024.07.13 |
Verilog HDL 모델링 방법 개요 (0) | 2024.06.30 |