关于一个异步电路的问题
这个TIMER1的工作时钟和主频肯定不是同一个,但是MCU工作时可以读也可以写TIMER1的寄存器,MCU当然是靠主频工作的。
那这个时候就会出现异步电路的问题,处理不好就会出现亚稳态,并且我读这个寄存器的话是送到ALU的,在一个指令周期内是不允许TIMER1的寄存器变化。所以我想着用两级寄存器(主频控制)对寄存器的内容打两拍然后送到ALU,这就应该没问题。
可是我还需要写TIMER1这个寄存器,又是异步,且是快频到慢频,谁能有一个比较简单的实现方法,本人已经黔驴技穷了。
先谢谢大家!
很多开源的设计,你可以去看看啊
这个难度大吧
谢谢你,很多关于异步电路设计的开源设计吗,能说个具体点的吗,我去搜下。
多位数据不能靠打两拍
能说下为什么吗?我现在考虑的就是多位数据打两拍,其他的办法我实在想不到啊。能指点下吗?
非常感谢。
TIMER1的工作时钟和主频虽然频率不一样
但可以做到同源,这样相位固定就避免了异步问题
慢时钟域到快时钟域可以打两拍,反之则不行。cpu读取timer寄存器应该使用使能来完成的,你可以用timer的计数器作为使能试一下。
没法做到同源,它有一个同步机制,但是在sleep模式时就没有内部时钟了,更不用说同源了。
能具体说下嘛,使能是什么意思,这个使能是谁产生的,主时钟?那它去使能timer又会产生异步的问题。timer时钟?那它跟主时钟也是异步问题。唉,一大堆疑问啊。呵呵
利用你timer的预设值作为cpu时钟的使能
设cpu的时钟域为tc,timer的时钟域为tt。
cpu读的时候,把读信号同步到tt域,当timer检测到读请求的时候,把timer值保存到一个寄存器里面,同时产生ready信号,把ready信号同步到tc域作为cpu的data ready信号。
cpu写timer的时候,把写数据先存在寄存器里面,同时把写信号同步到tt域,当timer检测到写信号时此时写数据一定是稳定的。
多bit数据的跨时钟域传递的方法有三种,异步fifo,格雷码(有局限性)和握手协议。
谢谢你,可是这个同步没这么简单,我的TIMER1时钟不知道什么时候来,因为他异步时工作在计数模式,要用它去同步内部时钟怎么同步呢。还有,我这个时钟周期送读信号,下个周期或隔一个周期我就要读过来,但是如果外边一直没有脉冲来的话怎么同步啊。
谢谢你,可是我还是不懂,预设值是16位数,如何做使能呢,麻烦你再说的清楚些,谢谢了。
慢速往快速传输可以用握手协议来保证确定的传送。
如果是固定复位值的计数器(比如时钟)可以考虑格雷码计数器。
如果计数器的时钟很慢,可以用一个t触发器来标志时钟沿(每个时钟沿到来状态反转),然后把t触发器的状态同步到cpu时钟域用异或逻辑做时钟沿检测,在检测到状态变化的那个时钟周期是不能做读操作的(有读操作延迟一拍送出数据)。cpu的时钟频率至少是timer时钟的四倍以上。
学习了
打两拍消除单个位的亚稳态是可以的,关键是快速时钟域多个位不是同时变化的,如果采样正好碰在数据变化的时刻,打两拍后的数据可能某些位会出错。
怎么做要照设计要求来了,比如慢时钟域先发个握手信号,快时钟将这个握手信号同步为快时钟域的一个脉冲,快时钟根据同步后的握手信号把当前计数值送到慢时钟要读的寄存器上,这里寄存器是快时钟控制的,cpu去读就行了。这是个笨办法啦,就是说cpu读快时钟域这个寄存器时,寄存器一定是静止的,缺点是读出的数值有延时。
个人之见了,参考请慎重
其实就是一个使能信号和多位数据的异步传输问题。
谢谢,你的意思我懂了,可是我是快时钟域读慢时钟域,还会出现各个位不一样的情形吗?
我们现在初步定的结果就是用快时钟将慢时钟域数据打两拍后再读。
有的了,快读慢的话,你可以参考一些RTC源代码怎么做的,在带RTC的mcu里,RTC工作在32k下,cpu一般比较快,是有同步机制的
谢谢,我搜下,是从opencores下载吗?
非常感谢。
如果慢时钟很慢,而快时钟很快,比如5~10倍甚至以上的关系。那么可以把慢时钟的ACK,经过快时钟打两排,甚至更多拍(5拍),然后快时钟直接采样慢时钟的数据。这种做法比较奇特。但是基本的思想是,假定所有慢速时钟到快速时钟,跨越时钟的数据总线,在快速时钟采样到慢速时钟过来的ACK之后的一段时间(比如5拍)之后,数据已经稳定不变一段时间了,这样可以保证快速时钟准确无误的采样数据。
虽然这种做法比较奇特,但是也是可行的,而且节约一些资源,不过后端要约束好数据总线的延迟和jitter。
可是快不了那么多的。谢谢你的回答。
"快时钟根据同步后的握手信号把当前计数值送到慢时钟要读的寄存器上,这里寄存器是快时钟控制的"这句话有点乱,你说的是读还是写timer哦
