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

📄 rec.v

📁 主芯片:Actel的FPGA030,Verilog语言,串口发送和接收的例程
💻 V
字号:
/********************************版权声明**************************************
**                         广州致远电子有限公司
**                                     
**                        http://www.embedtools.com
**
**-------------------------------------------文件信息----------------------------------------------------------
** 文件名称:       rec.v	
** 创建者:	    	
** 创建日期:       2007. 10.20		
** 版本号:	        V1.0	
** 功能描述:	    UART的接收模块	
** 
**--------------------------------------修改文件的相关信息--------------------------------------------------
** 修改人: 			
** 修改日期:	    2008.7.8	
** 版本号:	        V1.01	
** 修改内容:	    整理	
**
*******************************************************************************/
module rec(
           clk,
		   clkout,
		   dataout,
		   RXD,
		   RI,
		   rst
		   );

	input           rst;
	input 			clk,RXD;							  //时钟与数据输入
	output 			clkout,RI;							  //时钟输入、接收中断输出
	output	[7:0]	dataout;			 				  //并行数据输出

	reg 			StartF,RI;							  //开始与接收中断标志
	reg		[9:0] 	UartBuff;	 			 			  //接收缓存区
	reg		[3:0]	count,count_bit;					  //位接收计数器
	reg	   [15:0] 	cnt;								  //时钟节拍计数器
	reg		[2:0]	bit_collect;						  //采集数据缓存区

	wire 			clk_equ,bit1,bit2,bit3,bit4;		  //连线

	parameter 	    cout = 312;							  //时钟是48M所以16*9600的分频数为312.5,这里取整数

/********************************************************************************
** 模块名称:
** 功能描述:波特率发生进程
********************************************************************************/

always@(posedge clk)									   //时钟节拍计数器
begin
    if(rst)
        cnt <= 16'd0;
    else
    begin
	    if(clk_equ)
		    cnt <= 16'd0;
	    else 
		    cnt <= cnt + 1'b1;
    end 
end

assign clk_equ = (cnt == cout);								//采样时钟
assign clkout = clk_equ;

assign   bit1 = bit_collect[0]&bit_collect[1];				//对采样数据进行判断
assign   bit2 = bit_collect[1]&bit_collect[2];				//对采样数据进行判断
assign   bit3 = bit_collect[0]&bit_collect[2];				//对采样数据进行判断
assign   bit4 = bit1|bit2|bit3;								//对采样数据进行判断,只要有两次相同就可以
/********************************************************************************
** 模块名称:
** 功能描述:UART的接收模块,接收采样率为波特率的16倍
********************************************************************************/

always@(posedge clk)
begin
    if(rst)
    begin
        count <= 4'd0;
        RI <= 1'b1;
        StartF <= 1'b0;
        bit_collect <= 3'd0;
        UartBuff <= 10'd0;
    end
    else
begin
	if(clk_equ)
	begin
		if(!StartF)											//是否处于接收状态
		begin
			if(!RXD)
			begin	
				count <= 4'b0;								//复位计数器
				count_bit <= 4'b0;
				RI <= 1'b0;	
				StartF <= 1'b1; 
			end
			else  RI <= 1'b1;
		end
		else 
		begin
			count <= count+1'b1;							//位接收状态加1
			if(count==4'd6)
				bit_collect[0] <= RXD;						//数据采集
			if(count==4'd7)
				bit_collect[1] <= RXD;						//数据采集 
			if(count==4'd8)
			begin
				bit_collect[2] <= RXD;						//数据采集
				UartBuff[count_bit] <= bit4;
				count_bit <= count_bit+1'b1;				//位计数器加1
				if((count_bit==4'd1)&&(UartBuff[0]==1'b1))	//判断开始位是否为0
				begin
					StartF <= 1'b0;							//标志开始接收
				end
				RI <= 1'b0;									//中断标志位低
			end	
			if(count_bit>4'd9)								//检测是否接收结束
			begin	
				RI <= 1'b1;									//中断标志为高标志转换结束
				StartF <= 1'b0;
			end
		end
	end
end
end
	
assign  dataout = UartBuff[8:1];						    //取出数据位 

endmodule 

⌨️ 快捷键说明

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