本题是一道简单的FSM设计题,题中已经给出了状态转移图,只要求我们输出用于表示状态的3位2进制(y[3:1])中第2位(y[2])的次态,这里主要是记录实现该输出的两种思路,且这两种描述思路下的代码在综合时可能会得到两种不同的电路。
首先是第一种只采用一条assign语句的描述方法:
module top_module (
input [3:1] y,
input w,
output Y2);
assign Y2 = (y == 3'b000 || y == 3'b010 || y == 3'b011 || y == 3'b100) && w == 1'b0 || (y == 3'b000 || y == 3'b011) && w == 1'b1 ? 1'b0 :
(y == 3'b001 || y == 3'b101) && w == 1'b0 || (y == 3'b001 || y == 3'b010 || y == 3'b100 || y == 3'b101) && w == 1'b1 ? 1'b1 : 1'b0;
endmodule
这种方法的优点在于:不需要创建额外的寄存器表示状态,只根据两个输入就可确定输出,在描述语句的使用上达到了最简;缺点是:可能需要借助状态转移表,根据输入[3:1] y
中的y[2]
与输入w
列举输出Y2 = 1'b1
或Y2 = 1'b0
时各自输入的组合情况,且得到的逻辑表达式由于没有参数化状态名而是直接用3-bits表示状态,可读性相对较差。
第二种是将其看作给出现态描述次态逻辑转换的方法:
module top_module (
input [3:1] y,
input w,
output Y2);
localparam A = 0, B = 1, C = 2,
D = 3, E = 4, F = 5;
reg [3:1] next_state;
always @(*)
case(y)
A : next_state = w ? A : B;
B : next_state = w ? D : C;
C : next_state = w ? D : E;
D : next_state = w ? A : F;
E : next_state = w ? D : E;
F : next_state = w ? D : C;
default : next_state = A;
endcase
assign Y2 = next_state[2];
endmodule
这种方法的优点在于:在逻辑表达上更具可读性,基本上就是实现了三段式状态机中的组合逻辑次态判断部分,而输出作为次态的一部分也一目了然;缺点是:虽然现态作为输入无需寄存器表示,但是使用了额外的寄存器来表示次态,增大了电路开销。
以上两种方法,包括很多在输出部分采用组合逻辑的三段式状态机都存在一个问题:由于没有寄存器的缓冲,输出容易产生毛刺,所以在实际工作的状态机设计中,在时序允许的情况下最好在输出处加一个寄存器作为缓冲,降低不稳定信号的影响。
总结:本题虽然在实现上并没有什么困难,但不妨其成为一个很好的例子,有些更复杂的问题在本质上与这种情况是相同的,我们可能需要在逻辑描述的可读性与电路综合的复杂性之间做出取舍。
标签:吾题,次态,m2014,HDLBits,输出,next,state,b0,Y2 From: https://blog.csdn.net/shushisheng/article/details/137195783