首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教MCU怎么和CPLD可靠交换数据

请教MCU怎么和CPLD可靠交换数据


现在是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引脚

真诚让沟通更简单! QQ:767914192
返回列表