【HDLBits:在线学习Verilog】Problem 22: Three modules(Module shift)用ModelSim仿真实现

题目:

ScreenShot_20260615_192156956

【my_dff01.v】

特别地,要求把每一个D触发器的输出q都引出来,利用波形查看规律

需要注意的:

1.在第一个模块定义单个D触发器时用【output reg q】,作为触发器输出,通常需要定义为 reg

2.在第二个模块定义3个D触发器连在一起用时只用单独适用【output q1,q2,q】就可以

3.重点理解【q <= d】,在时钟沿到来的瞬间,把 d 的值采样下来,准备赋给 q,但 q 的实际更新会稍微延迟一点点(或者理解为并行发生)

ScreenShot_20260615_192305783

 【my_dfftest01.v】

1. 声明激励信号 (Reg类型用于驱动输入) reg clk; reg d;

2. 声明观测信号 (Wire类型用于接收输出) wire q;

ScreenShot_20260615_192738586

 【输出波形】

ScreenShot_20260615_192941241

【波形初始情况1】

第0ns初始化时钟为0,设置时钟每5ns翻转一次

第0~20ns保持d均为0

【波形分析1】

第0ns:时钟(0),d(0),q1(未知),q2(未知),q(未知)

第5ns:时钟(上升沿),d(0),q1(0,此刻d的值赋给q1,q1由未知变为0),q2(未知,此刻q1的值赋给q2,q2由未知变未知),q(未知,此刻q2的值赋给q,q由未知变未知)

第10ns:时钟(下降沿),d(0),q1(0),q2(未知),q(未知)

第15ns:时钟(上升沿),d(0),q1(0,此刻d的值赋给q1,q1由0变为0),q2(0,此刻q1的值赋给q2,q2由未知变0),q(未知,此刻q2的值赋给q,q由未知变未知)

第20~30ns:d=1

第20ns:时钟(下降沿),d(1,由0变为1),q1(0),q2(0),q(未知)

第25ns:时钟(上升沿),d(1),q1(1,此刻d的值赋给q1,q1由0变为1),q2(0,此刻q1的值赋给q2,q2由0变为0),q(0,此刻q2的值赋给q,q由未知变为0)

第30ns:时钟(下降沿),d(0,由1变为0),q1(1),q2(0),q(0)

第30~40ns:d=0

第35ns:时钟(上升沿),d(0),q1(0,此刻d的值赋给q1,q1由1变为0),q2(1,此刻q1的值赋给q2,q2由0变为1),q(0,此刻q2的值赋给q,q由0变为0)

第40ns:时钟(下降沿),d(1,由0变为1),q1(0),q2(1),q(0)

第40~50ns:d=1

第45ns:时钟(上升沿),d(1),q1(1,此刻d的值赋给q1,q1由0变为1),q2(0,此刻q1的值赋给q2,q2由1变为0),q(1,此刻q2的值赋给q,q由0变为1)

第45ns真正的输出q终于输出1了,这个变化来自第20ns的d由0变为1

posted @ 2026-06-16 09:25  整点薯条拯救一切  阅读(7)  评论(0)    收藏  举报