程序功能描述:
板卡外部接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