⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_send.v

📁 Verilog HDL 串口发送程序
💻 V
字号:
/********************************** UART_send.v************************
**模块名称:UART_send
**功能描述:UART串口发送程序
**创建人  :Yehua Li
**创建日期:2008.2.24
***********************************************************************/
module  UART_send(
                   //input
                    clk,       //时钟
                    rst,       //高电平复位 
                    WR,        //写信号
                    Datain,
                   //output
                    clkout,    //输出时钟
                    TXD,       //UART发送引脚
                    TI         //发送中断
                  );
input        rst;
input        clk;              //输入时钟
input        WR ;
input [7:0]  Datain;           //发送一字节的数据
output       clkout;           //输出时钟
output       TXD,TI;           //串行数据,发送中断
//
//-----------中间变量定义-----------------
reg  [9:0]   Datainbuf;		     //发送数据缓存
reg          Datainbuf2;          
reg          TI;

/********************波特率发生进程*****************************************************/
parameter  frequency_in=48000000;               //输入时钟
parameter  baud_rate   =9600;                   //设置波特率
parameter  cout=frequency_in/baud_rate;          //根据具体时钟和波特率设置分频系数(5000)

reg   [15:0]   cnt;
wire           clk_equ;                         //分频时钟         

always  @(posedge clk)
begin
       if(rst)
          cnt<=16'd0;
       else
          if(clk_equ)
             cnt<=16'd0;
          else
             cnt<=cnt+1'b1;
end
assign  clk_equ=(cnt==cout-1);               //5000分频,0~4999,
                                             //当cnt=5000-1,clk_equ为1,其余为0
assign  clkout=clk_equ;                     //clkout给用户使用,其频率为9600HZ

/******************读数据到缓存进程****************************************************/
reg          WR_ctr;            //写标志

always @(posedge clk)
begin
     if(rst)
     begin
                Datainbuf<=10'd0;
                WR_ctr<=1'b0;
     end
     else
     begin
          if(WR)                                      // 允许写
          begin
             Datainbuf<={1'b1,Datain[7:0],1'b0};     //读入一帧数据,10位
             WR_ctr<=1'b1;                          
                                                     //置开始标志位
          end
          else                                       //禁止写
          begin
               if(TI==0)          
                 WR_ctr<=1'b0;          //用于发送状态后写控制标志位清零
          end
     end

end
/***************************主程序进程**************************************************/
reg   [3:0]   bincnt;                      //发送数据计数器

/****************************************/
reg           txd_reg;                     //一位发送寄存器
assign        TXD=txd_reg;                 //TXD连续输出
/****************************************/
always @(posedge clk)
begin
      if(rst)
      begin
           txd_reg<=1'b0;
           TI<=1'b0;
           Datainbuf2<=10'd0;
           bincnt<=4'd0;
      end

      else
      begin
	     if(clk_equ)
       	 begin
		    if(WR_ctr==1||bincnt<4'd10)					//发送条件判断,保证发送数据的完整性
		      begin
			   if(bincnt<4'd10)
		   	     begin
				 txd_reg<=Datainbuf2;				    //从最低位开始发送
				 Datainbuf2<=Datainbuf>>bincnt;			//移位输出
				 bincnt<=bincnt+4'd1;					//发送数据位计数
				 TI<=1'b0;
			     end
			   else
                 begin
				 bincnt<=4'd0;
                 end
		      end
		    else
		      begin								//发送完毕或者处于等待状态时TXD和TI为高
			     txd_reg<=1'b1;
			     TI<=1'b1;
		      end 
	     end
	 end			
end











endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -