一、实验目的
1、掌握有限状态机的设计方法和注意事项;
2、基于Verilog HDL语言应用状态机设计完成一个序列检测模块的设计。
二、实验内容
基于Verilog HDL语言应用状态机设计完成一个序列检测模块的设计。
三、实验原理
时序逻辑电路的设计核心在于如何在时钟控制下完成多种状态变化,由数字电路的知识可知,时序电路的变化会遵循状态转换图,把状态转换图变为代码模块就可以编写成有限状态机,所以要把时序电路设计得清楚明白,有限状态机的设计是一个基本功。
有限状态机适合设计程序复杂但具有一定规律的逻辑结构,有限状态机也常被缩写为FSM(Finite State Machine)。在使用有限状态机进行电路设计时,设计者要先根据所设计的电路情况画好状态转换图,确认每个状态的输入/输出转换关系,然后依照状态机来编写代码。
本实验应用状态机设计完成一个序列检测模块。在通信过程中,经常需要检测某段固定的信号值,作为通信的某种状态标志,例如检测一个串行输入信号,当检测到输入信号出现“101011”时,输出一个触发信号,表示检测到了序列信号。参考状态转换图如下所示。

四、实验设备与器件
安装QuartusII软件的PC机
五、实验步骤
1、设计编写功能模块
File→New →Verilog HDL file→输入编写好的程序→另存为→选择存储路径(注意路径不要含有中文)


图1 File→New →Verilog HDL file建立新程序编写文件

图2 输入编写好的程序


图3 另存为→选择存储路径(注意路径不要含有中文,文件名一定要与模块名一致)
参考程序:
module ex8_3(clock,reset,x,z);
input clock,reset;
input x;
output z;
reg z;
reg[3:0] cstate,nstate;
parameter s0=4'd0,s1=4'd1,
s2=4'd2,s3=4'd3,
s4=4'd4,s5=4'd5,
s6=4'd6;
always @(posedge clock or posedge reset)
begin
if(reset)
cstate<=s0;
else
cstate<=nstate;
end
always @(cstate or x)
begin
case(cstate)
s0:begin
if(x==1) //start
nstate=s1;
else
nstate=s0;
end
s1:begin //收到1
if(x==0)
nstate=s2;
else
nstate=s1;
end
s2:begin //收到10
if(x==1)
nstate=s3;
else
nstate=s0;
end
s3:begin //收到101
if(x==0)
nstate=s4;
else
nstate=s1;
end
s4:begin //收到1010
if(x==1)
nstate=s5;
else
nstate=s0;
end
s5:begin //收到10101
if(x==1)
nstate=s6;
else
nstate=s4;
end
s6:begin //收到101011
if(x==0)
nstate=s0;
else
nstate=s1;
end
default:nstate=s0;
endcase
end
always @(nstate)
if(nstate==s6)
z=1;
else
z=0;
endmodule
2、建工程文件
保存后弹出对话框”Do you want to create a new project with this file” →点击“是”→Next→设置路径、项目及顶层模块名称→Next→在弹出的对话框中单击File栏后的按钮,将编写好的Verilog程序加入此工程→Next→选择目标芯片(例:CycloneⅢ系列→Ep3C55F4884C8)→Next→EDA工具设置窗口→Next→finish


图4 建立本设计项目工程文件→next项目工程信息→next


图5 设置路径、项目及顶层模块名称→Next 图6 单击File栏后的…按钮,添加Verilog程序→Next


图7 点击add按键将add.v文件添加入下面对话框中→Next



图8 选择目标芯片→Next→EDA工具设置窗口→Next→finish
3、编译验证(验证程序编写是否有错误)

图9 点击编译按键进行编译
4、功能仿真File→New →vector waveform file→保存

图10 点击File→New →vector waveform file→保存,建立波形仿真文件

图11 双击Name下方空白处弹出Insert Node or Bus对话框,点击Node Finder…


图12 点击List加载模块输入输出引脚→OK

图13 点击OK→添加输入信号信息
5、添加输入信号信息


图14 点击左侧工具栏添加输入信号信息


图15 点击Assignments→Settings…→将Timing改成Functional


图15 点击Processing→Generate Functional Simulation Netlist→网表文件生成成功

图16 点击波形仿真按钮进行仿真
6、产生功能波形(参考波形如下)