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

📄 send.v

📁 主芯片:Actel的FPGA030,Verilog语言,串口发送和接收的例程
💻 V
字号:
/********************************版权声明**************************************
**                         广州致远电子有限公司
**                                     
**                        http://www.embedtools.com
**
**-------------------------------------------文件信息----------------------------------------------------------
** 文件名称:       send.v	
** 创建者:		    
** 创建日期:       2007. 10.20		
** 版本号:	        V1.0	
** 功能描述:	    UART的发送模块	
** 
**--------------------------------------修改文件的相关信息--------------------------------------------------
** 修改人: 			
** 修改日期:	    2008.7.8	
** 版本号:         V1.01	
** 修改内容:	    整理	
**
*******************************************************************************/
module send(
			clk,									//时钟
			clkout,									//输出
			datain,									//需要发送的一个字节数据
			TXD,									//uart发送引脚	
			TI,										//发送中断
			WR,										//写控制信号
            rst										//复位								
			);
	input           rst;
	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(rst)
        cnt <= 16'd0;
    else
	    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(rst)
     begin
        datainbuf <= 10'd0;
        WR_ctr <= 1'b0;
     end
    else   
	if(WR)	
	begin
		datainbuf <= {1'b1,datain[7:0],1'b0};		//读入数据,并把缓存组成一帧数据,10位 datain[7:0]
		WR_ctr <= 1'b1;								//置开始标志位
	end
	else if(TI==0)
		WR_ctr <= 1'b0;
end
	

/********************************************************************************
** 模块名称:
** 功能描述:主程序进程
********************************************************************************/

always@(posedge clk)
begin
    if(rst)
    begin
        TXD_reg <= 1'b1;
        TI <= 1'b1;
        bincnt <= 4'd0;
    end
    else if(clk_equ)                  	            //发送条件判断,保证发送数据的完整性
	    begin
		    if(WR_ctr==1||TI==0)	
			    if(bincnt<4'd10)
		   	    begin
				    TXD_reg <= datainbuf>>bincnt;	//移位输出
				    bincnt <= bincnt + 4'd1;        //发送数据位计数
				    TI <= 1'b0;
			    end
			    else
                    begin
				        bincnt <= 4'd0;
                        TI <= 1'b1;
                        TXD_reg <= 1'b1;
                    end

    end		
end
	
assign TXD = TXD_reg;								//TXD连续输出

endmodule 

⌨️ 快捷键说明

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