数字ic手撕代码-边沿检测(上升沿、下降沿、双边沿)
大家好我是酸菜鱼,这个系列着重讲解数字ic或FPGA实习面试及秋招面试的高频手撕代码题。
往期专栏:
数字IC手撕代码-分频器(任意偶数分频) - 哔哩哔哩 (bilibili.com)
数字IC手撕代码-分频器(任意奇数分频) - 哔哩哔哩 (bilibili.com)
数字IC手撕代码-分频器(任意小数分频) - 哔哩哔哩 (bilibili.com)
数字IC手撕代码-序列检测(状态机写法) - 哔哩哔哩 (bilibili.com)
数字IC手撕代码-序列检测(移位寄存器写法) - 哔哩哔哩 (bilibili.com)
边沿检测
在使用FIFO进行数据读写的时候,我们会用到边沿检测,比如当FIFO内的数据被读空了,这样 empty 信号就会从0→1,产生一个上升沿,当这个上升沿到来的时候代表FIFO内孔,我们就可以对FIFO进行一个写操作(把写使能拉高,往FIFO写数据),所以边沿检测是十分常用的东西,下面我们来讲讲边沿检测的原理、代码以及对应仿真。
原理:
比如我们要检测信号 signal 的上升沿,我们使用两个寄存器,级联记录 signal 的值,这样由于寄存器延迟一拍的特性,第二个寄存器永远会延迟第一个寄存器。
当 signal 上升沿到来时,会有:第一个寄存器检测为高,第二个寄存器检测为低。

这样,我们只要把第二个寄存器取反,然后和第一个寄存器做与运算,这样当计算的数值为 1 时,就检测到了上升边沿。
代码:

Testbench:

上升边沿 边沿检测波形:

从图中我们可以看到,跟我们预料的一样,当上升沿到来的时候,reg1和 reg2 信号错一拍,这样利用这个特性,让signal_edge = ~reg2 & reg1 就能检测到上升边沿。
检测下降沿也是一个道理,代码完全一致,就是把最后边沿检测信号改为:
assign signal_edge = ~reg1 & reg2;
下降边沿 边沿检测波形:

双边沿 边沿检测波形:
双边沿检测,就是上升沿和下降沿,检测信号都要输出一次高电平。这我们可以用异或实现,同样是只需要在上升沿检测的代码里改最后一条赋值语句即可,改为:
assign signal_edge = reg1 ^reg2 ;
波形如下:

结果和我们设计的一致。