当前位置:文档之家› 实验三_用状态机实现序列检测器的设计1

实验三_用状态机实现序列检测器的设计1

西南科技大学实验报告FPGA现代数字系统设计实验题目:用状态机实现序列检测器的设计专业班级:对抗0802班学生姓名:龙钱梅学生学号:20080877实验时间:4个小时指导教师:刘桂华实验三用状态机实现序列检测器的设计一、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。

二、原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出a,否则输出b。

由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。

在检测过程中,任何一位不相等都将回到初始状态重新开始检测。

例3-1描述的电路完成对序列数"11100101"的。

当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“a”,否则仍然输出“b”。

三、实验内容:1. 编写由两个主控进程构成的有限状态机。

画出状态图,并给出其仿真测试波形;第一个主控进程schk程序:module schk(DIN,CLK,CLR,AB);input DIN,CLK,CLR;output[3:0] AB;reg [7:0] Q;reg [3:0] AB;parameteridle = 8'b00000000,a = 8'b00000001,b = 8'b00000010,c = 8'b00000100,d = 8'b00001000,e = 8'b00010000,f = 8'b00100000,g = 8'b01000000,h = 8'b10000000;parameter data=8’b11100101;always @(posedge CLK or negedge CLR)if(!CLR)beginQ <= idle;endelsebegincase(Q)idle:beginif(DIN==data[7]) Q<=a;else Q<=idle;enda:beginif(DIN== data[6]) Q<=b;else Q<=idle;endb:beginif(DIN== data[5]) Q<=c;else Q<=idle;endc:beginif(DIN== data[4]) Q<=d;else Q<=idle;endd:beginif(DIN== data[3]) Q<=e;else Q<=idle;ende:beginif(DIN== data[2]) Q<=f;else Q<=idle;endf:beginif(DIN== data[1]) Q<=g;else Q<=idle;endg:beginif(DIN== data[0]) Q<=h;else Q<=idle;enddefault :Q<=idle;endcaseendalways @(Q)beginif(Q==h) AB <= 4'b1010 ;else AB <= 4'b1011 ;endendmoduleschk波行:功能仿真:时间仿真:第一个主控进程xulie程序: module xulie(clk, din8, reset, din); input clk;input[7:0] din8;input reset;output din;parameters0 = 3'b000,s1 = 3'b001,s2 = 3'b010,s3 = 3'b011,s4 = 3'b100,s5 = 3'b101,s6 = 3'b110,s7 = 3'b111;reg[2:0] cur_state,next_state;reg din;always @ (posedge clk or negedge reset) if(!reset)cur_state <= s0;elsecur_state <= next_state; always @ (cur_state or din8 or din ) begincase (cur_state)s0 : begindin <= din8[7];next_state <= s1;ends1 : begindin <= din8[6];next_state <= s2;ends2 : begindin <= din8[5];next_state <= s3;ends3 : begindin <= din8[4];next_state <= s4;ends4 : begindin <= din8[3];next_state <= s5;ends5 : begindin <= din8[2];next_state <= s6;ends6 : begindin <= din8[1];next_state <= s7;ends7 : begindin <= din8[0];next_state <= s0;enddefault : begindin <= 1'b0;next_state <= s0;endendcaseendendmodulexulie波形:xulie功能仿真:xulie时间仿真:2. 自己编写数码管显示程序(decl7s.v)来显示A或B状态。

已知数码管为共阳级连接。

输入(4bits)输出(7bits)显示内容4’b1010 7’b 0001000 a4’b1011 7’b 0000011 b4’b0000 7’b1000000 0decl7s程序:module decl7s(AB,LED7S);input [3:0] AB;output [6:0] LED7S;reg [6:0] LED7S;always @(AB)beginLED7S={7{1'b0}};case (AB)4'b1010:LED7S[6:0] = 7'b0001000;4'b1011:LED7S[6:0] = 7'b0000011;4'b0000:LED7S[6:0] = 7'b1000000;default:LED7S[6:0] = {7{1'b0}};endcaseendendmoduledecl7s波形:功能仿真:时间仿真3. 利用QuartusII对文本编辑输入、仿真测试并给出仿真波形,了解控制信号的时序。

最后进行引脚锁定并完成硬件测试实验。

XULIEQI程序:module XULIEQI(clk,reset,din8,LED7S);input clk;input reset;input [7:0] din8;output [6:0] LED7S;wire [3:0] AB;xulie u1 (clk, din8, reset, din);schk u2 (din,clk,reset,AB);decl7s u3 (AB,LED7S);endmoduleXULIEQI波形:功能仿真:时间仿真:引脚琐定:5. 下载后,按以下提示进行操作:1)、按实验板“系统复位”键;2)、用SW0-SW7(PIN_N25, PIN_N26,PIN_P25,PIN_AE14,PIN_AF14,PIN_AD13,PIN_AC13,PIN_C13)键输入待测序列数"11100101 ";3)、按下RESET键;4)、按KEY0键(时钟clk输入)8次,这时若串行输入的8位二进制序列码与预置码"11100101 "相同,则数码管HEX0应从原来的B变成A ,表示序列检测正确,否则仍为B。

四、思考题:说明代码表达的是什么类型的状态机,它的优点是什么?详述其功能和对序列数检测的逻辑过程。

答:代码表达的是Moore型状态机,它的优点是可以将输入部分与输出部分隔离开。

其功能是在时钟脉冲的有限个门延时之后,输出达到稳定。

输出会在一个完整的时钟周期内保持稳定值,及时在该时钟内输入信号变化了,输出信号也不会变化。

输入对输出的影响要到下一个时钟周期才能反映出来。

对序列数检测的逻辑过程是状态寄存器、下状态转移逻辑和输出逻辑。

相关主题