概述
目录
一、状态机组成
二、状态机分类
三、状态编码方式
四、状态机的描述方式
五、范例(参考vivado-Language Template)
一、状态机组成
状态机可对具有逻辑顺序的事件进行描述,使得编码的逻辑更加清晰易懂。状态机一般包括“组合逻辑”和“时序逻辑”两部分。
组合逻辑:用于状态译码和产生输出信号;
时序逻辑:用于存储状态信息。
二、状态机分类
根据输出信号产生的方式不同,状态机一般分为两种,分别是Moore型和Mealy型。
Moore : 输出仅与当前状态有关;
Mealy : 输出不仅与当前状态有关,还与输入信号有关。
三、状态编码方式
对于状态机状态的分配方式可分为以下三种,分别为二进制编码、格雷编码和独热编码。
二进制编码
优点:使用的状态向量最少;
缺点:但状态转换时变化比特位多,易产生毛刺。
范例:parameter IDLE_WAIT = 4‘d01;
parameter DATA_TRAN = 4‘d02;
parameter DATA_CONT = 4‘d03;
parameter INFO_TRAN = 4‘d04;
格雷编码
优点:状态转换时只有1比特变化,减少了毛刺
缺点:不适用于有很多跳转状态的情况
范例:parameter IDLE_WAIT = 4‘b0001;
parameter DATA_TRAN = 4‘b0011;
parameter DATA_CONT = 4‘b0010;
parameter INFO_TRAN = 4‘b0110;
独热编码
优点:状态向量中只有1位为1,其余位都是0;状态机的速度与状态的数量无关,速度快
缺点:有多少状态就有少位的位宽,占用更多的寄存器。
范例:parameter IDLE_WAIT = 4‘b0001;
parameter DATA_TRAN = 4‘b0010;
parameter DATA_CONT = 4‘b0100;
parameter INFO_TRAN = 4‘b1000;
总结:由于独热编码可以节省和简化组合逻辑,且设计简单,修改灵活,易于综合和调试,故对于寄存器数量多而门逻辑相对较少的FPGA器件,可以使用独热编码方式对状态机的状态进行编码。
四、状态机的描述方式
状态机根据always块的数量,可分为一段式状态机、两段式状态机和三段式状态机。
一段式状态机
把组合逻辑和时序逻辑用同一个时序always块描述。
优点:其输出的是寄存器输出,无毛刺;
缺点:但这种方式会产生多余的寄存器,代码不容易修改和调试,应该尽量避免使用。
两段式状态机
大多数用于描述Mealy状态机和组合输出的Moore状态机,时序always块描述当前状态逻辑,组合逻辑always块描述次态逻辑并给输出赋值。
优点:结构清晰,综合后面积和时间性能好;
缺点:组合逻辑输出容易出现毛刺。
三段式状态机
多数用于同步Mealy状态机,两个时序always块分别用来描述现态逻辑和对输出赋值,组合always块用于产生下一状态。
优点:寄存器输出,输出无毛刺;代码较单always块清晰易懂;
缺点:占用面积较大。
五、范例(参考vivado-Language Template)
1. Moore型
parameter <state1> = 4'b0001;
parameter <state2> = 4'b0010;
parameter <state3> = 4'b0100;
parameter <state4> = 4'b1000;
reg [3:0] <state> = <state1>;
always @(posedge <clock>)
if (<reset>) begin
<state> <= <state1>;
<outputs> <= <initial_values>;
end
else
case (state)
<state1> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
<outputs> <= <values>;
end
<state2> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
<outputs> <= <values>;
end
<state3> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
<outputs> <= <values>;
end
<state4> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
<outputs> <= <values>;
end
default: begin // Fault Recovery
<state> <= <state1>;
<outputs> <= <values>;
end
endcase
2. Mealy型
parameter <state1> = 4'b0001;
parameter <state2> = 4'b0010;
parameter <state3> = 4'b0100;
parameter <state4> = 4'b1000;
reg [3:0] <state> = <state1>;
always @(posedge <clock>)
if (<reset>)
<state> <= <state1>;
else
case (state)
<state1> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
end
<state2> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
end
<state3> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
end
<state4> : begin
if (<condition>)
<state> <= <next_state>;
else if (<condition>)
<state> <= <next_state>;
else
<state> <= <next_state>;
end
endcase
assign <output1> = <logic_equation_based_on_states_and_inputs>;
assign <output2> = <logic_equation_based_on_states_and_inputs>;
参考:《无线通信FPGA设计》 田耕 徐文波 张延伟等.
vivado-Language Template
最后
以上就是光亮白云为你收集整理的Verilog状态机的分类和编码实现(含编码范例)的全部内容,希望文章能够帮你解决Verilog状态机的分类和编码实现(含编码范例)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复