HDLbits 刷题记录 3.2.1 Latches and Flip-Flops(下)
3.2.1 Latches and Flip-Flops
3.2.1.12 D flip-flop
写一个top_module,包含选择器和触发器

3.2.1.13 DFFs and gate

由于最终输出Z 不受时钟信号clk的影响,所以Z的赋值不应该放在always块中
assign赋值,一旦q1,q2或q3发生变化,输出Z就发生变化
3.2.1.14 Create circuit from truth table
仅用d型触发器和门实现JK触发器。注:Qold是时钟上升沿前的D触发器的输出。

3.2.1.15 Detect and edge

当监测到输入信号in有一个上升沿时,输出pedge输出1,否则输出0
这里我用了两个D触发器,tmp用来存储前一个变化状态
只有在前一个变化状态为0,in的当前状态为1的时候,输出pedge才是1
反之,若检测下降沿,只需要将pedge <= (~tmp) & in改成pedge <= tmp & (~in)即可
前一个状态为1,in的当前状态为`0,即为下降沿
3.2.1.16 Detect both edges

判断是否 上升沿或者下降沿
对上一个状态和现状图亦或,若不同,则in发生跳变
3.2.1.17 Edge capture register
当监测到输入信号`in`从高电平跳变的低电平时,输出信号`out`会在下一个时钟上升沿输出`in`前一个状态,并一直保持,直到复位信号`reset`有效时(高电平有效),才能将输出信号`out`置为低电平

监测到时钟上升沿时,先将`in`赋值给`tmp`,如果在`if-else`语句中,对`tmp`赋值,会出现时序错误
3.2.1.18 Dual-edge triggered flip-flop
实现双边沿触发器
