📄 uart_send.v
字号:
/********************************** UART_send.v************************
**模块名称:UART_send
**功能描述:UART串口发送程序
**创建人 :Yehua Li
**创建日期:2008.2.24
***********************************************************************/
module UART_send(
//input
clk, //时钟
rst, //高电平复位
WR, //写信号
Datain,
//output
clkout, //输出时钟
TXD, //UART发送引脚
TI //发送中断
);
input rst;
input clk; //输入时钟
input WR ;
input [7:0] Datain; //发送一字节的数据
output clkout; //输出时钟
output TXD,TI; //串行数据,发送中断
//
//-----------中间变量定义-----------------
reg [9:0] Datainbuf; //发送数据缓存
reg Datainbuf2;
reg TI;
/********************波特率发生进程*****************************************************/
parameter frequency_in=48000000; //输入时钟
parameter baud_rate =9600; //设置波特率
parameter cout=frequency_in/baud_rate; //根据具体时钟和波特率设置分频系数(5000)
reg [15:0] cnt;
wire clk_equ; //分频时钟
always @(posedge clk)
begin
if(rst)
cnt<=16'd0;
else
if(clk_equ)
cnt<=16'd0;
else
cnt<=cnt+1'b1;
end
assign clk_equ=(cnt==cout-1); //5000分频,0~4999,
//当cnt=5000-1,clk_equ为1,其余为0
assign clkout=clk_equ; //clkout给用户使用,其频率为9600HZ
/******************读数据到缓存进程****************************************************/
reg WR_ctr; //写标志
always @(posedge clk)
begin
if(rst)
begin
Datainbuf<=10'd0;
WR_ctr<=1'b0;
end
else
begin
if(WR) // 允许写
begin
Datainbuf<={1'b1,Datain[7:0],1'b0}; //读入一帧数据,10位
WR_ctr<=1'b1;
//置开始标志位
end
else //禁止写
begin
if(TI==0)
WR_ctr<=1'b0; //用于发送状态后写控制标志位清零
end
end
end
/***************************主程序进程**************************************************/
reg [3:0] bincnt; //发送数据计数器
/****************************************/
reg txd_reg; //一位发送寄存器
assign TXD=txd_reg; //TXD连续输出
/****************************************/
always @(posedge clk)
begin
if(rst)
begin
txd_reg<=1'b0;
TI<=1'b0;
Datainbuf2<=10'd0;
bincnt<=4'd0;
end
else
begin
if(clk_equ)
begin
if(WR_ctr==1||bincnt<4'd10) //发送条件判断,保证发送数据的完整性
begin
if(bincnt<4'd10)
begin
txd_reg<=Datainbuf2; //从最低位开始发送
Datainbuf2<=Datainbuf>>bincnt; //移位输出
bincnt<=bincnt+4'd1; //发送数据位计数
TI<=1'b0;
end
else
begin
bincnt<=4'd0;
end
end
else
begin //发送完毕或者处于等待状态时TXD和TI为高
txd_reg<=1'b1;
TI<=1'b1;
end
end
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -