一、阻塞和非阻塞赋值在行为和使用上的差异性:
1.行为差异
阻塞赋值:
- 阻塞赋值语句会按顺序依次执行,在一条阻塞赋值语句执行完毕后,才会执行下一条语句;
- 一旦执行阻塞赋值语句,变量的值会立即更新。例如在always块中,使用阻塞赋值时,变量会在赋值语句执行后马上得到新值。
非阻塞赋值:
- 非阻塞赋值语句在仿真的同一个时间步 内,会在所有阻塞赋值语句执行完之后,同时进行赋值操作。
- 变量的值不会立即更新。而是在当前时间步结束时统一更新。
2.使用差异
阻塞赋值:
- 阻塞赋值常用于组合逻辑的建模,因为组合逻辑的输出只取决于当前的输入,使用阻塞赋值可以清晰地描述逻辑的顺序执行过程。
- 当需要实现一些简单的顺序操作,如临时变量的计算和传递时,阻塞赋值是一个合适的选择。
非阻塞赋值:
- 非阻塞赋值是时序逻辑建模的首选方式,因为时序逻辑的输出不仅取决于当前的输入,还与时钟信号和寄存器的状态有关。使用非阻塞赋值可以避免竞争冒险问题,确保寄存器的值在一个时钟周期内只更新一次。
- 在需要同时更新多个寄存器的值时,非阻塞赋值可以保证所有寄存器的值在同一个时间步内同时更新,避免出现数据不一致的问题。
阻塞赋值顺序执行,类似于软件;非阻塞赋值并行执行,更接近真实硬件。
二、verilog仿真时信号出现x态的原因:
- 未初始化
- 多驱动
- 不完整的条件分支覆盖
- 时序违例,如不满足建立保持时间等
1、含清零功能的三人抢答器设计
设计要求:控制信号为启动信号,三个输入端口编号为01、02、03。高电平有效。启动信号无效,输出端口输出数值为0;启动信号有效后,输出为最快有效的输入端口编号。
一种可能的实现方式如下:


仿真结果如下,正确实现了抢答器功能:

2、四位并串转换器设计
设计要求:使用 Verilog语言描述一个4位并串转换器,4位并行输入,1位输出、输出位置通过选通信号sel设置为最高位或最低位。
这里使用状态机来实现(方法不唯一),定义三个状态:IDLE、LOAD与CONVERT,其中处于LOAD状态时载入并行数据,在CONVERT状态进行并串转换:

状态转移组合逻辑如下,当检测到load信号时进入LOAD状态,载入结束后load拉低则开始数据转换,当计数达到4时停止转换,进入IDLE状态:

数据输出时序逻辑如下,在LOAD状态锁存数据data_in,在CONVERT状态,sel为1将数据右移输出,为0则左移输出,同时bit_cnt递增:

仿真结果如下,可以看到CONVERT状态共持续了四个周期,在shift_reg有效的下一个周期开始输出数据,对于输入数据data_in=4'b0101,在sel为1时串行输出1、0、1、0,在sel为0时串行输出0、1、0、1,正确实现了功能:

3、占空比可调的脉宽发生器设计
设计要求:占空比分别为1:2,1:3,2:3,3:2和 1:1。
一种实现方式如下:



仿真结果如下,正确实现功能:

4、占空比变化的时钟信号生成
实验要求:使用verilog语言编写测试模块的时钟信号,在确定频率下,每10个时钟周期为一个循环,第一周期提供一个占空比(高电平占一个时钟周期的比例)1:1的clk信号,第二个周期提供一个占空比1:2的clk信号,依次类推,第十个周期提供一个占空比1:9的clk信号。
类比【3】的实现方式,可以给出激励如下:

仿真结果如下,正确实现时钟信号输出。
