📄 tx2.v
字号:
//**********************************************************//
// 串口发送子程序 V 1.2 //
// BooQuai //
// 2005-6-16 //
// 采用串口通讯接收通道的基本原理,即16倍于波特率的采样时钟 //
// //
// txok:高有,Tav>Ttxclk; 贞格式: 1 ****_**** 0 //
// stop MSB LSB start //
// 可已通过div_xxxx设置波特率。 //
// //
// <数据生成速率若大于波特率/10,则会发生数据丢失> //
// *********************************************************//
module tx2(clk,txready,data,tx,txok);
input clk,txok; //clk:50M系统时 txok:发送数据就绪,高有效
output tx,txready; //txready:等待发送数据,L.
input[7:0] data; //data:ASIIC格式数据
wire [13:0] baudbuf;
parameter idle=3'b001,
txrun=3'b010,
stop=3'b100;
reg tx,txready;
reg[8:0]databuf;
reg[4:0] cnt; //16 计数器
reg[2:0] state;
reg[3:0] bitpos; // 数据位计数器
reg[10:0] count;
reg txclk;
always @(posedge clk) //生成发送时钟
begin
databuf={1,data};
if(count==325) begin //div_xxxx=50000000/(baudrate*16)-1
count<=0;
txclk<=1;
end
else begin
count<=count+1;
txclk<=0;
end
end
always @(posedge txclk) //16倍于波特率
begin //one_hot型FS
case(state)
idle:begin //空闲态
txready<=1;
if(txok==0) begin //无发送数据
tx<=1;
cnt<=0;
state<=idle;
end
else begin // 发送数据就绪
cnt<=cnt+1;
if(cnt==7) begin //发送开始
cnt<=0; //发送起始位0
tx<=0;
bitpos<=0;
state<=txrun; //数据发送态
end
end
end
txrun: begin
txready<=0; //正在发送数据,忙状态
if(cnt==15) begin //每16个采样时钟发送一位
cnt<=0;
tx<=databuf[bitpos]; //由低位至高位
bitpos<=bitpos+1; //依次发送
if(bitpos==8) begin //停止位发送后进入停止态
bitpos<=0;
state<=stop;
end
end
else cnt<=cnt+1;
end
stop: begin //延时,产生贞间间隙
tx<=1;
if(cnt==7) begin
cnt<=0;
state<=idle; end //回到空闲态
else
cnt<=cnt+1;
end
default: state<=idle;
endcase
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -