HDLBits (155) — 有限状态机:启用移位寄存器
本题链接:
https://hdlbits.01xz.net/wiki/exams/review2015_fsmshift
这是一系列五个练习中的第三部分,这些练习由几个较小的电路构建一个复杂的计数器。 相关的整体设计,请参阅 the final exercise。
作为用于控制移位寄存器的 有限状态机 的一部分,我们希望能够在检测到正确的位模式时恰好启用 4 个时钟周期的移位寄存器。 我们在 Exams/review2015_fsmseq 中处理序列检测,因此有限状态机的这一部分仅处理启用 4 个周期的移位寄存器。
每当有限状态机复位时,将 shift_ena 拉高 4 个周期,然后永远为 0(直到复位)。


题目

答案

非阻塞赋值属于并行执行语句,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一个语句块中后面语句的执行。非阻塞赋值语句使用小于等于号 <= 作为赋值符。
条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号中。如果 if 条件每次执行的语句只有一条,那么可以不使用 begin 与 end 关键字。但如果是 if-if-else 的形式,即便执行语句只有一条,不使用 begin 与 end 关键字也会引起歧义。当然,编译器一般按照就近原则,使 else 与最近的一个 if(例子中第二个 if)相对应。但显然这样的写法是不规范且不安全的。所以条件语句中加入 begin 与 and 关键字就是一个很好的习惯。
case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不方便的问题。case 语句支持嵌套使用。case 语句中的条件选项表单式不必都是常量,也可以是 x 值或 z 值。当多个条件选项下需要执行相同的语句时,多个条件选项可以用逗号分开,放在同一个语句块的候选项中。但是 case 语句中的 x 或 z 的比较逻辑是不可综合的,所以一般不建议在 case 语句中使用 x 或 z 作为比较值。
同步复位是指复位信号在时钟有效边沿到来时有效。如果没有时钟,无论复位信号怎样变化,电路也不执行复位操作。
该描述代码常常会被综合成如下电路:

同步复位的优点:信号间是同步的,能滤除复位信号中的毛刺,有利于时序分析。
同步复位的缺点:大多数触发器单元是没有同步复位端的,采用同步复位会多消耗部分逻辑资源。且复位信号的宽度必须大于一个时钟周期,否则可能会漏掉复位信号。
有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具,而且也是一种思想方法,在电路设计的系统级和 RTL 级有着广泛的应用。
Verilog 中状态机主要用于同步时序逻辑的设计,能够在有限个状态之间按一定要求和规律切换时序电路的状态。状态的切换方向不但取决于各个输入值,还取决于当前所在状态。状态机可分为 2 类:Moore 状态机和 Mealy 状态机。
参考内容:
4.2 Verilog 过程赋值 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-process-assign.html
4.5 Verilog 条件语句 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-condition-statement.html
4.6 Verilog 多路分支语句 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-case.html
5.1 Verilog 复位简介 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog2-reset.html
6.3 Verilog 状态机 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-fsm.html