i2c设计的时序约束问题
时间:10-02
整理:3721RD
点击:
i2c 协议规定, 在SCL为高期间,SDA的下降沿认为是start信号,
所以设计检测start 的code用:
always (negedge SDA or negedge SCL) (假定这里只有SCL=0做start的reset)
if (!SCL)start <= 0;
else start<= 1;
另外内部的一个ff,需要用这个start信号做reset(假定这里只有start做reset信号)
always (negedge SCL or posedge start)
if (start)ff1<= 0;
else ff1<= a; ...
现在的问题是,ff1的reset信号start是在scl的下降沿被清0的,而ff1本身也是在scl的
下降沿改变的,所有对ff1来说,需要保证他的reset 信号start的removal时间没有问题
。那么pt里面应该如何约束,以及如何检查removal没有问题呢?
这里应该如何约束。
1.是否需要分别针对SDA SCL各创建一个时钟,假定SCL的频率在5m, 在SCL=1期间,SD
A 从1->0 后起码50ns后,SCL才会从1->0.如果需要创建的话,应该怎么写。
如果需要分别创建时钟,应该怎么约束这两时钟间的关系? 假定以SDA做clock的时钟域
,总共就2个register: 1个是这里说的start,另外一个就是和start很类似的stop信号
(在scl为高期间,SDA的上升沿认为是stop信号,且SDA起码上升50ns后,SCL才会从1->
0),
是否需要设置 false_path?
先谢谢大家了。
所以设计检测start 的code用:
always (negedge SDA or negedge SCL) (假定这里只有SCL=0做start的reset)
if (!SCL)start <= 0;
else start<= 1;
另外内部的一个ff,需要用这个start信号做reset(假定这里只有start做reset信号)
always (negedge SCL or posedge start)
if (start)ff1<= 0;
else ff1<= a; ...
现在的问题是,ff1的reset信号start是在scl的下降沿被清0的,而ff1本身也是在scl的
下降沿改变的,所有对ff1来说,需要保证他的reset 信号start的removal时间没有问题
。那么pt里面应该如何约束,以及如何检查removal没有问题呢?
这里应该如何约束。
1.是否需要分别针对SDA SCL各创建一个时钟,假定SCL的频率在5m, 在SCL=1期间,SD
A 从1->0 后起码50ns后,SCL才会从1->0.如果需要创建的话,应该怎么写。
如果需要分别创建时钟,应该怎么约束这两时钟间的关系? 假定以SDA做clock的时钟域
,总共就2个register: 1个是这里说的start,另外一个就是和start很类似的stop信号
(在scl为高期间,SDA的上升沿认为是stop信号,且SDA起码上升50ns后,SCL才会从1->
0),
是否需要设置 false_path?
先谢谢大家了。
用一个相对高速的时钟来完成,这两个信号都不要作为时钟处理
谢谢大家的讨论!
如果可以的话,当然是用高速时钟检测最好了。但是受项目限制,不得不采用现在做法。 只能先手工检查了
I2C协议比较简单啊,学习学习。
大家很厉害。向大家学艺
学习学习
项目受限也要去想象其他方法,尽量别直接这么搞,
被别人的这么做的坑过。
thank you