现在是MCU通过模拟总线发送数据(16位数据+RD+WR+CS)给CPLD,CPLD通过WR上升沿触发保存总线数据.同时产生一个标志给别的程序(主时钟),别的程序检测到标志后处理这个数据.
但标志变化(WR变化后的一定延迟时间)经常发生在主时钟的沿上(或附近,应该是th,ts不够),导致主时钟侧检测标志变化失败. 另外:功能仿真的时候是没问题的,通信正常,后来挂系统后发现不对,通过时序仿真也是偶尔通信失败. 程序如下: always @(posedge mpu_wr or negedge rst)begin if(!rst)begin mpu_wr_data <= 'd0; mpu_wr_di <= 1'b0; mpu_wr_ok_flag <= 1'b0; end else begin if(!mpu_cs)begin mpu_wr_data <= mpu_db_in; mpu_wr_di <= mpu_di; mpu_wr_ok_flag <= !mpu_wr_ok_flag; end else begin mpu_wr_data <= mpu_wr_data; mpu_wr_di <= mpu_wr_di; mpu_wr_ok_flag <= mpu_wr_ok_flag; end end 这个方法在时序仿真时还偶尔出现标志检测成功,但16位数据里有未知X (估计是16位数据被WR触发时在寄存器里的变化不是同时的,有前有后,有些在变化时被采样,造成出现X). 增加如下方法还是不行(用了全等:3个=号的),同时希望用主时钟打一拍形成一定的稳定时间: 这时用flag通知别的程序,设想flag和别的程序是同频同相应该没问题了. always @(posedge clk negedge rst)begin if(!rst)begin buf <= 1'b0; flag <= 1'b0; end else begin if((mpu_wr_ok_flag === 1'b1) && (buf === 1'b0))begin buf <= 1'b1; flag <= !flag; end else if((mpu_wr_ok_flag === 1'b0) && (buf === 1'b1))begin buf <= 1'b0; flag <= !flag; end else begin buf <= buf; flag <= flag; end end end
还是不行,也是主时钟对标志位和buf进行判断的时候刚好标志位变化,造成仿真波形中出现X状态. 好象按想法应该可以,我用了全等判断,如果就算本次标致变化在时钟沿上,那本次判断最多无效,下次还可以正确判断啊.结果flag直接变成X了. 请教大侠,这样的设计目的如何处理?莫非还真要用FIFO? |