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

📄 send.v

📁 Fusion中的双口RAM编写
💻 V
字号:

/********************send*************************
**模块名称:send
**功能描述:UART的发送程序
**************************************************/
module send(
			clk,									//时钟
			clkout,									//输出
			Datain,									//需要发送的一个字节数据
			TXD,									//uart发送引脚	
			TI,										//发送中断
			WR										//写控制信号
			);
input			clk;								//输入时钟
input			WR;									//写信号
input	[7:0]	Datain;								//发送的一字节数据
output			clkout;								//输出时钟
output			TXD,TI;								//串行数据,发送中断

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

wire			clk_equ;							//分频时钟

parameter cout = 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 == cout);
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)						//发送条件判断,保证发送数据的完整性
		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 + -