目录
一、实验目的
二、实验要求
三、实验代码
1.design source文件部分代码
2.测试文件代码
四、实验结果及分析
1、引脚锁定
2、仿真波形及分析
(1)设计好序列检测器
(2)仿真波形(检测11010)
3、下载测试结果及分析(检测11011)
五、实验心得
1.关于实验设计过程中遇到的困难与解决心得
2.实验完成的心得
一、实验目的
(1)掌握序列发生和检测的工作原理;
(2)掌握时序电路中状态机的应用;
(3)掌握用Verilog语言实现复杂时序电路的设计过程。
二、实验要求
设计序列发生和检测器:
(1)先实现串行序列发生器的设计,产生序列0111010011011010;再设计检测器,若检测到串行序列11010则输出为“1”,否则输出为“0”,并对其进行仿真和硬件测试,选择实验电路验证功能;
(2)下载程序后,可通过一个led灯串行输出序列信号,另用五个led灯来观测待检测序列,当11010五个全部出现在led上时,标识位灯M亮起,说明检测到“11010” 的信号,即符合设计要求。
产生的序列和检测的序列值(仿真验收后老师现场指定11011后完成二次验收)。
发生器和检测器最好异步,以确保能检测到,可以将时钟经非门后再接入检测器。
三、实验代码
1.design source文件部分代码
(注:为了提高实验报告的美观性,在格式符合要求的情况下,我对所有的代码进行了高亮处理)
-
`timescale 1ns / 1ps module zhuangtaiji( //模块输入输出 input clk, // 时钟信号 input set, input rst_n, output reg result, output reg seq_out, // 序列输出 output reg led,//一整个序列输出后输出 output reg [7:0]STate ); reg [3:0] state; // 状态寄存器 reg [30:0]fenpin = 0; reg din_vld; // 定义各种状态 parameter S0 = 4'b0000; parameter S1 = 4'b0001; parameter S2 = 4'b0010; parameter S3 = 4'b0011; parameter S4 = 4'b0100; parameter S5 = 4'b0101; parameter S6 = 4'b0110; parameter S7 = 4'b0111; parameter S8 = 4'b1000; parameter S9 = 4'b1001; parameter S10 = 4'b1010; parameter S11 = 4'b1011; parameter S12 = 4'b1100; parameter S13 = 4'b1101; parameter S14 = 4'b1110; parameter S15 = 4'b1111; parameter ST0 = 8'b000_00000; parameter ST1 = 8'b001_00001; parameter ST2 = 8'b010_00011; parameter ST3 = 8'b011_00110; parameter ST4 = 8'b100_01101; parameter ST5 = 8'b101_11011; initial begin state<=S0; STate<=ST0; end // 下面是状态转移逻辑 always @(posedge clk) begin if(~rst_n)//异步清零 begin state<=S0; STate<=ST0; end if(set) begin //if(fenpin==50000000) begin case(state) S0: begin led <=0; state <= S1; seq_out = 1'b1; din_vld = seq_out; end S1: begin state <= S2; seq_out = 1'b1; din_vld = seq_out; end S2: begin state <= S3; seq_out = 1'b0; din_vld = seq_out; end S3: begin state <= S4; seq_out = 1'b1; din_vld = seq_out; end S4: begin state <= S5; seq_out = 1'b1; din_vld = seq_out; end S5: begin state <= S6; seq_out= 1'b0; din_vld = seq_out; end S6: begin state <= S7; seq_out = 1'b1; din_vld = seq_out; end S7: begin state <= S8; seq_out = 1'b1; din_vld = seq_out; end S8: begin state <= S9; seq_out = 1'b0; din_vld = seq_out; end S9: begin state <= S10; seq_out = 1'b1; din_vld = seq_out; end S10: begin state <= S11; seq_out = 1'b1; din_vld = seq_out; end S11: begin state <= S12; seq_out = 1'b0; din_vld = seq_out; end S12: begin state <= S13; seq_out = 1'b1; din_vld = seq_out; end S13: begin state <= S14; seq_out = 1'b1; din_vld = seq_out; end S14: begin state <= S15; seq_out = 1'b0; din_vld = seq_out; end S15: begin state <= S0; seq_out = 1'b1; led <=1; din_vld = seq_out; end endcase endmodule
2.测试文件代码
-
`timescale 1ns / 1ps module testbench(); reg clk; reg rst_n; reg set; wire result; wire led; wire seq_out; wire [7:0]STate; initial begin clk = 1'b0; rst_n = 1'b0; set = 1'b1; #100 rst_n = 1'b1; end always #10 clk = ~clk; //10MHz zhuangtaiji U( .clk(clk), .rst_n(rst_n), .set(set), .result(result), .led(led), .seq_out(seq_out), .STate(STate)); end module
四、实验结果及分析
1、引脚锁定
set_property PACKAGE_PIN R2 [get_ports set]
set_property IOSTANDARD LVCMOS33 [get_ports set]
set_property PACKAGE_PIN T1 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
set_property PACKAGE_PIN L1 [get_ports seq_out]
set_property IOSTANDARD LVCMOS33 [get_ports seq_out]
set_property PACKAGE_PIN P1 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property PACKAGE_PIN U16 [get_ports result]
set_property IOSTANDARD LVCMOS33 [get_ports result]
2、仿真波形及分析
(1)设计好序列检测器
首先要理清不同信号输入时检测器应处于的工作状态 及下一时刻的位置,故先行绘制出序列检测状态转移图
(2)仿真波形(检测11010)
如上图所示,在使能端rst_n有效后后,出现序列“11010”时,输出位result显示了检测结果,图中所截选的序列出现了三次“11010”,result都进行了输出。验证了设计的正确性。
3、下载测试结果及分析(检测11011)
由于仿真检测的序列为11010,而上板子进行实验时老师指定的序列为11011
首先展示仿真波形
很明显,使能端有效后,当seq_out序列出现11011时,输出位result为1;不仅如此,由于序列11011011011……的特殊性,在同一段序列中,待检测序列会相隔很近的出现两次。观察波形可知,程序对两次检测序列都完成了检测和输出。
开发板实验结果:
第一个led灯显示序列,亮灯为1,熄灭为0;中间五个连续的led等表示的是测试序列的五个连续数字,最后一个led表示若检测到待检测序列,则进行输出。
如图,五个序列显示的是待检测序列11011,输出位亮灯,功能设计成功!
五、实验心得
1.关于实验设计过程中遇到的困难与解决心得
(1)序列检测器不能连续检测“11011”。
解决方法:观察仿真结果,发现是因为每次成功检测完序列后检测器直接清零了,回看程序,是因为没有对检测完“11011”序列后的状态转移做出设计,只要补上这一段程序,并且正确转移状态,就可以连续检测序列并成功输出。
(2)检测成功的信号不能与 11011 的序列同时输出。
解决方法:与原序列相比较不能同时输出,所以设计序列 s,比原序列晚一个时钟信号输入序列,就可以转换为并行输出。在仿真结果中将 s 与 m 放在一起,容易观察结果。
2.实验完成的心得
本次实验接触到了一个新的内容——状态机的设计。理解状态机的转换,用状态机设计序列检测器,原理清晰设计具有条理,是一种很棒的设计方法,而且对状态转移图的绘制也十分有趣。除了一些代码设计上的问题,功能实现方面遇到的困难就是上述的两点,好在最后也得到了解决,也理解了这块内容为何如此设计。与直白的语言描述相比,一些附有技巧性的程序设计不仅大大缩短了代码长度,还能更好地完成目标功能,每次看见崭新的程序写法,都觉得自己学习的路途仍旧遥远。每一次实验的完成,都是一段新的学习旅程。之后的实验应该越来越复杂,涉及到的内容及功能实现也越来越多,但我们应仍保持最初的热情,勇于接受挑战、学习知识。
总之,状态机的设计实验是一项非常重要的电路设计实践项目,在这个实验中,我深刻地认识到了状态机对于硬件电路设计中的重要性,并且也加深了我对Verilog HDL编程语言的理解。