逻辑出身的农民工兄弟在面试时总难以避免“跨时钟域”的拷问,在诸多跨时钟域的方法里,握手是一种常见的方式,而Stream作为一种天然的握手信号,不妨看看它里面是如做跨时钟域的握手的。
StreamCCByToggle
在对吞吐要求不是特别高时,StreamCCByToggle是一个不错的选择:
作为两个时钟阵营的信号交互,StreamCCByToggle双方各自定义了一个信使:
双方握手的建立正是通过信使target,hit这种单比特信号的跨时钟域交互来进行信息的交互。基于这对信使,双方各自定义了各自的行动规则
作为信号源时钟域的gg,自身的targe信号初始值和目标时钟域mm的hit初始值相同,当有新的任务要发送给目标时钟域mm时,立即检测自身target值与目标时钟域的hit值是否相同,若相同,则表示目标mm可以接受这次任务,那么就把本次任务的内容暂存在“鹊桥”data寄存器上,等目标mm来取,同时准备接受新的任务(input。fire),否则需要等目标mm处理完之前的任务(stream.fire)。
在最后,为时序优化stream做m2spipe输出至output时钟域。
StreamCCByToggleWithoutBuffer
除了StreamCCByToggle,另一个握手处理跨时钟域的例子便是StreamCCByToggleWithoutBuffer了:
粗略一看,切莫以为只是少了一个popArea里stream.m2sPipe,这个版本效率相较于前者,略低一些:
StreamFifoCC
这个就没有什么好说的了,通过fifo来实现stream信号的跨时钟域,效率最高,资源相对也会多一些,适用于追求高吞吐的场景。
写在最后
逻辑处理里很多总线都是基于Stream这种信号来实现的(如AXI4家族),通过上面的方法,可以很容易根据应用需求,做跨时钟域的处理。
原作者:玉骐
|