Module: uart_baud


Ports:

DirectionSizeName
inputclk
inputenable
outputtick

Parameter:

ParameterDefault
Baud0xF42401000000
ClkFrequency0x2DC6C0048000000
Oversampling0x11
[ZOOM]
G uartbaud uart_baud PORTS clk enable tick uart_baud.v uartrx uart_rx PORTS RxD RxD_data[7:0] RxD_data_ready RxD_endofpacket RxD_idle clk tickgen clk $add.B OversamplingTick uart_rx.v uartrx:tickgen_clk->uartbaud:clk uartrx:tickgen_enable->uartbaud:enable uartrx:tickgen_tick->uartbaud:tick uarttx uart_tx PORTS TxD TxD_busy TxD_data[7:0] TxD_start clk tickgen clk TxD_busy BitTick uart_tx.v uarttx:tickgen_clk->uartbaud:clk uarttx:tickgen_enable->uartbaud:enable uarttx:tickgen_tick->uartbaud:tick

Child-Modules



Source

Filename: uart_baud.v
4 module uart_baud(
5 	input clk, enable,
6 	output tick  // generate a tick at the specified baud rate * oversampling
7 );
8     parameter ClkFrequency = 12000000;
9     parameter Baud = 2000000;
10     parameter Oversampling = 1;
11 
12     function integer log2(input integer v); begin log2=0; while(v>>log2) log2=log2+1; end endfunction
13     localparam AccWidth = log2(ClkFrequency/Baud)+8;  // +/- 2% max timing error over a byte
14     reg [AccWidth:0] Acc = 0;
15     localparam ShiftLimiter = log2(Baud*Oversampling >> (31-AccWidth));  // this makes sure Inc calculation doesn't overflow
16     localparam Inc = ((Baud*Oversampling << (AccWidth-ShiftLimiter))+(ClkFrequency>>(ShiftLimiter+1)))/(ClkFrequency>>ShiftLimiter);
17     always @(posedge clk) if(enable) Acc <= Acc[AccWidth-1:0] + Inc[AccWidth:0]; else Acc <= Inc[AccWidth:0];
18     assign tick = Acc[AccWidth];
19 endmodule