newcoder vl_44题二段式状态机刷题笔记

该文描述了一个状态机的代码实现,采用三段式方法,包括同步时序逻辑的状态转移,组合逻辑的状态判断和输出,以及在不同状态下根据输入信号data改变次态和输出flag的规则。状态机在接收到clkrst和data信号后,根据现态决定次态和输出flag的值。
摘要由CSDN通过智能技术生成

描述

题目描述:    

如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的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类型的状态机,同时要求采用三段式进行书写,第一段用时序逻辑描述状态转移变换,第二段用组合逻辑判断状态转移条件,并且描述状态转移和输出,第三段还是采用组合逻辑进行设计,描述结果输出;三段式设计更为清晰,明确;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值