📄 send.v
字号:
/********************************版权声明**************************************
** 广州致远电子有限公司
**
** http://www.embedtools.com
**
**-------------------------------------------文件信息----------------------------------------------------------
** 文件名称: send.v
** 创建者:
** 创建日期: 2007. 10.20
** 版本号: V1.0
** 功能描述: UART的发送模块
**
**--------------------------------------修改文件的相关信息--------------------------------------------------
** 修改人:
** 修改日期: 2008.7.8
** 版本号: V1.01
** 修改内容: 整理
**
*******************************************************************************/
module send(
clk, //时钟
clkout, //输出
datain, //需要发送的一个字节数据
TXD, //uart发送引脚
TI, //发送中断
WR, //写控制信号
rst //复位
);
input rst;
input clk; //输入时钟
input WR; //写信号
input [7:0] datain; //发送的一字节数据
output clkout; //输出时钟
output TXD,TI; //串行数据,发送中断
reg [9:0] datainbuf,datainbuf2; //发送数据缓存
reg WR_ctr,TI,TXD_reg; //写标志、中断标志、一位发送寄存器
reg [3:0] bincnt; //发送数据计数器
reg [15:0] cnt; //计数器
wire clk_equ; //分频时钟
parameter cout = 5000; //根据具体的时钟来设定分频系数
//这里是48M时钟,波特率选择是9600,所以分频系数为48000000/9600= 5000;
/********************************************************************************
** 模块名称:
** 功能描述:波特率发生进程
********************************************************************************/
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);
assign clkout = clk_equ;
/********************************************************************************
** 模块名称:
** 功能描述:读数据到缓存进程
********************************************************************************/
always@(posedge clk)
begin
if(rst)
begin
datainbuf <= 10'd0;
WR_ctr <= 1'b0;
end
else
if(WR)
begin
datainbuf <= {1'b1,datain[7:0],1'b0}; //读入数据,并把缓存组成一帧数据,10位 datain[7:0]
WR_ctr <= 1'b1; //置开始标志位
end
else if(TI==0)
WR_ctr <= 1'b0;
end
/********************************************************************************
** 模块名称:
** 功能描述:主程序进程
********************************************************************************/
always@(posedge clk)
begin
if(rst)
begin
TXD_reg <= 1'b1;
TI <= 1'b1;
bincnt <= 4'd0;
end
else if(clk_equ) //发送条件判断,保证发送数据的完整性
begin
if(WR_ctr==1||TI==0)
if(bincnt<4'd10)
begin
TXD_reg <= datainbuf>>bincnt; //移位输出
bincnt <= bincnt + 4'd1; //发送数据位计数
TI <= 1'b0;
end
else
begin
bincnt <= 4'd0;
TI <= 1'b1;
TXD_reg <= 1'b1;
end
end
end
assign TXD = TXD_reg; //TXD连续输出
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -