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

📄 send.v

📁 Actel双端口存储;通过串口发送数据初始化RAM
💻 V
字号:
// send.v

/********************send*************************
**模块名称:send
**功能描述:UART的发送程序
**************************************************/
module send(
			clk,									  //系统同步时钟
			WR,									  	//写数据到发送缓存的使能信号
			Datain,									//需要发送的一个字节数据
			clkout,									//输出
			TXD,									  //uart发送引脚	
			TI										  //发送中断--TI = 0,表示正在发送数据;
                              //TI = 1,表示等待发送数据或发送数据完毕;
			);

input			  clk;							    //输入时钟
input			  WR;									  //写信号
input	[7:0]	Datain;								//发送的一字节数据
output			clkout;								//输出时钟
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 = 5000;								//根据具体的时钟来设定分频系数
						//这里是48M时钟,波特率选择是9600,所以分频系数为48000000/9600= 5000;	
            					
/*************波特率发生进程****************************/
always@(posedge clk)										
begin
	if(clk_equ)
		cnt = 16'd0;
	else 
		cnt = cnt+1'b1;
end

assign clk_equ = (cnt == COUNT);
assign clkout = clk_equ;

/*************读数据到缓存进程****************************/
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 + -