做一些关于Verilog的简要笔记,方便日后快速复习,如有错漏希望您能够不吝赐教
首先从宏观去理解什么状态机,我就以原子哥的Moore状态机的框图为例讲解:
显然,由输入和当前状态的组合逻辑我们可以得到下一状态,并通过激励信号送至状态寄存器进行存储,最后由当前状态的组合逻辑产生输出。
然后我们再看看Mealy状态机:
显然它和Moore区别在于它是由当前状态以及输入的组合逻辑产生输出。
那么如何创建状态机?原子哥给了四段论。
1. 定义状态空间
状态空间的定义用parameter关键字实现,状态寄存器用reg关键字定义。
下面是用独热码定义的状态空间和相应状态寄存器。
parameter A = 4'B0001;
parameter B = 4'B0010;
parameter C = 4'B0100;
parameter D = 4'B1000; //定义ABCD四个状态
reg [3:0] current_state; //记录当前状态
reg [3:0] next_state; //记录下一状态
2. 状态跳转(时序逻辑)
首先明确,状态跳转属于时序逻辑,需要在跳变沿过程中执行跳转。那么常见的就是always语句,且需要使用非阻塞赋值。
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
current_state <= A;
else
current_state <= next_state;
end
3. 下一个状态判断(组合逻辑)
这部分相当于框图中的的第一个组合逻辑判断。
always @(*)begin
case(current_state)
A: begin
if(input == 4'B1111)
next_state = B;
else
next_state = A;
end
B: begin
...
end
C:...
D:...
default:...
endcase
end
4. 各个状态下的动作(组合逻辑)
这部分可以使用组合逻辑也可以用时序逻辑,看情况使用。
通常情况下使用的是时序逻辑,写法类似上述第三部分。
但有的时候也会使用时序逻辑,具体来说就是在定义状态寄存器的同时,也同样定义输出寄存器,然后将结果存入输出寄存器,然后。这样做有如下优势:
①有效滤去组合逻辑输出的毛刺。
②使总线数据对齐,降低失误率。
其框图如下: