求助如何理解这句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)死循环,每次执行一次就行会好理解了,当然这个当循环理解还是有条件的,入门的话这么理解会快一些。
回复
有奖活动 | |
---|---|
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? | |
抽奖了,抽奖了,金升阳医疗电源 |
打赏帖 | |
---|---|
【换取手持数字示波器】+与同事对定时器输出相位可调PWM移相全桥控制分享被打赏50分 | |
【换取手持数字示波器】+LP-MSPM0L1306开发板试用体验+串口被打赏40分 | |
CC-RL编译器相关问题求助被打赏10分 | |
【换取手持数字示波器】+与同事对ESP-12开发调试经验分享被打赏50分 | |
【换取手持数字示波器】+同事tek示波器调试spi解析被打赏50分 | |
【换取手持数字示波器】+2.6寸墨水屏调试经验被打赏50分 | |
换取手持数字示波器+个人开关电源的设计经验被打赏50分 | |
【换取手持数字示波器】+【APT32F173测评】+URAT被打赏20分 | |
【换取手持数字示波器】CH32X035的定时器以及外部中断体验被打赏50分 | |
【换取手持数字示波器】CH32X035搭建开发环境(RISC-V)被打赏50分 |