__________

Designing the Future with Circuits

반도체 회로설계 취준기

자습시간/Verilog

UART 설계(1) - Baud Rate Generator 설계

semicon_circuitdesigner 2024. 7. 22. 15:08
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의 주기가 된다.
  • 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

[ 테스트벤치 실행 결과 ]

실행 결과, 특정 주기로 ENABLE 신호가 출력됨을 확인할 수 있다.

 

'자습시간 > 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