现在的位置: 首页 > 综合 > 正文

乒乓操作引起的数据的错误

2013年06月28日 ⁄ 综合 ⁄ 共 963字 ⁄ 字号 评论关闭
			
程序功能描述:

板卡外部接a和b相机,a相机给板卡供20M时钟,串行差分信号;B相机给板卡供21M时钟,12位并行的差分数据和门控信号。其中A相机一帧数据是647k字,B相机一帧数据是71M字。门控低时数据有效。

板卡用2片70v631做片外sram缓存数据,上位机通过pci接口与板卡通信,板卡采用乒乓操作从sram读取数据至上位机。乒乓结构采用512+512式,当写满上面512时发出读上面512指令,同样写满下面512发出读下面512指令,如此循环。

 错误描述:

原始程序在调试A相机的时候没问题,当挂上B相机时,数据就出现问题。数据出现丢失和重写的问题。

在排查问题的时候过于将问题集中在软件的问题上。后面经过同学的提示,忽然发现送给乒乓操作给sram地址信号线有问题。在门控信号每次拉低的时候都会指向0地址。所以数据丢失的情况是,当还没写满一次1M空间中的512K时,门控信号拉高,此时地址会站停下来,但当门控信号拉低的时候,地址会指向0,所以出现了丢失的数据的情况。数据重复读取的情况是,当写满一次1M空间中的上面的512K,但还没写满下面的512K时,此时门控信号拉高,地址停下来,但当门控信号拉低的时候,地址指向0,但会去读取下面的512k字的数,所以会多读一些数据。致使上面的问题出现。

比较好的乒乓结构操作应该如下:

cap_cnt为地址线

cap_flag是门控第一次拉低的标志信号

cap_flag_r是门控信号

trigl和trigh为乒乓操作信号

always @(posedge cap_clk)
	if(!cap_flag)
		begin
			cap_cnt<=0;
			trigh<=0;
			trigl<=0;
		end
	else
		if(cap_flag_r)begin
			if(cap_cnt<(full_flag-1'b1))
				begin
					cap_cnt<=cap_cnt+1;
					if(cap_cnt>half_flag)
						begin
							trigl<=1;
							trigh<=0;
						end
					else
						begin
							trigl<=0;
							trigh<=1;
						end
				end
			else
				begin
					cap_cnt<=0;
					trigl<=trigl;
					trigh<=trigh;
				end
		end
		else
			begin
			cap_cnt <= cap_cnt;
			trigl<=trigl;
			trigh<=trigh;
			end

抱歉!评论已关闭.