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仿真博文和相关视频):
图中在光标的位置是时钟的上升沿,此时输入信号x是1,然后依次为0、0、1、0,最后一个0是时输出信号z变为高电平,持续一个时钟周期长度,然后变为低电平。在随机数生成部分,可以使用不同的种子来生成不同序列,但仿真结果应该与此仿真图基本相似,找到自己仿真图中z为1的部分来分析输入信号,判断结果是否正确即可。如果发现了错误,首先观察状态转换是否正确,一般错误都发生在这里。
5.实验视频:
有限状态机