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

📄 tx2.v

📁 FPGA上实现UART串口原程序
💻 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 + -