<1>完整状态机代码
parameter的语法:
parameter定义常量,可以定义在模块内部或外部;常用于定义位宽或时间延迟(易变),定义方式为: parameter 标识符 = (位宽)常数;// 位宽默认为32位,如果指定位宽则以指定值为准
module FSM_State_machine(clk,rest,OUT,x);
output OUT;
input clk,rest,x;
reg[3:0] state,next_state;
parameter s0=3'b000,s1=3'b001,
s2=3'b010,s3=3'b011;
//将次态赋给现态
always@(posedge clk or posedge rest)
begin
if(rest)
begin
state<=s0;
end
else
state<=next_state;
end
//根据现态和序列输入判断下一个状态
//状态机部分
always@(state,rest)
begin
if(rest)
begin
next_state=0;
end
else
case(state)
s0:
begin
if(x)
next_state<=s1;
else next_state<=s0;
end
s1:
begin
if(x)
next_state<=s2;
else
next_state<=s0;
end
s2:
begin
if(x)
next_state<=s3;
else
next_state<=s0;
end
s3:
begin
if(x)
next_state<=s3;
else
next_state<=s0;
end
default:
begin
next_state<=s0;
end
endcase
end
assign OUT=(state==s3)?1:0;
endmodule
<2>状态转换图:
手绘:
Quartus
需要了解有关特定序列的产生以及状态机实现特定序列检测的读者可参考博客:【FPGA实现:特定序列生成,特定子序列检测以及子序列出现次数数码管显示的方法及应用 - CSDN App】http://t.csdnimg.cn/5dzN3