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

📄 send.v

📁 PS2鼠标实验Verilog HDL代码
💻 V
字号:
// send.v
/********************send*************************
**模块名称:send
**功能描述:UART的发送程序
**************************************************/
module send(
			clk,									  //系统同步时钟
			WR,									  	//写数据到发送缓存的使能信号
			Datain,									//需要发送的一个字节数据
			TXD,									  //uart发送引脚	
			TI,										  //发送中断--TI = 0,表示正在发送数据;
            reset               //TI = 1,表示等待发送数据或发送数据完毕;
			);

input			  clk;							    //输入时钟
input			  WR;									  //写信号
input	[7:0]	Datain;								//发送的一字节数据
input reset;
output			TXD,TI;								//串行数据,发送中断

reg		[9:0]	Datainbuf,Datainbuf2;			//发送数据缓存
reg 			  WR_ctr;			            	//写标志
reg 			  TI,txd_reg;			        	//中断标志、一位发送寄存器
reg		[3:0]	bincnt;								    //发送数据计数器
reg		[15:0]	cnt;							    	//计数器

wire			clk_equ;							      //分频时钟

parameter COUNT = 2500;	//19200							//根据具体的时钟来设定分频系数
						//这里是48M时钟,波特率选择是9600,所以分频系数为48000000/9600= 5000;	
            					
/*************波特率发生进程****************************/
always@(posedge clk)										
begin
   if(reset)
    begin
      cnt<=0;
    end
   else
    begin
	  if(clk_equ)
	 	cnt<= 16'd0;
   	  else 
		cnt<=cnt+1'b1;
    end
end
assign clk_equ =(cnt == COUNT);

/*************读数据到缓存进程****************************/
always@(posedge clk)
begin
	if(WR)	      //有数据写入缓存
	  begin
		  Datainbuf <= {1'b1,Datain[7:0],1'b0};	//读入数据,并把缓存组成一帧数据,10位
		  WR_ctr <= 1'b1;								        //置开始标志位
	  end
	else 
    if(TI==0)   //正在发送数据;
		  WR_ctr <= 1'b0;
end
	
/*************主程序进程****************************/
always@(posedge clk)
begin
	if(clk_equ)
	begin
		if(WR_ctr==1||bincnt<4'd10)						//发送条件判断,保证发送数据的完整性
                                          //满足WR_ctr==1,开始发送最低位
		begin
			if(bincnt<4'd10)
		   	begin
				txd_reg =  Datainbuf2[0];				 //从最低位开始发送
				Datainbuf2 = Datainbuf>>bincnt;	 //移位输出
				bincnt = bincnt+4'd1;					   //发送数据位计数
				TI = 1'b0;
			end
			else
				bincnt = 4'd0;
			end
		else
		begin											          //发送完毕或者处于等待状态时TXD和TI为高
			txd_reg = 1'b1;
			TI = 1'b1;
		end 
	end			
end
//-------------------------------------------------	
assign TXD = txd_reg;									 //TXD连续输出

endmodule

⌨️ 快捷键说明

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