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

📄 rec.v

📁 Actel双端口存储;通过串口发送数据初始化RAM
💻 V
字号:
// rec.v
/********************rec***************************
**模块名称:rec
**功能描述:uart的接收模块,接收采样率为波特率的16倍
*************************************************/

module rec(clk,clkout,Dataout,RXD,RI);
input 			clk;					  	//时钟输入
input 			RXD;						  //串口数据输入
output 			RI;						    //接收中断输出
output 			clkout;						//时钟输出
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;				//采集数据缓存区
reg [7:0]   Dataout;            //输出数据寄存器

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

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

/*************波特率发生进程****************************/

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;

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;					//对采样数据进行判断,只要有两次相同就可以

//--------------------------------------------------------

always@(posedge clk)
begin
	if(clk_equ)   //采样时钟
	  begin
		  if(!StartF)								//是否处于接收状态
		    begin
			    if(!RXD)
			      begin	
				      count = 4'b0;					//复位计数器
				      count_bit = 4'b0;
				      RI = 1'b1;	
				      StartF = 1'b1; 
			      end
			    else  
            RI = 1'b1;
		    end
		  else                  //StartF = 1; 处于接收状态

		    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)					//检测是否接收结束,为1表示接收结束
			      begin	
				      RI = 1'b1;					      //中断标志为高标志转换结束
				      StartF = 1'b0;
			      end
		    end

	end
end
//------------------------------------------------------	
always@(posedge RI)
begin
    Dataout[7:0] <= UartBuff[8:1];           //将串口接收到的数据加载到数据输出端口
end
//--------------------------------------------------
endmodule

⌨️ 快捷键说明

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