📄 send.v
字号:
/********************send*************************
**模块名称:send
**功能描述:UART的发送程序
**************************************************/
module send(
clk, //时钟
clkout, //输出
Datain, //需要发送的一个字节数据
TXD, //uart发送引脚
TI, //发送中断
WR //写控制信号
);
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(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(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) //发送条件判断,保证发送数据的完整性
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 + -