有限状态机的设计

Verilog HDL (第二版)数字系统设计及仿真 十一章 实验7

1.实验目的
(1)掌握有限状态机的写法。
(2)理解三段式与两段式的写法和区别。
2.实验设计语法
(1)第4章行为级建模的部分语法。
(2)第8章有限状态机的三段式写法。
3.实验内容
本实验要完成一个序列信号检测器,检测信号为10010,当检测到此序列时输出端口输出高电平,其余时间输出低电平。

尝试完成代码如下:
设计代码:

module s7(x,z,clk,reset);
input x,clk,reset;
output z;
reg z;
reg[2:0] state,nstate;

parameter s0='d0,s1='d1,s2='d2,s3='d3,s4='d4,s5='d5;

always@(posedge clk or posedge reset)
begin
    if(reset)
      state<=s0;
    else
      state<=nstate;
end

always@(state or x)
begin
        casex(state)
             s0:begin
	          if(x==1)
	              nstate=s1;
	          else
	               nstate=s0;
	          end
                      s1:begin
	           if(x==0)
	               nstate=s2;
	           else
	               nstate=s1;
	         end
	      s2:begin
	           if(x==0)
		nstate=s3;
	           else
		nstate=s1;
	           end
                     s3:begin
                          if(x==0)
                              nstate=s0;
                          else
                              nstate=s4;
                         end
	     s4:begin
	          if(x==0)			
	              nstate=s5;
	          else
		nstate=s1;
	         end
	     s5:begin
	          if(x==0)
	              nstate=s0;
	          else
		nstate=s1;
	         end
	   default:nstate=s0;
             endcase
     end
	
     always@(posedge clk)
     begin
            casex(nstate)
                  s0:z<=0;
	  s1:z<=0;
	  s2:z<=0;
	  s3:z<=0;
	  s4:z<=0;
	  s5:z<=1;
	  default:z<=0;
	         endcase
	 end

	 endmodule							 

参考代码是按照三段式的方式编写的,输出部分采用时序输出,同时检测nstate,这样状态的变化和信号的输出是同时的,也就是说电路一方面进入s5状态,另一方面输出信号变为高电平。写成其他形式也可以,只要满足语法要求就可。

测试代码:

module tbs7;
reg x,clk,reset;
wire z;
integer seed=9;

initial clk=0;
always #5 clk=~clk;

initial
begin
    reset=0;
    #15 reset=1;
    #15 reset=0;
  end

always
   #10 x={$random(seed)}%2;
s7 mys7(x,z,clk,reset);
endmodule

欲写此类mealy型有限状态机,需先画出状态转换图或写出状态转换表。其中状态转换图不利于编写代码,而状态转换表比较直观,可直接修改代码形式。检测电路的状态转换表如表11-5所示。
在这里插入图片描述
在这里插入图片描述
在表中共设置了6个状态,其中:

s0是初始状态,当复位信号生效时应该回到此状态,同时也表示没有检测到任何有效的输入信号,这样当检测到0时依然维持原有状态s0,当检测到1时进入状态s1。

s1状态表示检测到了1信号,此时如果再输入0信号,就有了“10”部分,进入s2状态;若此时输入信号是1,就检测到了11,相当于1,所以依然维持在s1状态。

s2状态表示检测到了10信号,此时输入若为0,则检测到了“100” 信号,进入s3状态;而如果输入为1,则检测到了101 信号,这是无用的部分,相当于检测到1,所以回到s1状态。

s3状态表示检测到了100 信号,此时如果继续输入0信号,则收到1000信号,无用,回到s0状态;而如果输入1值,则检测到1001,这是有用的部分,进入s4状态。

s4状态表示检测到了1001 信号,此时输入若为0,则表示检测到了10010 序列,此时进入s5状态;而如果输入信号为1,则表示检测到了10011 信号,无效,相当于1,进入s1状态。

s5状态已经检测到了10010 信号,此时相当于完成了一个检测轮回,此时输入为0则进入s0状态,输入为1则进入s1状态,继续下个序列信号的检测。

4.实验步骤
(1)在硬盘里新建一个文件夹,建议把建的文件夹和modelsim,放在同一个盘里,然后在桌面或者任意一个盘里建立一个.v文件可以把设计代码和测试代码放在一个文件里,也可以分开放。
在这里插入图片描述

(2)打开modelsim软件之后,先点击close关闭弹出窗口,然后新建一个项目设置一个工程名称,这个工程名称也可以跟模块名同名,点击OK
在这里插入图片描述
在这里插入图片描述

(3)添加现有文件,即添加我们之前已经编写好的,装有设计代码和测试代码的.v文件
在这里插入图片描述

(4)添加完成之后,直接关闭Add items to the project窗口,然后右键单击compile选择compile All,进行编译,如果后面还要添加别的.v文件进行仿真,可以右键点击Add to Project,然后添加现有文件,或者自己临时编写代码。
在这里插入图片描述

(5)可以点击Simulate,然后再点击start simulation 进行仿真,也可以直接点击右边的小图进行仿真。
在这里插入图片描述

(7)先点击sim窗口右键单击添加波形,再回到wave窗口。
在这里插入图片描述
在这里插入图片描述

(8)开始运行,得到最终结果波形图(这里我把信号调到了700)
在这里插入图片描述

实验结果仿真波形图(此处我把信号调到了700,如果不知道结果得来的过程,可看我的往期Modelsim仿真博文和相关视频):
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210619234231870.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzU0MDQ2MzAz,size_16,color_FFFFFF,t_70
图中在光标的位置是时钟的上升沿,此时输入信号x是1,然后依次为0、0、1、0,最后一个0是时输出信号z变为高电平,持续一个时钟周期长度,然后变为低电平。在随机数生成部分,可以使用不同的种子来生成不同序列,但仿真结果应该与此仿真图基本相似,找到自己仿真图中z为1的部分来分析输入信号,判断结果是否正确即可。如果发现了错误,首先观察状态转换是否正确,一般错误都发生在这里。

5.实验视频:
有限状态机

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值