欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mealy Fsm----米里状态机(4种状态)

程序员文章站 2024-03-19 18:00:22
...

状态转移图:
Mealy Fsm----米里状态机(4种状态)

//米里状态机,输出与输入和当前状态有关
module ex_fsm(
		input	wire	sclk,
		input	wire	rst_n,
		output	reg		k1, 
		output	reg		k2,
		input	wire	A
);

parameter	IDIE	=	4'b0001;//显式的写出状态表达式
parameter	START	=	4'b0010;
parameter	STOP	=	4'b0100;
parameter	CLEAR	=	4'b1000;

reg		[3:0]	state;
//用独热编码,独热码用的寄存器数量多,但组合逻辑资源少
//2'b00 2'b01 2'b10 2'b11 二进制编码的寄存器数量少,但是用的组合逻辑资源多

//采用两段式
//一段描述状态机
always	@(posedge sclk or negedge rst_n)
		if(rst_n == 1'b0)
			state <= IDIE;
		else
			case(state)
				IDIE:if(A == 1'b1)
						state <= START;
							//因为是时序逻辑,不加else相当于保持
				START:if(A == 1'b0)
						state <= STOP;
				STOP:if(A == 1'b1)
						state <=  CLEAR;
				CLEAR:if(A == 1'b0)
						state <= IDIE;
				default:state <= IDIE;
			endcase
//第二段描述输出,有几个输出用几个always块描述
always @(posedge sclk or negedge rst_n)
		if(rst_n == 1'b0)
				k1 <= 1'b0;
		else if(state == IDIE && A == 1'b1)
				k1 <= 1'b0;
		else if(state == CLEAR && A == 1'b0)
				k1<=1'b1;
always @(posedge sclk or negedge rst_n)
		if(rst_n == 1'b0)
				k2 <= 1'b0;
		else if(state == CLEAR && A == 1'b0)
				k2 <= 1'b0;
		else if(state == STOP && A == 1'b1)
				k2 <= 1'b1;
endmodule
//米里状态机的Test Bench
`timescale	1ns/1ns
module tb_ex_fsm;
	reg 	sclk;
	reg		rst_n;
	wire	k1;
	wire	k2;
	reg		in_A;
	
initial begin
		sclk <= 0;
		rst_n <= 0;
		#100;
		rst_n <= 1;
		end
		
//task的调用
initial begin
		#200;//过了延时;
		in_data();
		end
always #10 sclk=~sclk;
//模块例化
ex_fsm  ex_fsm_inst(
		.sclk  	(sclk)   ,
		.rst_n 	(rst_n)  ,
		.k1  	(k1)    , 
		.k2  	(k2)    ,
		.A		(in_A)//将in_A中的数据与A关联;
);
//写一个输入变量A的任务,用于调用,也可以直接复制。
task in_data();
	integer i;
	begin
	    for(i=0;i<1024;i=i+1)
				begin
					@(posedge sclk)
					if(i<50)
						in_A <= 0;
					else if (i<200)
						in_A <= 1;
					else if (i<700)
						in_A <= 0;
					else if (i<800)
						in_A <= 1;
					else if (i<900)
						in_A <= 0;
				end
	end
endtask
endmodule