现在是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?
可以用UART 或是IO引脚
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |