|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
//////////////////////////////////////////////////////////////////////////////////
// Description : UART接收波特率产生
// Dependencies :
// Revision 1.4
// Additional Comments:
//////////////////////////////////////////////////////////////////////////////////
`timescale 1ns / 1ps
module UART_RXCLK_v1_4#(
parameter SYS_FREQ = 50_000_000 //输入时钟
,parameter UART_BAUD = 115_200 //波特率
)(
input clk //输入时钟
,input rst_n //复位信号
,input rx_en //接收波特率使能
,output rx_clk //UART接收时钟
);
//*********************************************************************
//本地参数:
//*********************************************************************
localparam BAUDCNT = SYS_FREQ / UART_BAUD; //波特率计数值
localparam BAUDCNT16 = BAUDCNT;
localparam BAUDCNT1 = BAUDCNT16 / 16;
localparam BAUDCNT2 = BAUDCNT16 / 8;
localparam BAUDCNT3 = BAUDCNT2 + BAUDCNT1;
localparam BAUDCNT4 = BAUDCNT16 / 4;
localparam BAUDCNT5 = BAUDCNT4 + BAUDCNT1;
localparam BAUDCNT6 = BAUDCNT4 + BAUDCNT2;
localparam BAUDCNT7 = BAUDCNT4 + BAUDCNT3;
localparam BAUDCNT8 = BAUDCNT16 / 2;
localparam BAUDCNT9 = BAUDCNT8 + BAUDCNT1;
localparam BAUDCNT10 = BAUDCNT8 + BAUDCNT2;
localparam BAUDCNT11 = BAUDCNT8 + BAUDCNT3;
localparam BAUDCNT12 = BAUDCNT16 - BAUDCNT4;
localparam BAUDCNT13 = BAUDCNT16 - BAUDCNT3;
localparam BAUDCNT14 = BAUDCNT16 - BAUDCNT2;
localparam BAUDCNT15 = BAUDCNT16 - BAUDCNT1;
//*********************************************************************
//函数
//*********************************************************************
function integer clog2(input integer freq);
integer i;
begin
for(i=0;i<32;i=i+1)
if(freq) clog2 = i + 1;
end
endfunction
//*********************************************************************
//计数
//*********************************************************************
localparam C_DW = clog2(BAUDCNT); //计数器位宽
reg [C_DW-1:0] cnt; //波特率分频计数
always@(posedge clk ) begin
if(!rst_n)
cnt <= {C_DW{1'b0}};
else if(cnt==BAUDCNT-1)
cnt <= {C_DW{1'b0}};
else if(rx_en)
cnt <= cnt + 1'b1;
else
cnt <= {C_DW{1'b0}};
end
//*********************************************************************
//接收波特率信号
//*********************************************************************
reg r_rx_clk; //UART接收时钟
assign rx_clk = r_rx_clk;
always@(posedge clk) begin
case(cnt)
BAUDCNT1,BAUDCNT2,BAUDCNT3,BAUDCNT4,BAUDCNT5,BAUDCNT6,BAUDCNT7,BAUDCNT8,
BAUDCNT9,BAUDCNT10,BAUDCNT11,BAUDCNT12,BAUDCNT13,BAUDCNT14,BAUDCNT15,BAUDCNT16 :
r_rx_clk <= 1'b1;
default :
r_rx_clk <= 1'b0;
endcase
end
endmodule
|
|