资源描述
0101/110序列检测器仿真
1. 实验目的
熟悉Modelsim仿真软件的使用方法,了解状态机的建模方法,使用ModelSim仿真QuartusII工程。
2. 实验内容
l 用HDL语言的输入方式,实现0101/110序列检测器。
l 用modelsim进行仿真
l 下载至DE0开发板上观察实验结果
3. 代码分析(以0101序列检测器为例)
1) 状态图如下:
St0
St1
St3
St2
St0
St1
St2
0/0
1/0
0/0
1/1
1/0
0/0
0/0
1/0
0/0
0/0
1/0
1/0
1/0
0/1
图3.1 0101(左)/110(右)序列检测状态图
2) 主模块中首先定义了本次实验的所有输入输出接口及各个状态。其中,因为有4种状态,所以current为2位。
//0101 Sequential detector
module lab1a (vin,cp,ncr,vout);
input vin,cp,ncr;
output vout;
reg vout;
reg [1:0] current,next;
parameter s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;
3) 然后设置异步清零,在cp上升沿则沿触发器状态翻转。
always @(posedge cp or negedge ncr)
begin
if (~ncr)
current <= s0;
else
current <= next;
end
4) 接着编写组合逻辑部分,设定下一状态产生和输出的信号。
always @(current or vin)
begin
next=2'bxx;
case (current)
s0:begin next = (vin==1)?s0:s1; end
s1:begin next = (vin==1)?s2:s1; end
s2:begin next = (vin==1)?s0:s3; end
s3:begin next = (vin==1)?s2:s1; end
endcase
end
5) 最后为输出部分,本程序中设置让输出信号经过一个寄存器再输出,可以消除vout信号中的毛刺。
always @(posedge cp or negedge ncr)
begin
if (~ncr) vout = 1'b0;
else
begin
vout = 1'b0;
case (current)
s0,s1,s2:vout =1'b0;
s3:if (vin==1) vout = 1'b1;
else vout = 1'b0;
endcase
end
end
endmodule
6) 测试模块中同样先定义了各个变量,并将它们与主模块一一对应后进行初始化。
module test();
reg cp,clr,en;
wire q;
lab1a d (.cp(cp),
.ncr (clr),
.vin(en),
.vout(q));
initial
begin
cp = 0; clr = 0;
en = 0;
end
7) 接着设置各信号波形:clr在20个单位时间后变为1,en的数据变为有效,cp,,en则分别在每10个和16个单位时间翻转一次。在420个单位时间后仿真停止。
initial
begin
#20 clr = 1;
#400 $stop;
end
always #10 cp=~cp;
always #16 en=~en;
endmodule
4. 实验步骤
1) 打开Modelsim,出现欢迎界面
点击Jumpstart
点击Create a Project新建一个工程
设置好工程名和路径后点击OK
点击Create New File
选择文件类型为Verilog
双击文件名,写好程序后用右键单击文件,选择Compile All
成功后,文件名右边的Status会变为打钩
2) 选择Simulate => Start Simulation
选择所需的的测试文件
点击OK后如下图
点击View => Wave
在Object中添加信号
然后点击Run All开始仿真
5. 实验结果的测试和分析
0101序列检测器的仿真图形如下:
110序列检测器的仿真图形如下:
检验后结果正确。
6. 实验总结
通过这次试验,我明白了序列检测器的原理以及Modelsim的基本使用方法。
7. 参考文献
1) 源代码:
《Verilog HDL与数字ASIC设计基础》 华中科技大学出版社
展开阅读全文