您的位置:首页 > 其它

Verilog HDL串口发送程序

2020-07-14 05:46 120 查看
module myuart_trans(
input clk,
input rst,
input TransEn,           //transmit able
input[7:0] DataToTrans,  //Data prepared for transmitting
output reg BufFull,      //Data buffer is full
output reg tx,           //serial data out
output reg gnd=1'b0
);

//对50MHz晶振进行分频,3.125MHz
reg[7:0] count;
reg clk16x;
always@(posedge clk or posedge rst)
if(rst)
begin
count<=8'd0;
clk16x=1'b0;
end
else if(count>=8'd125)
begin
count<=1'b0;
clk16x=~clk16x;
end
else count<=count+1'b1;

//capture the falling edge of TransEn
reg TransEn_r;
wire pos_tri;
always@(posedge clk16x or posedge rst)
if(rst) TransEn_r <= 1'b0;
else TransEn_r <= TransEn;
assign pos_tri = TransEn_r & ~TransEn;

// when the falling edge of TransEn,load the Data to buffer
reg[7:0] ShiftReg;
always@(negedge pos_tri or posedge rst)
if(rst) ShiftReg <= 8'b0;
else ShiftReg <= DataToTrans;

//counter control
reg cnt_en;
always@(posedge clk16x or posedge rst)
if(rst)
begin
cnt_en <= 1'b0;
BufFull <= 1'b0;
end
else if(pos_tri==1'b1)
begin
cnt_en <= 1'b1;
BufFull <= 1'b1;
end
else if(cnt==168)
begin
cnt_en <= 1'b0;
BufFull <= 1'b0;
end

//counter module
reg[7:0] cnt;
always@(posedge clk16x or posedge rst)
if(rst) cnt <= 8'd0;
else if(cnt_en) cnt <= cnt+1'b1;
else cnt <= 8'd0;

//transmit module
always@(posedge clk16x or posedge rst)
if(rst) tx <= 1'b1;
else if(cnt_en)
case(cnt)
8'd8: tx <= 1'b0;
8'd24: tx <= ShiftReg[0];
8'd40: tx <= ShiftReg[1];
8'd56: tx <= ShiftReg[2];
8'd72: tx <= ShiftReg[3];
8'd88: tx <= ShiftReg[4];
8'd104: tx <= ShiftReg[5];
8'd120: tx <= ShiftReg[6];
8'd136: tx <= ShiftReg[7];
8'd152: tx <= 1'b1;
endcase
else tx <= 1'b1;

endmodule

 

转载于:https://www.cnblogs.com/Mungbohne/p/4376427.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: