Verilog HDL:FSM有限状态机设计(1)

FSM Design T1

用Verilog描述下图所示状态转移图对应的有限状态机,其中,状态右边的数值是当前状态的输出。注:S0~S3为状态机的状态名,状态机的输入信号名为IN,输出信号名为OUT,请同学们按照此命名编写Verilog代码。

T1

1. Analysis

根据图中所示Moore型状态机,可知OUT输出仅与当前状态有关,该状态机共有4个状态(S0/Dout=5、S1/Dout=8、S2/Dout=12、S3/Dout=14)。本题需要利用parameter关键字设置4个状态,端口需要包含CLK时钟、RSTN复位、IN输入、OUT输出等。本文设计的Moore FSM含有三个always过程块,分别实现状态计算逻辑、输出计算逻辑、状态转移逻辑。

2. FSM Diagram

T1

3. Port List

Port NameAttributeWidthMeaning
clockinput1 bit时钟信号
resetinput1 bit复位信号
ininput2 bits状态机输入信号IN
outoutput4 bits状态机输出信号OUT

4. Verilog Code

`timescale 1ns/1ps

module exercise1 (CLK, RST, IN, OUT);

input wire CLK;
input wire RST;
input wire [1:0] IN;
output reg [3:0] OUT;

reg [1:0] cs;
reg [1:0] ns;

parameter s0 = 2'b00;
parameter s1 = 2'b01;
parameter s2 = 2'b10;
parameter s3 = 2'b11;

always @ (posedge CLK or negedge RST) begin
	if (!RST) begin
		cs <= s0;
	end
	else begin
		cs <= ns;
	end
end

always @ (*) begin
	case (cs)
	s0: begin
		if (IN == 2'b00) begin
			ns = s0;
		end
		else begin
			ns = s1;
		end
	end
	s1: begin
		if (IN == 2'b00) begin
			ns = s1;
		end
		else begin
			ns = s2;
		end
	end
	s2: begin
		if (IN == 2'b11) begin
			ns = s0;
		end
		else begin
			ns = s3;
		end
	end
	s3: begin
		if (IN == 2'b11) begin
			ns = s3;
		end
		else begin
			ns = s0;
		end
	end
	default: ns = s0;
	endcase
end

always @ (*) begin
	case (cs)
		s0: OUT = 4'd5;
		s1: OUT = 4'd8;
		s2: OUT = 4'd12;
		s3: OUT = 4'd14;
		default: OUT = 4'd5;
	endcase
end

endmodule

5. Testbench Code

`timescale 1ns/1ps

module exercise1_test;

reg CLK;
reg RST;
reg [1:0] IN;
wire [3:0] OUT;

parameter half_cycle = 5;

parameter s0 = 2'b00;
parameter s1 = 2'b01;
parameter s2 = 2'b10;
parameter s3 = 2'b11;

exercise1 exercise1_inst (
	.CLK(CLK),
	.RST(RST),
	.IN(IN),
	.OUT(OUT)
);
	
initial begin
	CLK = 0;
	forever begin
		CLK = # half_cycle ~ CLK;
	end
end

initial begin
	RST = 1;
	# (1 * half_cycle) RST = 0;
	# (2 * half_cycle) RST = 1;
end

initial begin
	# (2 * half_cycle) IN = 2'b00;
	# (2 * half_cycle) IN = 2'b01;
	# (2 * half_cycle) IN = 2'b01;
	# (2 * half_cycle) IN = 2'b00;
	# (2 * half_cycle) IN = 2'b11;
	# (2 * half_cycle) IN = 2'b11;
	# (2 * half_cycle) IN = 2'b00;
end

initial begin
	# (50 * half_cycle) $finish;
end

initial begin
	$fsdbDumpfile("./verdiFsdb/exercise1.fsdb");
	$fsdbDumpvars(0);
end

endmodule

6. Experiment(VCS+Verdi)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值