原创 串口发送模块 V5

2012-7-24 15:14 913 8 8 分类: FPGA/CPLD

/**
  ******************************************************************************
  * @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
     
     
  

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条