📄 send.v
字号:
// send.v
/********************send*************************
**模块名称:send
**功能描述:UART的发送程序
**************************************************/
module send(
clk, //系统同步时钟
WR, //写数据到发送缓存的使能信号
Datain, //需要发送的一个字节数据
clkout, //输出
TXD, //uart发送引脚
TI //发送中断--TI = 0,表示正在发送数据;
//TI = 1,表示等待发送数据或发送数据完毕;
);
input clk; //输入时钟
input WR; //写信号
input [7:0] Datain; //发送的一字节数据
output clkout; //输出时钟
output TXD,TI; //串行数据,发送中断
reg [9:0] Datainbuf,Datainbuf2; //发送数据缓存
reg WR_ctr; //写标志
reg TI,txd_reg; //中断标志、一位发送寄存器
reg [3:0] bincnt; //发送数据计数器
reg [15:0] cnt; //计数器
wire clk_equ; //分频时钟
parameter COUNT = 5000; //根据具体的时钟来设定分频系数
//这里是48M时钟,波特率选择是9600,所以分频系数为48000000/9600= 5000;
/*************波特率发生进程****************************/
always@(posedge clk)
begin
if(clk_equ)
cnt = 16'd0;
else
cnt = cnt+1'b1;
end
assign clk_equ = (cnt == COUNT);
assign clkout = clk_equ;
/*************读数据到缓存进程****************************/
always@(posedge clk)
begin
if(WR) //有数据写入缓存
begin
Datainbuf = {1'b1,Datain[7:0],1'b0}; //读入数据,并把缓存组成一帧数据,10位
WR_ctr = 1'b1; //置开始标志位
end
else
if(TI==0) //正在发送数据;
WR_ctr = 1'b0;
end
/*************主程序进程****************************/
always@(posedge clk)
begin
if(clk_equ)
begin
if(WR_ctr==1||bincnt<4'd10) //发送条件判断,保证发送数据的完整性
//满足WR_ctr==1,开始发送最低位
begin
if(bincnt<4'd10)
begin
txd_reg = Datainbuf2[0]; //从最低位开始发送
Datainbuf2 = Datainbuf>>bincnt; //移位输出
bincnt = bincnt+4'd1; //发送数据位计数
TI = 1'b0;
end
else
bincnt = 4'd0;
end
else
begin //发送完毕或者处于等待状态时TXD和TI为高
txd_reg = 1'b1;
TI = 1'b1;
end
end
end
//-------------------------------------------------
assign TXD = txd_reg; //TXD连续输出
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -