/**
******************************************************************************
* @file tx_rs232_v5.v
* @author 西殿源
* @version V5
* @date 07/20/2012
* @brief RS232串口发送模块
* @info 1. 废除状态机,改为移位计数,资源消耗明显下降
******************************************************************************
*/
module tx_rs232_v5(
output reg tx_ro, //串行发送口
output reg ***_ro, //发送成功标志,标志脉宽一个clk周期
input rst_n, //下降沿异步复位
input entx, //单脉冲使能发送,脉宽大于等于一个clk周期
input clk, //输入时钟
input[7:0] din //预发送数据并行输入
);
parameter YES = 1'b1;
parameter NO = 1'b0;
parameter BAUD = 9600;
parameter XTAL = 1000000;
parameter BAUD_9600 = 8'd103;
reg baud_adj;
reg [9:0] din_r; //输入数据寄存器
reg entx_r; //使能锁存
reg [7:0] fp_cnt;
wire ***_w;
wire clk_w;
reg [3:0] bitn;
reg verify_reg=0;
//对输入的1M时钟进行104分频,
always @(posedge clk,negedge rst_n) begin //
if(!rst_n) fp_cnt <= 8'b0;
else if(fp_cnt == BAUD_9600) fp_cnt <= 8'b0;
else fp_cnt <= fp_cnt + 8'b1;
end//always
//当满足1.有数据发送请求脉冲;2.分频值满。
//两个条件同时满足时,方可使能时钟
assign clk_w = ( (entx_r == YES) && (fp_cnt == BAUD_9600));
//1.初始化;2.检测数据发送请求;3.同步输出
always @(posedge clk,negedge rst_n) begin
if(!rst_n) begin
tx_ro <= 1'b1;
entx_r <= NO;
***_ro <= NO;
end
else if(entx) begin
entx_r <= YES;
din_r <= {1'b1,din,1'b0};
bitn <= 4'd0;
end
else if(clk_w) begin
bitn <= bitn + 4'd1;
tx_ro <= din_r[bitn];
entx_r <= ~***_w;
***_ro <= ***_w;
end
else begin
***_ro <= NO;
end
end
assign ***_w = (bitn==4'd9)? YES:NO;
endmodule
文章评论(0条评论)
登录后参与讨论