求助如何理解这句SyncClk
begin
if(!iResetN)
begin
SerialDataLast<=1'b0;
end
else
begin
SyncClk<=({SerialDataLast,iSerialData}==2'b10)?1'b0:1'b1;
SerialDataLast<=iSerialData;
serialdata已经被赋给serialdatalast,怎么会出现({SerialDataLast,iSerialData}==2'b10),这样写的目的是什么?望大神赐教,感激不尽。
关键词: 求助 verilog
首先解释一下大括号的用法,大括号就是合并信号,题主中的这句{SerialDataLast,iSerialData}的意思就是将这两个信号合并起来变成一个2bit的总线的意思,其中高位为SerialDataLast,低位为iSerialData。
楼主看到这肯定要骂娘我婆婆妈妈了,稍安勿躁,且听我慢慢道来.....
首先理解一下SyncClk这个信号是什么鬼,根据程序给SyncClk赋值这句,说明了当{SerialDataLast,iSerialData}这个家伙为2'b10的时候为0,否则为1。那么{SerialDataLast,iSerialData}==2'b10是什么情况,就是当SerialDataLast为1,iSerialData为0啦,好啦这都不是重点,重点来了,楼主不理解“serialdata已经被赋给serialdatalast”这个含义,没错,是已经赋值过去了,赋值的就是当前的serialdata的值,但是这个always块块是每来一个posedge iClk的时候执行一次,也就是说在下一次执行这个always块块到SyncClk<=({SerialDataLast,iSerialData}==2'b10)?1'b0:1'b1;这句话的时候,是不是serialdatalast这个的值就是上一次posedge iClk执行的时候的iSerialData值呢?你说是不是,是不是.... 当然是啦....而iSerialData是本次iClk执行的时候的值,这样这句话实际上就是判定了这种情况,当上一个时钟的时候iSerialData为1,而现在这个时钟的时刻iSerialData为0的时候Sync的值变为0。
好了,结束了,其实就是一个同步判定iSerialData下降沿的逻辑。
BTW:如果楼主觉得这个always块块理解起来复杂,有个简答的办法快速理解,把always块块理解为C语言里面的while(1)死循环,每次执行一次就行会好理解了,当然这个当循环理解还是有条件的,入门的话这么理解会快一些。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |