序列检测器设计-modelsim-verilog-实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四-序列检测
一、实验目的:
1.实验目的:通过学习硬件编程语言,掌握一般时序逻辑分析的方法。
2.学会使用Verilog语言编写实现任意序列检测。
3.学会使用Verilog编写测试文件testbech的方法并在Modelsim中实现时序仿真。
二、实验设备
1.PC机一台
2.Modelsim软件
三、实验内容:
序列检测器是能够与从二进制码流中检测出一组特定序列的信号的时序电路。通过接受的序列号与检测其预设值比较,当检测到输入信号匹配时,输出响应的指示。
设计序列检测器,要求能够识别序列“10010”。din为数字码流的输入,z是检测标记的输出,高电平表示“发现指定序列”,低电平表示“没有发现指定的序列”。
1.打开Modelsim软件,切换目录至常用位置,这里选择D:\seqdet。(注,在D:\seqdet 目录下一保存有序列检测文件seqdet.v和测试文件seqdet_tb.v,源程序在附录里)
2.然后新建工程,File ->New->Project,建立工程工程为seqdet,设置如下,并在接下来的步骤中添加序列检测文件seqdet.v和测试文件seqdet_tb.v。
4.编译文件
编译无误后,进行仿真
5.文件仿真
在弹出的窗口中选择Design->work->seqdet_tb,默认选中优化选项。选择OK
6.添加信号到wave视图中。在仿真状态下,切换到左侧导航窗口到object视图下,添加信号T,clk,rst,x,z,q到wave窗口中,
添加完成后如图所示:
7.运行仿真至1000ns,,波形图显示如图所示:
8.结果分析:对上述图形分析如下,
用蓝色表示的为第一次检测到匹配序列“10010”,黄色表示为第二次匹配序列,紫色表示为
第三次匹配序列。z分别在这三处匹配时输出高电平,其他为低电平,实现了序列检测的功能。
四,程序:
①源程序模块seqdet.v :
module seqdet
(
input wire x, //信号输入
input wire clk, //时钟信号
input wire rst,
output wire z,
output reg [4:0] q //序列输出
);
wire [4:0] q_next;
assign q_next ={q[3:0],x};
assign z = (q_next== 5'b10010) ? 1'b1:1'b0;
always @ (posedge clk,negedge rst)
if(!rst)
q <= 5'd0;
else
q <= q_next;
endmodule
②测试程序模块seqdet_tb.v
`timescale 1ns/1ns
module seqdet_tb;
localparam T =20;
reg clk,rst;
reg [23:0] data;
wire z,x;
wire [4:0] q;
assign x = data[23];
initial
begin
clk =0;
rst =1;
#2 rst =0;
#30 rst =1;
data =20'b1100_1001_0000_1001_0100;
#(T*1000) $stop;
end
always #T clk = ~clk;
always @ (posedge clk)
#2 data = {data[22:0],data[23]};
seqdet U1
(
.x(x),
.z(z),
.clk(clk),
.q(q),
.rst(rst)
);
endmodule
五、实验总结:
通过本次实验,对Verilog硬件描述语言有了进一步认识,学会编写verilog语言的文本设计方法,并学会编写testbench测试程序。初步掌握了使用Modelsim软件进行仿真调试的方法。使用移位寄存器进行序列检测,与使用状态机相比更方便,便于拓展。