考虑一个用于控制某种电机的有限状态机。 FSM 有输入 x 和 y 来自电机,并产生输出 f 和 g 来控制电机。 还有一个称为 clk 的复位输入 resetn 。
FSM 必须按如下方式工作。 只要复位输入被置位,FSM 就停留在 开始状态,称为状态 A 。 当复位信号被置低时,则在下一个时钟之后 边沿 FSM 必须将输出 f 为 1 持续一个时钟周期。 然后 ,FSM 必须监控 x 输入。 当 x 在三个连续的时钟周期中产生值 1、0、1 时, g 应该 在下一个时钟周期设置为 1。 在保持 g = 1 的同时,FSM 必须监控 y 输入。 如果 y 在最多两个时钟周期内为 1,则 FSM 应保持 g = 1 永久(即,直到重置)。 但是如果 y 在两个时钟周期内没有变为 1,那么 FSM 应永久设置 g = 0(直到复位)。
(最初的考试问题只要求提供状态图。但在这里,实现 FSM。)
module top_module (
input clk,
input resetn, // active-low synchronous reset
input x,
input y,
output f,
output g
);
parameter A=0,B=1,C=2,D=3,E=4,F=5,G=6,H=7,I=8;
reg [3:0]state,nstate ;
always@(posedge clk )
if(~resetn)
state<=A;
else
state<=nstate;
always@(*)
case(state)
A:nstate=B;
B:nstate=C;
C:nstate=x?D:C;
D:nstate=x?D:E;
E:nstate=x?F:C;
F:nstate=y?H:G;
G:nstate=y?H:I;
H:nstate=H;
I:nstate=I;
endcase
assign f=(state==B);
assign g=(state==F||state==G||state==H);
endmodule
浙公网安备 33010602011771号