描述
题目描述:
如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的0/0等表示的意思是过程中data/flag的值。
要求:
1、 必须使用对应类型的状态机
2、 使用三段式描述方法,输出判断要求要用到对现态的判断
注意rst为低电平复位
信号示意图:
波形示意图:
输入描述:
输入信号 clk rst data
类型 wire
输出描述:
输出信号 flag
类型 reg
代码段
`timescale 1ns/1ns
module fsm1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
//采用独热码定义四个参数的数据类型
localparam S0 = 4'b0001,
S1 = 4'b0010,
S2 = 4'b0100,
S3 = 4'b1000;
//reg define 设计两个状态寄存器用于存储现态和次态
reg [3:0] cur_state ; //现态
reg [3:0] next_state ; //次态
//*************code***********//
//*************************同步时序用于描述状态转移
always @ (posedge clk or negedge rst ) begin
if ( !rst) begin
cur_state <= S0 ; //初始化状态是S0
end
else begin
cur_state <= next_state ; //如果不是则将次态赋给现态
end
end
//*********************组合逻辑用于判断状态转移条件,描述状态转移和输出
always @ (*) begin
case (cur_state)
S0 : begin
if (data) begin
next_state <= S1 ;
end
else begin
next_state <= S0 ;
end
end
S1 : begin
if (data) begin
next_state <= S2;
end
else begin
next_state <= S1 ;
end
end
S2 : begin
if (data) begin
next_state <= S3;
end
else begin
next_state <= S2 ;
end
end
S3 : begin
if (data) begin
next_state <= S0;
end
else begin
next_state <= S3;
end
end
default : begin
if (data) begin
next_state <= S1 ;
end
else begin
next_state <= S0 ;
end
end
endcase
end
//根据时序电路来判断结果输出
always @ (posedge clk or negedge rst ) begin
if (!rst) begin
flag <= 1'b0 ; //初始化结果赋值为0 ;
end
case (cur_state)
S0 : flag <= 1'b0 ;
S1 : flag <= 1'b0;
S2 : flag <= 1'b0 ;
S3 : begin
if(data) begin
flag <= 1'b1 ;
end
else begin
flag <= 1'b0 ;
end
end
endcase
end
endmodule
解题心得
从题目类型上看,系统的输出和系统的次态和系统此时的输入有关系,所以从这个状态转换图可以看出,这应该是一个Melay类型的状态机,同时要求采用三段式进行书写,第一段用时序逻辑描述状态转移变换,第二段用组合逻辑判断状态转移条件,并且描述状态转移和输出,第三段还是采用组合逻辑进行设计,描述结果输出;三段式设计更为清晰,明确;