状态机实现序列检测器
实验三_用状态机实现序列检测器的设计Verilog
实验三用状态机实现序列检测器的设计一、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
二、原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出a,否则输出b。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
例3-1描述的电路完成对序列数"11100101"的。
当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“a”,否则仍然输出“b”。
【例3-1】//顶层文件:module XULIEQI(clk,reset,din18,LED7S);input clk;input reset;input [17:0] din18;output [6:0] LED7S;wire [3:0] AB;wire [17:0] din18;xulie u1 (clk, din18, reset, din);schk u2 (din,clk,reset,AB);decl7s u3 (AB,LED7S);endmodule//串行检测:module schk(DIN,CLK,CLR,AB);input DIN,CLK,CLR;output[3:0] AB;reg [3:0] AB;reg [7:0] Q;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<=c;endd:beginif(DIN== data[3]) Q<=e;else Q<=a;ende:beginif(DIN== data[2]) Q<=f;else Q<=idle;endf:beginif(DIN== data[1]) Q<=g;else Q<=b;endg:beginif(DIN== data[0]) Q<=h;else Q<=idle;endh:beginif(DIN== data[7]) Q<=a;else Q<=idle;enddefault :Q<=idle;endcaseendalways @(Q)beginif(Q==h) AB <= 4'b1010 ;else AB <= 4'b1011 ;endendmodule//前端预置8位数据输入:module xulie(clk, din18, reset, din);input clk;input[17:0] din18;input reset;output din;reg din;parameters0 = 5'b00000,s1 = 5'b00001,s2 = 5'b00010,s3 = 5'b00011,s4 = 5'b00100,s5 = 5'b00101,s6 = 5'b00110,s7 = 5'b00111,s8 = 5'b01000,s9 = 5'b01001,s10 = 5'b01010,s11 = 5'b01011,s12 = 5'b01100,s13 = 5'b01101,s14 = 5'b01110,s15 = 5'b01111,s16 = 5'b10000,s17 = 5'b10001;reg[4:0] cur_state,next_state;always @ (posedge clk or negedge reset) if(!reset)cur_state <= s17;elsecur_state <= next_state;always @ (cur_state or din18 or din ) begincase (cur_state)s17 : begindin <= din18[17];next_state <= s16;ends16 : begindin <= din18[16];next_state <= s15;ends15 : begindin <= din18[15];next_state <= s14;s14 : begindin <= din18[14];next_state <= s13;ends13 : begindin <= din18[13];next_state <= s12;ends12 : begindin <= din18[12];next_state <= s11;ends11 : begindin <= din18[11];next_state <= s10;ends10 : begindin <= din18[10];next_state <= s9;ends9 : begindin <= din18[9];next_state <= s8;ends8 : begindin <= din18[8];next_state <= s7;ends7 : begindin <= din18[7];next_state <= s6;ends6 : begindin <= din18[6];next_state <= s5;ends5 : begindin <= din18[5];next_state <= s4;ends4 : begindin <= din18[4];next_state <= s3;s3 : begindin <= din18[3];next_state <= s2;ends2 : begindin <= din18[2];next_state <= s1;ends1 : begindin <= din18[1];next_state <= s0;ends0: begindin <= din18[0];next_state <= s17;enddefault : begindin <= 1'b0;next_state <= s0;endendcaseendendmodule提示:1.若对于D <= "11100101 ",电路需记忆:初始状态、1、11、111 、1110 、11100、111001、1110010、11100101 共9种状态。
序列检测器 verilog
五邑大学实验报告实验课程名称序列检测器院系名称:__信息学院_____专业名称:__电子信息工程___实验项目名称:_EDA实验____班级ap07053 学号:_ap*******___报告人:__黃少昌____实验五序列检测器一、实验目的:1、掌握用Verilog HDL实现状态机的方法;2、利用状态机设计一个序列检测器。
二、实验原理:序列检测器在数据通讯,雷达和遥测等领域中用与检测步识别标志。
它是一种用来检测一组或多组序列信号的电路。
例如检测器收到一组串行码{1110010}后,输出标志1,否则,输出0。
考查这个例子,每收到一个符合要求的串行码就需要用一个状态进行记忆。
串行码长度为7位,需要7个状态;另外,还需要增加一个“未收到一个有效位”的状态,共8个状态;S0~S7,状态标记符的下标表示有几个有效位被读出。
画出状态转换图,如图5-1所示,很显然这是一个莫尔状态机。
8个状态机根据编码原则可以用3位二进制数来表示。
图 5-1 序列检测器状态变化图三、设计任务及要求:1、用状态机实现一序列检测器,即检测到串行码{1110010}后,检测器输出1,否则输出0;2、设计输入采用Verilog HDL语言;3、对设计进行仿真;4、把设计下载到试验箱验证。
四、设计提示:1、状态机是实验时序电路的有效工具,用状态机实现时序检测器就是典型例子;2、状态机的Verilog HDL 实现基本有固定模式,参见教程《数字系统设计与Verilog HDL》(第二版)第271~272页。
3、状态机实现的要点是在每个状态下,当时钟有效沿到来时,判断输入值是什么,然后决定下一状态跳转到什么地方。
五、给出设计的源程序:module seq(in,out,state,clk,reset);input in,clk,reset; output out;output[2:0]state;reg[2:0]state;reg out;parameter s0='d0,s1='d1,s2='d2,s3='d3,s4='d4,s5='d5,s6='d6,s7='d7; always @(posedge clk)begin if(reset) begin state<=s0;out<=0;endelse casex(state)s0:beginif(in==0) begin state<=s0;out<=0;endelse begin state<=s1;out<=0;endends1:beginif(in==0) begin state<=s0;out<=0;endelse begin state<=s2;out<=0;endends2:beginif(in==0) begin state<=s0;out<=0;endelse begin state<=s3;out<=0;endends3:beginif(in==0) begin state<=s4;out<=0;endelse begin state<=s3;out<=0;endends4:beginif(in==0) begin state<=s5;out<=0;endelse begin state<=s1;out<=0;endends5:beginif(in==0) begin state<=s0;out<=0;endelse begin state<=s6;out<=0;endends6:beginif(in==0) begin state<=s7;out<=1;endelse begin state<=s2;out<=0;endends7:beginif(in==0) begin state<=s0;out<=0;endelse begin state<=s1;out<=0;endenddefault:state<=s0;endcaseendendmodule六、给出序列检测器的仿真波形图:七、心得体会:此次实验,我觉得既锻炼了我们的设计,由简单的抽象理解到实际认知。
实验三_用状态机实现序列检测器的设计
实验三_用状态机实现序列检测器的设计引言:序列检测器是一类常用的电子设计电路,它在接收到特定的输入序列时,会产生特定的输出序列。
在许多应用场景中,如通信系统、数字信号处理和自动控制等领域,序列检测器都发挥着重要的作用。
本实验将利用状态机的概念,设计并实现一个简单的序列检测器。
一、序列检测器的设计原理序列检测器的设计原理基于状态机的思想。
状态机是一种抽象的计算模型,它由一组状态、一组输入和一组转移动作组成。
在序列检测器中,输入序列被连续地输入,状态也会根据输入进行不断变化。
当状态机检测到了预设的特定输入序列时,就会产生相应的输出序列。
二、序列检测器的设计步骤1.确定输入和输出序列:首先确定所需检测的输入序列和对应的输出序列,这将决定状态机的状态转移条件。
2.绘制状态转移图:根据输入和输出序列,绘制状态转移图,即用状态变量和状态转移条件表示状态转移关系。
3.设计状态机的状态转移表:根据状态转移图,将所有可能的状态转移关系整理为一个状态转移表。
4.实现状态机的代码逻辑:根据状态转移表,编写代码实现状态机的逻辑功能。
三、设计实例在本实验中,我们以一个简单示例为例,演示序列检测器的设计流程。
假设输入序列为0101,当检测到该输入序列时,输出序列为011.确定输入和输出序列:输入序列为0101,输出序列为012.绘制状态转移图:根据输入和输出序列,绘制状态转移图如下:0/00,S0,1/1/1说明:状态S0表示未检测到特定输入序列,状态S1表示检测到特定输入序列。
3.设计状态机的状态转移表:根据状态转移图,得到状态转移表如下:输当前状态,0,1S0,S0,S1S1,S0,S14.实现状态机的代码逻辑:根据状态转移表,编写代码实现状态机的逻辑功能,伪代码如下:if (当前状态 == S0)if (输入 == 0)当前状态=S0;输出=0;} else if (输入 == 1)当前状态=S1;输出=0;}} else if (当前状态 == S1)if (输入 == 0)当前状态=S0;输出=1;} else if (输入 == 1)当前状态=S1;输出=1;}}四、实验总结本实验利用状态机的思想,设计并实现了一个简单的序列检测器。
序列检测器_实验报告
一、实验目的1. 理解序列检测器的工作原理和设计方法;2. 掌握时序电路的经典设计方法;3. 学习使用Verilog HDL语言进行状态机的设计;4. 通过实验验证序列检测器的功能。
二、实验原理序列检测器是一种同步时序电路,用于检测输入的一串二进制编码。
当输入序列与预设的编码相匹配时,输出高电平;否则,输出低电平。
序列检测器在数字通信、安全防盗、密码认证等领域有着广泛的应用。
序列检测器的基本工作原理如下:1. 预设一个编码序列,称为目标序列;2. 当输入序列与目标序列相匹配时,输出高电平;3. 当输入序列与目标序列不匹配时,输出低电平。
三、实验器材1. PC机一台;2. EDA教学实验系统一台;3. 下载电缆一根(已接好);4. 导线若干。
四、实验步骤1. 设计序列检测器的Verilog代码;2. 在EDA教学实验系统上编译、仿真和下载Verilog代码;3. 连接实验电路,下载Verilog代码;4. 通过逻辑分析仪观察输出波形,验证序列检测器的功能。
五、实验内容1. 设计一个长度为4位的序列检测器,目标序列为1001;2. 设计一个长度为8位的序列检测器,目标序列为11001001;3. 通过实验验证序列检测器的功能。
六、实验代码```verilogmodule seqdet(input clk, // 时钟信号input rst, // 复位信号input [3:0] din, // 输入序列output reg out // 输出信号);// 定义状态localparam [1:0] IDLE = 2'b00,MATCH = 2'b01,NOMATCH = 2'b10;// 状态寄存器reg [1:0] state, nextstate;// 输出函数always @(posedge clk or posedge rst) beginif (rst) beginstate <= IDLE;out <= 1'b0;end else beginstate <= nextstate;out <= (state == MATCH) ? 1'b1 : 1'b0; endend// 激励函数always @() begincase (state)IDLE: beginif (din == 4'b1001) beginnextstate = MATCH;end else beginnextstate = NOMATCH;endendMATCH: beginnextstate = IDLE;endNOMATCH: beginnextstate = IDLE;enddefault: beginnextstate = IDLE;endendcaseendendmodule```七、实验结果与分析1. 长度为4位的序列检测器:当输入序列为1001时,输出高电平;当输入序列不为1001时,输出低电平。
实验三用状态机实现序列检测器的设计
仿真,分析结果
4、锁引脚
1)根据DE2_pin_assignments文件内容、格式制作 本设计引脚对应文件的引脚锁定文件: XUELIEQI.csv
• 由Processing->generate functional simulation netlist,提取功能仿真的网表
• 由processing -> start simulation 进行功能仿 真,并对结果进行分析。
• 时序仿真
• 由assignments->settings,更改仿真器的设置为 时序仿真:timing
• 双击波形文件下的空白区,得到如下对话框,点 击Noder Finder
弹出下面的对话框,单击List,选中AB、CLK、CLR 、DIN、Q几个端口,单击>_后,点击OK
• 由edit->end time ,设定仿真终止时间为 1us, 选中CLK点击 设置周期是10ns,
并对CLR,DIN作相应设置
• 由assigments->settings,对仿真工具设定为功 能仿真,并将激励文件调入
• 由Processing->generate functional simulation netlist,提取功能仿真的网表
• 由processing -> start simulation 进行功能仿
实验三 用状态机实现序列检测器的设计
任务分析
• 本次实验的核心是:应用有限状态机设计思路, 检测输入的串行数据是否是”11100101”。
序列检测器 用verilog语言实现
一、实验目的及要求目的:1、掌握利用有限状态机实现一般时序逻辑分析的方法;2、掌握用verilog编写可综合的有限状态机的标准模板;3、掌握用verilog编写状态机模块的测试文件的一般方法。
要求:1.设计一个串行数据检测器。
要求:连续4个或4个以上为1时输出为1,其他输入情况为0 。
编写测试模块对设计的模块进行各层次的仿真,并观察波形,编写实验报告。
二、实验设备(环境)及要求实验设备:PC机一台环境要求:安装Modelsim仿真软件以及Synplify Pro综合工具程序模块:module serial_detected(din,clk,reset,out);input din;//串行数据输入input clk;//时钟输入input reset;//异步复位信号输入output out;//结果输出reg out;reg [3:0] state,nextstate;//状态编码parameterIdle = 3'b000,First_bit = 3'b001,Second_bit = 3'b010,Third_bit = 3'b011,Fourth_bit = 3'b100;//----------------更新当前状态--------------------------always @(posedge clk or negedge reset)beginif(!reset)state <= Idle;elsestate <= nextstate;end//------------------------------------------------------//-------------产生下一状态组合逻辑---------------------always @(state or din)case(state)Idle:if(din)nextstate = First_bit;elsenextstate = Idle;First_bit:if(din)nextstate = Second_bit;elsenextstate = Idle;Second_bit:if(din)nextstate = Third_bit;elsenextstate = Idle;Third_bit:if(din)nextstate = Fourth_bit;elsenextstate = Idle;Fourth_bit:if(din)nextstate = Fourth_bit;elsenextstate = Idle;default:nextstate = 3'bxxx;endcaseend//------------------------------------------------------//--------------产生输出的组合逻辑---------------------- always @(state or reset or din)beginif(!reset)out <= 0;elseif(state == Fourth_bit)out <= 1;elseout <= 0;end//------------------------------------------------------测试模块:module test_serial_detected;// Inputsreg din;reg clk;reg reset;// Outputswire out;// Instantiate the Unit Under Test (UUT)serial_detected uut (.din(din),.clk(clk),.reset(reset),.out(out));initialbegindin = 0;reset = 1;//给复位信号变量赋初值clk = 0;//给时钟变量赋初值#22 reset = 0;//使复位信号有效#133 reset = 1;//经过一个多周期以后是复位信号无效end//---------------------------------------------------//--------产生信号和控制-----------------------------always #50 clk = ~clk;//产生周期性时钟always @(posedge clk)//在每次时钟正跳变沿时刻产生不同的din begin#50 din <= {$random}%2;//din的值是随机产生的#(3*50+12);//din的值维持一段时间endinitial//暂停仿真以便观察仿真波形begin#100000 $stop;end4.利用Modelsim编译纠错和仿真5.利用Synplify Pro进行综合6.利用Quartus2进行布局布线四、实验结果与数据处理1.Modelsim仿真波形如下,自上向下信号依次为reset、clk、din、out2.选择Altera STRATIX器件库综合产生的RTL级电路如下。
VHDL序列检测器设计1110010
VHDL数字系统设计与测试作业序列检测器设计学院:通信工程学院学号:***************设计要求:用状态机设计序列检测器(1110010)。
设计功能:考虑一个序列检测器,检测的序列流为“1110010”,当输入信号依次为“1110010”时输入一个脉冲,否则输入为低电平。
设计思路:序列检测器是一种同步时序电路,它用于搜索,检测输入的二进制代码串中是否出现指定的代码序列,1110010序列检测器的原理图如下:CPX Y 0111010010010首先,本实验要从一串二进制编码中检测出一个已预置的七位二进制码1110010,每增加一位相当于增加一个状态,再加上一个初始态,用八个状态可以实现,其Moore型原始状态转移图如下:根据状态转移图可以得出Moore型原始状态转移表为:源代码:library ieee;use ieee.std_logic_1164.all;entity check isport(din:in std_logic;clk,clr:in std_logic;z:buffer std_logic);end check;architecture arch_check of check istype StateType is(s1,s2,s3,s4,s5,s6,s7,s8);signal present_state,next_state:StateType; beginstate_comb:process(present_state,din)begincase present_state iswhen s1=>z<='0';if din='1'thenelsenext_state<=s1;end if;when s2=>z<='0';if din='1'thennext_state<=s3;elsenext_state<=s2;end if;when s3=>z<='0';if din='1'thennext_state<=s4;elsenext_state<=s1;end if;when s4=>z<='0';if din='1'thennext_state<=s4;elsenext_state<=s5;end if;when s5=>z<='0';if din='1'thennext_state<=s2;elsenext_state<=s6;end if;when s6=>z<='0';if din='1'thenelsenext_state<=s1;end if;when s7=>z<='0';if din='1'thennext_state<=s3;elsenext_state<=s8;end if;when s8=>z<='1';if din='1'thennext_state<=s2;elsenext_state<=s1;end if;end case;end process state_comb;state_clocked:process(clk,clr)beginif(clr='1')thenpresent_state<=s1;elsif(clk'event and clk='1')thenpresent_state<=next_state;end if;end process state_clocked;end arch_check;仿真结果:仿真结果分析:如图所示,当输入1110010序列时,输出Z输出一个高电平,否则输出低电平。
101序列检测器原理
101序列检测器原理你想啊,就像我们在生活里找东西一样,这个序列检测器呢,就是在一堆数字或者信号里找特定的“宝贝”,这个宝贝就是101这个序列啦。
那它到底是怎么做到的呢?这就像是一场超级有趣的寻宝游戏呢。
我们先得有个小“机关”,这个机关就是状态机啦。
状态机就像是一个有着不同状态的小机器人,它可以在不同的情况下做出不同的反应。
比如说,最开始的时候,它有个初始状态,就像是小机器人在休息,啥都还没开始找呢。
当它接收到第一个信号的时候,如果这个信号是1,那它就会进入一个新的状态,这个状态就像是小机器人开始警觉起来啦,觉得可能找到了宝贝的开头。
要是这个信号是0呢,那它就还在初始状态,就像小机器人打了个盹儿,觉得还不是时候。
然后呢,当它处于那个警觉状态的时候,如果下一个信号是0,那它就进入到一个中间状态啦,这个状态就像是小机器人在心里默默记着,已经有了个1,现在又有个0,离目标更近一步喽。
要是下一个信号是1呢,那它就得回到初始状态重新开始找啦,就像小机器人发现自己找错了路,得重新出发。
当它在中间状态的时候,如果下一个信号是1,哇塞,那就找到了101这个宝贝啦,小机器人就可以欢呼起来啦,就像我们找到了藏起来的小糖果一样开心。
要是下一个信号是0呢,那它又得回到初始状态重新开始找喽。
这个101序列检测器啊,在实际生活里用处可大啦。
比如说在数字通信里,就像是一个超级小侦探。
它能在那些乱乱的数字信号流里,把101这个特定的序列给找出来。
这就好比在一堆信件里,找到一封特别标记的信一样。
再想象一下,在电路里呢,它也像是一个聪明的小管家。
电路里有各种各样的信号在跑来跑去,101序列检测器就能把那些符合101序列的信号给挑出来,然后进行特殊的处理,就像小管家把特别的东西单独放到一个小盒子里一样。
而且哦,这个原理其实也没有那么难理解啦。
就像我们玩游戏的时候,有一定的规则,按照规则走就能达到目的。
101序列检测器也是按照它自己的小规则,在那些数字或者信号里游刃有余地找到目标。
110序列检测器的设计及仿真实现
题目:设计 110 序列检测器,当输入信号时输出,否则一、设计思路我们采用 Moore 机完成这个功能。
对于触发器的选择,为了简便我们选用 D触发器以及基本的门电路完成基本设计。
二、时钟同步状态机1根据题目要求我们得到下面的状态图状态表示的意义Q X=0X=1输出 Z 等待 1 的出现A A B0出现 1B A C0出现 11C D C0出现 110D A B1Q*2转移输出表Q0 Q1输入 X输出 ZX=0X=10000010010011011101101000011Q0 Q13状态图如图:通过卡诺图化简可得转移方程:输出方程:Q0 =Q0Q1Q1 X Q1XZ Q0Q1我们选择 D 触发器作为记忆电路部分由 D 触发器的特征方程 : Q D得激励方程: D 0=Q0Q1Q1XD1X三、 Verilog 程序如下:module shiyan2 (clk,x,z);input clk,x;output z;wire[1:0] state;wire[1:0] excite;nextlogic u1(x,state,excite); statememory u2(clk,excite,state); outputlogic u3(state,z); endmodulemodule statememory (clk,d,q); input clk;input[1:0] d;output[1:0] q;reg[1:0] q;always @ (posedge clk) begin q <= d;endendmodulemodule nextlogic (x,q,d);input x; input[1:0] q;output[1:0] d;assign d[0]=(q[1]&q[0])|(q[1]&x); assign d[1]=x;endmodulemodule outputlogic (q,z); input[1:0] q;output z;assign z=(!q[1])&q[0]; Endmodule四、仿真结果及电路图得到功能仿真结果为:时序仿真结果为:利用程序生成的电路图为从电路图和仿真结果来看这次的仿真能够完全达到题目的要求。
序列检测器
port(clk,rst,din:in std_logic;
z:out std_logic);
end exp_detect1;
architecture bhv of exp_detect1 is
type state_type is(s0,s1,s2,s3,s4,s5,s6); ---状态定义
前者次态和输出均取决于现态和当前输入,后者下一状态取决于当前状态和当前输入,但其输出仅取决于当前状态。
(2)type 语句如何定义状态机状态?注意事项有什么?
答:type 语句可以定义新的数据类型格式:
type 数据类型名 is (元素列表)。
例:
type state_type is (s0, s1, s2, s3, s4);
end if;
when s6=>
if din='0' then
state<=s0;
else
state<=s2;
end if;
end case;
end if;
end process;
process(state,din) ---输出设置
begin
case state is
when s6=>
if din='0' then
type 数据类型名 is (元素列表)
(2)设计步骤
①根据设计要求确定状态机类型。
②列出状态机的状态和输出,分析状态转移关系并化简。
③依据选定状态机类型,绘制状态图。
④编写VHDL定义状态,并建立状态机进程。
⑤编写VHDL描述状态的转移及输出,从而完成状态机设计。
VHDL序列检测器
课程:VHDL数字系统设计与测试题目:序列检测器(1110010)功能:输入一个串行位流,当出现“1110010”时,输出为1,其它输出为0设计思路:通过状态机来实现序列检测器状态机转移图(quartus)具体的VHDL代码:library ieee;use ieee.std_logic_1164.all; //VHDL库声明entity sequence_dectector isport(clk,rst,d: in bit;q: out bit);end sequence_dectector;//实体定义及输入输出architecture behavior of sequence_dectector is //构造体部分type state is (state1,state2,state3,state4,state5,state6,state7,state8);signal present_state ,next_state: state;//定义枚举数据类型begin// 状态机时序逻辑部分的设计process(rst , clk)beginif(rst = '1') thenpresent_state <= state1; // 复位有效时,状态变为state1elsif(clk'event and clk = '1') thenpresent_state <= next_state; // 复位无效时,时钟上升沿状态更新end if;end process;//状态机中组合逻辑部分的设计process(d , present_state) //状态不同时,输出也不同,根据d的不同来确定下一状态begincase present_state iswhen state1 =>q <= '0';if(d = '1') then next_state <= state2;else next_state <= state1;end if;when state2 =>q <= '0';if(d = '1') then next_state <= state3; else next_state <= state1;end if;when state3 =>q <= '0';if(d = '1') then next_state <= state4; else next_state <= state1;end if;when state4 =>q <= '0';if(d = '0') then next_state <= state5; else next_state <= state4;end if;when state5 =>q <= '0';if(d = '0') then next_state <= state6; else next_state <= state2;end if;when state6 =>q <= '0';if(d = '1') then next_state <= state7;else next_state <= state1;end if;when state7 =>q <= '0';if(d = '0') then next_state <= state8;else next_state <= state3;end if;when state8 => //此时检测到"1110010",输出为1 q <= '1';if(d = '0') then next_state <= state1;else next_state <= state2;end if;end case;end process;end behavior;quartus的功能仿真图有功能仿真图可知代码实现了要求的序列检测器的要求。
序列检测器 实验报告
序列检测器实验报告序列检测器是一种常见的信号处理技术,广泛应用于通信、雷达、生物医学和金融等领域。
本文将介绍序列检测器的原理、实验设计和实验结果,并对其应用进行讨论。
一、序列检测器的原理序列检测器是一种用于检测和识别输入信号序列的设备或算法。
它通过对输入信号进行观测和分析,判断信号是否符合特定的模式或规律。
常见的序列检测器包括有限状态机、卷积神经网络和隐马尔可夫模型等。
有限状态机是一种基本的序列检测器,它由一组状态和状态之间的转移规则组成。
在每个时刻,输入信号会触发状态之间的转移,最终达到一个终止状态。
通过定义状态和转移规则,可以实现对输入信号序列的检测和识别。
二、实验设计本实验旨在设计并实现一个简单的序列检测器,用于检测二进制信号序列中是否存在特定的模式。
实验使用MATLAB软件进行仿真,并基于有限状态机的原理进行设计。
1. 实验步骤(1)定义有限状态机的状态和转移规则;(2)生成一组随机的二进制信号序列作为输入;(3)根据状态和转移规则,对输入信号进行观测和分析;(4)判断输入信号是否符合特定的模式,并输出检测结果。
2. 实验参数为了简化实验设计,我们假设输入信号序列中的模式为"110"。
具体的状态和转移规则如下:(1)初始状态为S0;(2)当输入为"1"时,状态转移为S1;(3)当输入为"0"时,状态转移为S0;(4)当当前状态为S1且输入为"0"时,状态转移为S2;(5)当当前状态为S2且输入为"1"时,状态转移为S3;(6)当当前状态为S3且输入为"0"时,状态转移为S0。
三、实验结果经过实验设计和仿真,我们得到了以下实验结果:1. 输入信号序列:1011010110112. 检测结果:存在模式"110"通过对输入信号序列进行观测和分析,我们成功地检测到了模式"110"的存在。
实验三:状态机实现序列检测器设计
实验三:状态机实现序列检测器设计《FPGA》课程报告设计题目:状态机实现序列检测器设计学生班级:学生学号:学生姓名:指导教师:时间:成绩:一、实验目的:1.理解有限状态机的概念;2. 掌握有限状态机的状态图的画法及其含义二、实验原理:本次实验的内容是:应用有限状态机设计思路,检测输入的串行数据是否是”11100101”,本次实验由顶层文件、串行检测、并行数据转串行、数码管显示四个模块组成。
1.并行数据转串行数据模块功能是:可以异步复位,可以在时钟控制下,将并行输入数据din[7:0],按照din[7],din[6],din[5],din[4],din[3],din[2],din[1],din[0]的顺序输出至串行检测模块的输入端口din。
2.串行检测模块:输入信号:DIN-----1bit的串行输入数据CLK-----同步输入时钟CLR ------异步清零信号,当CLR=1,系统输出置0,否则,系统正常工作输出信号: AB--------4bits数据,如果系统检测到“11100101”这8bit的输入,AB=4’b1010,否则,AB=4’b1011.三、实验过程:1.首先建立一个新的工程,添加一个新的Verilog Module文件,然后写入并行数据转串行数据模块的代码,代码如下:然后执行综合,确认无误后,新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:2.再新建一个Verilog Module文件,在其中写入串行检测模块的代码,代码如下:然后执行综合,确认无误后,新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:3. 再新建一个Verilog Module文件,数码管显示模块的代码,代码如下:然后执行综合,确认无误后,新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:4.编写顶层文件,将上面三个模块例化在一起,代码如下:然后将新的顶层文件经行综合,确认无误后,新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:5.添加消抖模块,然后编写新的顶层文件,将消抖模块与上面的模块例化在一起,代码如下:保存后生成新的顶层文件:6.完成以上操作后,执行综合确认无误,经行锁引脚操作:锁引脚完成后,编辑、修改约束文件:7. 生成下载配置文件,下载到开发板进行经行验证。
采用-EDA实验五-用状态图输入法实现序列检测器
EDA实验五用状态图输入法实现序列检测器一、实验目的:了解序列检测器的基本原理,Mealy型和Moore型状态机的基本原理,掌握状态图输入法实现序列检测器的方法,并进行分析和仿真验证。
二、实验内容:本实验内容是:用状态图输入法设计一个序列检测器,若检测器收到一组码流1110010则输出为1,否则输出为0。
三、实验方法:实验方法:采用基于FPGA进行数字逻辑电路设计的方法。
采用的软件工具是QuartusII软件仿真平台,采用的硬件平台是Altera EPF10K20TI144_4的FPGA试验箱。
实验步骤:1、绘制状态图。
打开QuartusII软件平台,建立工程文件夹,工程文件夹名称为exp_detect3.然后点击File中的New建立一个状态图文件(用State Machine File命令),然后设置并生成状态图。
2、按照实验箱上FPGA的芯片名更改编程芯片的设置。
操作是点击Assign/Device,选取芯片的类型.3、编译与调试。
确定状态图文件为当前工程文件,点击Complier进行文件编译.编译结果有错误或警告,则将要调试修改直至文件编译成功。
4、波形仿真及验证。
在编译成功后,点击Waveform开始设计波形。
点击“insert the node",按照程序所述引脚,任意设置各输入节点的输入波形…点击保存按钮保存。
5、FPGA芯片编程及验证,应记录实验结果进行分析。
四、实验过程:用状态图输入法实现序列检测器:1、建立工程文件,工程文件夹的名称为exp_detect3,工程名和顶层实体名称为exp_detect3.工程建立过程中平台设置设置如下图所示:2、工程建好后,即进行状态图的输入。
具体过程如下:选择菜单File->New—>State Machine File命令,打开State Machine Editor窗口,如下图所示:然后选择Tools-〉State Machine Wizard 命令,弹出如下所示状态机创建向导对话框。
序列检测器实验报告
#### 实验目的1. 理解序列检测器的工作原理;2. 掌握时序电路的经典设计方法;3. 学习使用Verilog HDL语言进行状态机的设计;4. 验证序列检测器在实际电路中的性能。
#### 实验原理序列检测器是一种同步时序电路,用于检测特定的串行码序列。
它能够识别并响应特定长度的二进制序列,一旦检测到匹配序列,就会产生一个输出信号。
序列检测器在数字通信、数据存储和信号处理等领域有着广泛的应用。
#### 实验器材1. PC机一台;2. FPGA开发板;3. 下载电缆一根;4. 信号发生器;5. 示波器;6. 连接线若干。
#### 实验步骤1. 设计序列检测器:使用Verilog HDL语言设计一个序列检测器,该检测器能够检测到特定的序列,如“101”。
2. 实现状态机:将序列检测器设计为一个状态机,通过定义状态和状态转移图来实现序列检测功能。
3. 代码编写与仿真:在FPGA开发板上编写Verilog代码,并使用仿真软件进行功能验证。
4. 硬件实现:将Verilog代码下载到FPGA开发板上,通过信号发生器生成测试序列,并使用示波器观察输出信号。
5. 性能测试:测试序列检测器在实际电路中的性能,包括检测速度、误检率等。
#### 实验内容1. 状态机设计:根据序列检测器的要求,设计状态转移图,并定义状态编码。
2. Verilog代码编写:使用Verilog HDL语言编写序列检测器的代码,包括模块定义、信号定义、状态定义、状态转移和输出逻辑等。
3. 仿真验证:使用仿真软件对Verilog代码进行功能验证,确保序列检测器能够正确地检测到指定序列。
4. 硬件下载与测试:将Verilog代码下载到FPGA开发板上,生成测试序列,并使用示波器观察输出信号,验证序列检测器的实际性能。
#### 实验结果与分析1. 仿真结果:在仿真软件中,序列检测器能够正确地检测到指定序列“101”,输出信号符合预期。
2. 硬件测试结果:在FPGA开发板上,序列检测器能够正确地检测到指定序列“101”,输出信号与仿真结果一致。
实验八用状态机实现序列检测器的设计
实验八用状态机实现序列检测器的设计
1、实验目的
本实验旨在通过状态机的设计实现一个序列检测器,该序列检测器可
以检测01序列中可编程的模式,并实现相应的响应动作。
2、实验原理
序列检测器是一种有限状态机,由一系列状态和一系列触发器组成,
可以检测特定的序列,并拥有一定的驱动和响应动作。
根据所检测的序列,检测器通过触发器设置能够自动的转换到特定的状态,触发器的设置可以
根据需要进行调整,从而实现不同的序列和不同的响应动作。
3、实验内容
(1)状态机的设计
状态机的设计分为状态图设计和状态表设计两部分,在状态图设计中,绘制出起始状态、可能的转移状态以及相应的触发器, shown by figure 1 below . 再根据实验的要求,结合状态图和状态表,确定每一个触发器
的对应的转移状态以及响应动作, shown by table 1 below .
(2)用VHDL编程实现状态机
在VHDL中,可以实现上面的状态机,用自定义的类型定义状态、触
发器、响应动作以及转移条件,将状态图转换成可执行的VHDL代码,shown by listing 1 below .
(3)VHDL代码的仿真
在仿真中,可以根据状态图测试序列检测器的功能,确保能够检测出正确的模式,并实现预期的响应动作, shown by figure 2 below.
4、实验结果。
实验五用状态机实现序列检测器的设计
实验五用状态机实现序列检测器的设计
一、背景简介
序列检测器是用来检测输入字符串中是否存在特定序列的字符串检测器。
在现代的工业控制中,序列检测器的应用十分广泛,例如机器操作指令的检测,机器人的动作序列检测,机械手的加工步骤检测等等,它们可以用在几乎所有的自动控制系统中,既提高了系统的可靠性,又提高了系统的运行效率。
二、状态机实现序列检测器
1)概念介绍
状态机是一种形式语言,它用于模拟系统的状态和行为,并用来表示系统的变化,可以用于描述和分析控制系统的性能。
根据状态机的不同表示形式,可以分为状态转换表,状态转移图,状态转移矩阵,状态表和状态图。
采用状态机实现序列检测器,首先需要建立一个状态机图,状态机图需要有起点和终点,以及从一个状态到另一个状态的转移规则。
根据输入的字符串,每次转移到下一个状态,直到终止状态,如果在该过程中没有终止状态,或终止状态不是指定的终止状态,则检测字符串不包含特定的序列字符。
2)具体实现。
序列检测器的设计实验报告
序列检测器的设计实验报告一、实验目的本次实验的目的是设计一个能够检测特定序列的数字逻辑电路,即序列检测器。
通过设计和实现这个电路,深入理解数字电路的基本原理和设计方法,掌握状态机的概念和应用,提高逻辑分析和电路设计的能力。
二、实验原理序列检测器是一种能够在输入数据流中检测特定序列的电路。
它通常由状态机实现,状态机根据输入的变化在不同的状态之间转移,并在特定的状态下输出检测结果。
以检测序列“1011”为例,我们可以定义以下几个状态:状态 S0:初始状态,等待输入。
状态 S1:接收到“1”,等待下一个输入。
状态 S2:接收到“10”,等待下一个输入。
状态 S3:接收到“101”,等待下一个输入。
状态 S4:接收到“1011”,输出检测成功信号。
根据状态转移和输出的规则,可以画出状态转移图,并根据状态转移图设计相应的逻辑电路。
三、实验设备与器材1、数字电路实验箱2、逻辑门芯片(如与门、或门、非门等)3、示波器4、电源四、实验步骤1、分析设计要求,确定状态转移和输出规则,画出状态转移图。
2、根据状态转移图,列出状态转换表,确定每个状态下的输入和输出。
3、使用卡诺图或其他逻辑化简方法,对状态转换表进行化简,得到最简的逻辑表达式。
4、根据逻辑表达式,选择合适的逻辑门芯片,在实验箱上搭建电路。
5、连接电源和示波器,对电路进行测试。
输入不同的序列,观察输出是否符合预期。
五、实验电路设计以下是检测序列“1011”的逻辑电路设计:状态变量定义:设当前状态为 Q1Q0,其中 Q1 为高位,Q0 为低位。
状态转移方程:Q1(n+1) = Q1Q0 + XQ1' (其中 X 为输入)Q0(n+1) = XQ0' + Q1Q0输出方程:Y = Q1Q0X根据上述方程,使用与门、或门和非门搭建电路。
六、实验结果与分析在实验中,输入了不同的序列,包括“1011”以及其他随机序列。
通过示波器观察输出,当输入序列为“1011”时,输出为高电平,表示检测成功;当输入其他序列时,输出为低电平,表示未检测到目标序列。
实验五 用状态机实现序列检测器的设计
实验五用状态机实现序列检测器的设计一、实验目的1.熟悉QuartusⅡ软件应用环境,了解实验流程。
2.编写简单的Verilog代码,并在QuartusⅡ中进行调试和验证,并在EDA6000中下载代码和验证。
3.掌握用状态机(State Machine)实现序列检测器的设计。
二、实验原理假设检测器预先已经设定一个8位序列d,那么当由din端口串行输入的一个8位序列,与d完全相同时,检测器输出代码1010,即在试验箱上的LED上显示一个“A”;否则,检测器输出1110,即在试验箱上的LED上显示一个“E”。
同时,当清零信号clr有效时,输出为1110。
由清零信号clr和输入信号din共同控制状态机的状态变化。
三、实验内容1、检测一组二进制序列信号,当连续的脉冲信号和预先设定的序列d相同时,显示字符“A”,否则显示“E”。
2、使用工具为译码器建立一个元件符号3、设计仿真文件,进行验证。
4、编程下载并在实验箱上进行验证。
四、实验步骤1.新建Verilog工程项目,编写代码并保存至与模块名对应的项目文件夹。
2.编译程序,编译无误后,在【tools】>【netlist viewers】里面选择RTL Viewer,观察电路结构;在【tools】>【netlist viewers】里面选择State Machine Viewer,查看状态机转换图。
3.新建波形文件进行仿真。
保存时要和源程序存放在同一目录下。
设置好输入波形参数后,开始仿真。
在仿真后输入输出波形中观察逻辑关系是否正确。
4.将实验箱和PC合理连接起来。
打开EDA6000软件,设置好芯片类型为ACEX1K(EP1K30TC144-3),载入模式12。
5.根据EDA6000界面内管脚对应芯片的实际管脚在QUARTUSⅡ里面设定管脚号并检查无误。
6.将程序下载至FPGA内,并在EDA6000软件界面内进行验证测试。
程序代码module SCHK(clk,din,clr,d,err);input clk,din,clr; input [7:0]d;output [3:0]err;parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8;reg [8:0]cs,ns; reg [3:0]err;always @(posedge clk or posedge clr)begin if(clr) cs<=s0;else cs<=ns;case (cs)s0:if(din==d[0] ) ns<=s1;else ns<=s0;s1:if (din==d[1]) ns<=s2;else ns<=s0;s2:if(din==d[2] ) ns<=s3;else ns<=s0;s3:if(din==d[3] ) ns<=s4;else ns<=s0;s4:if(din==d[4] ) ns<=s5;else ns<=s0;s5:if(din==d[5] ) ns<=s6;else ns<=s0;s6:if(din==d[6] ) ns<=s7;else ns<=s0;s7:if(din==d[7] ) ns<=s8;else ns<=s0;s8:ns<=s8;default ns<=s0;endcaseendalways @(ns)begin if(ns==s8) err<=4'b1010;else err<=4'b1110;endendmodule编译:选择processing---start compilation命令,开始编译。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA专用周实验报告课题名称:用状态机实现序列检测器班级:通信技术09—1 姓名:指导老师:日期: 2011.2.21—3.5目录一、实验目的 (3)二、实验内容 (3)三、实验原理 (3)四、实验步骤 (4)五、实验程序及现象 (5)六、实训总结 (16)七、参考资料 (19)一、实验目的掌握利用有限状态机实现一般时序逻辑分析的方法,了解一般状态机的设计与应用。
二、实验内容设计一序列检测器并在SmartSOPC实验箱上进行硬件测试。
利用Quartus ||软件进行设计、仿真验证,最后进行引脚锁定并完成硬件测试。
用KEY5控制复位,KEY6控制状态机的时钟,KEY1~KEY4控制输入待检预置数和检测预置数(检测密码),并在数码管1\2和4\5上显示。
三、实验原理(1)序列检测器可用于检测由二进制码组成的脉冲序列信号。
当序列检测器连续收到一组串行二进制码后,如果这组序列码与检测器中预先设置的序列码相同,则输出1,否则输出0.这种检测的关键是必须收到连续的正确码,所以要求检测器必须对前一次接受到的序列码做记忆分析,直到在连续检测中所收到的每一位二进制码都与预置序列码对应相同。
在检测过程中,只要有一位不相等都将回到初始状态重新开始检测。
不考虑重叠的可能。
(2)为了配合硬件测试,本实验提供了一个测试模块(schk_test),该模块主要产生序列检测器所需的时钟、复位、串行输入序列码及预置数等信号。
对莫模块的各端口说明如下:Clock 系统时钟输入(48MHz)key[5..0] 按键输入disp[3..0] 序列检测器检测结果输入(显示于数码管8)sda 串行序列码输出clkout 序列检测器状态机时钟输出rstout 序列检测器复位信号输出dat[7..0] 检测预置数输出led7..0] LED输出seg[7..0] 数码管段输出dig[7..0] 数码管位输出四、实验步骤(1)启动Quartus||建立一个空白工程,然后命名为schk_top.qpf。
(2)新建VerilogHDL源程序文件schk_v,输入程序代码并保存,进行综合编译。
若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
(3)将光盘中的EDA_Component目录下的schk_test.bsf,schk_test.v 拷贝到工程目录。
(原理图形式需此步骤)(4)新建图形设计文件命名为schk_top.bdf并保存,其模块原理图如下:(5)选择目标器件并对相应的引脚进行定义锁定,在这里所选择的器件为EPIC6Q240C8芯片,将未使用的引脚设置为三态输入。
(6)将schk_top.bdf设置为顶层实体,对该工程进行全程编译处理,若在编译过程中发现错误,则找出错误并更正错误,直至编译成功为止。
(7)硬件连接、下载程序。
五、实验程序(一)原理图形式的实验参考程序如下:模块1为:module schk(sda,clk,rst,dat,disp); //序列检测器模块input sda; //串行序列码输入input clk; //时钟信号输入input rst; //复位信号输入input [7:0] dat; //输入待检测预置数output [3:0] disp; //检测结果输出reg [3:0] disp_r; //检测结果输出寄存器reg [3:0] state; //状态机寄存器parameter s0=4'd0,s1=4'd1, //状态机参数s2=4'd2,s3=4'd3,s4=4'd4,s5=4'd5,s6=4'd6,s7=4'd7,s8=4'd8;assign disp=disp_r; //输出检测结果always @(posedge clk or negedge rst)beginif(~rst)state<=s0; //复位elsebegincase(state)s0:if(sda==dat[7])state<=s1;else state<=s0; //状态s0s1:if(sda==dat[6])state<=s2;else state<=s0; //状态s1s2:if(sda==dat[5])state<=s3;else state<=s0; //状态s2s3:if(sda==dat[4])state<=s4;else state<=s0; //状态s3s4:if(sda==dat[3])state<=s5;else state<=s0; //状态s4s5:if(sda==dat[2])state<=s6;else state<=s0; //状态s5s6:if(sda==dat[1])state<=s7;else state<=s0; //状态s6s7:if(sda==dat[0])state<=s8;else state<=s0; //状态s7default:state<=s0;endcaseendendalways @(state)beginif(state==s8)disp_r<=4'hf; //序列码检测正确,输出“F”elsedisp_r<=4'h0; //序列码检测错误,输出“0”endendmodule模块2为:module schk_test(clock,key,sda,clkout,rstout,dat,disp,led,seg,dig);//外接I/O口input clock; //系统时钟input[5:0]key; //按键输入output[7:0]led; //输出接LEDoutput[7:0]seg; //输出接数码管段码output[7:0]dig; //输出接数码管位码//序列码检测模块I/O口output sda; //串行序列码输出output clkout; //产生时钟信号输出output rstout; //产生复位信号输出output[7:0]dat; //8位预置数输出input[3:0]disp; //输入检测结果reg[7:0]dat_r; //输出寄存器reg[7:0]led_r;reg[7:0]seg_r;reg[7:0]dig_r;reg[16:0]count; //时钟分频计数器reg[7:0]data; //内部寄存器reg[8:0]data_shift;reg[5:0]dout1,dout2,dout3,buff; //消抖寄存器reg[2:0]cnt3; //数码管扫描计数器reg[3:0]disp_dat; //数码管扫描显存reg div_clk; //分频时钟,用于消抖和扫描wire[5:0]key_edge; //按键消抖输出assign dat = dat_r;assign led = ~led_r;assign seg = seg_r;assign dig = dig_r;//时钟分频部分always @(posedge clock)beginif (count < 17'd120000)begincount <= count + 1'b1;div_clk <= 1'b0;endelsebegincount <= 17'd0;div_clk <= 1'b1;endend//按键消抖部分always @(posedge clock)beginif(div_clk)begindout1 <= key;dout2 <= dout1;dout3 <= dout2;endend//按键边沿检测部分always @(posedge clock)beginbuff <= dout1 | dout2 | dout3;endassign key_edge = ~(dout1 | dout2 | dout3) & buff;//按键控制处理部分always @(posedge clock) //按键1 序列码高4位beginif(key_edge[0]) //下降沿检测data[7:4] <= data[7:4] + 1'b1;endalways @(posedge clock) //按键2 序列码低4位beginif(key_edge[1]) //下降沿检测data[3:0] <= data[3:0] + 1'b1;endalways @(posedge clock) //按键3 预置数高4位beginif(key_edge[2]) //下降沿检测dat_r[7:4] <= dat_r[7:4] + 1'b1;endalways @(posedge clock) //按键4 预置数低4位beginif(key_edge[3]) //下降沿检测dat_r[3:0] <= dat_r[3:0] + 1'b1;endassign rstout = buff[4]; //按键5 复位assign clkout = buff[5]; //按键6 时钟always @(posedge clock)beginif(key_edge[4]) //按键5 复位begindata_shift = {1'b0,data}; //重新装载数据led_r = 8'd0;endelse if(key_edge[5]) //按键6begindata_shift = data_shift << 1;led_r = {data_shift[8],led_r[7:1]}; //LED左移显示endendassign sda = data_shift[8]; //串行序列码输出//数码管扫描显示部分always @(posedge clock) //定义上升沿触发进程beginif(div_clk)cnt3 <= cnt3 + 1'b1;endalways @(posedge clock)beginif(div_clk)begincase(cnt3) //选择扫描显示数据3'd0:disp_dat = data[7:4]; //第一个数码管3'd1:disp_dat = data[3:0]; //第二个数码管3'd3:disp_dat = dat[7:4]; //第四个数码管3'd4:disp_dat = dat[3:0]; //第五个数码管3'd7:disp_dat = disp; //第八个数码管default:disp_dat = 4'h0;endcasecase(cnt3) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示default:dig_r = 8'b11111111;endcaseendendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule(二)用程序形式做的程序如下;module schk(clock,key,sda,clkout,dat,disp,led,seg,dig);//外接I/O口input clock; //系统时钟input[5:0]key; //按键输入//input sda; //串行序列码输入wire rst; //复位信号输入//input[3:0]disp; //输入检测结果//input [7:0] dat; //输入待检测预置数output[7:0]led; //输出接LED output[7:0]seg; //输出接数码管段码output[7:0]dig; //输出接数码管位码output sda; //串行序列码输出output clkout; //产生时钟信号输出output[7:0]dat; //8位预置数输出output [3:0] disp; //检测结果输出reg[7:0]dat_r; //输出寄存器reg[7:0]led_r;reg[7:0]seg_r;reg[7:0]dig_r;reg[16:0]count; //时钟分频计数器reg[7:0]data; //内部寄存器reg[8:0]data_shift;reg[5:0]dout1,dout2,dout3,buff; //消抖寄存器reg[2:0]cnt3; //数码管扫描计数器reg[3:0]disp_dat; //数码管扫描显存reg div_clk; //分频时钟,用于消抖和扫描reg [3:0] disp_r; //检测结果输出寄存器reg [3:0] state; //状态机寄存器wire[5:0]key_edge; //按键消抖输出assign dat = dat_r;assign led = ~led_r;assign seg = seg_r;assign dig = dig_r;parameter s0=4'd0,s1=4'd1, //状态机参数s2=4'd2,s3=4'd3,s4=4'd4,s5=4'd5,s6=4'd6,s7=4'd7,s8=4'd8;assign disp=disp_r; //输出检测结果//时钟分频部分always @(posedge clock)beginif (count < 17'd120000)begincount <= count + 1'b1;div_clk <= 1'b0;endelsebegincount <= 17'd0;div_clk <= 1'b1;endend//按键消抖部分always @(posedge clock)beginif(div_clk)begindout1 <= key;dout2 <= dout1;dout3 <= dout2;endend//按键边沿检测部分always @(posedge clock)beginbuff <= dout1 | dout2 | dout3;endassign key_edge = ~(dout1 | dout2 | dout3) & buff;//按键控制处理部分always @(posedge clock) //按键1 序列码高4位beginif(key_edge[0]) //下降沿检测data[7:4] <= data[7:4] + 1'b1;endalways @(posedge clock) //按键2 序列码低4位beginif(key_edge[1]) //下降沿检测data[3:0] <= data[3:0] + 1'b1;endalways @(posedge clock) //按键3 预置数高4位beginif(key_edge[2]) //下降沿检测dat_r[7:4] <= dat_r[7:4] + 1'b1;endalways @(posedge clock) //按键4 预置数低4位beginif(key_edge[3]) //下降沿检测dat_r[3:0] <= dat_r[3:0] + 1'b1;endassign rst = buff[4]; //按键5 复位assign clkout = buff[5]; //按键6 时钟always @(posedge clock)beginif(key_edge[4]) //按键5 复位begindata_shift = {1'b0,data}; //重新装载数据led_r = 8'd0;endelse if(key_edge[5]) //按键6begindata_shift = data_shift << 1;led_r = {data_shift[8],led_r[7:1]}; //LED左移显示endendassign sda = data_shift[8]; //串行序列码输出//数码管扫描显示部分always @(posedge clock) //定义上升沿触发进程beginif(div_clk)cnt3 <= cnt3 + 1'b1;endalways @(negedge key_edge[5] or negedge rst)beginif(~rst)state<=s0; //复位elsebegincase(state)s0:if(sda==dat[7])state<=s1;else state<=s0; //状态s0s1:if(sda==dat[6])state<=s2;else state<=s0; //状态s1s2:if(sda==dat[5])state<=s3;else state<=s0; //状态s2s3:if(sda==dat[4])state<=s4;else state<=s0; //状态s3s4:if(sda==dat[3])state<=s5;else state<=s0; //状态s4s5:if(sda==dat[2])state<=s6;else state<=s0; //状态s5s6:if(sda==dat[1])state<=s7;else state<=s0; //状态s6s7:if(sda==dat[0])state<=s8;else state<=s0; //状态s7default:state<=s0;endcaseendendalways @(posedge clock)if(div_clk)begincase(cnt3) //选择扫描显示数据3'd0:disp_dat = data[7:4]; //第一个数码管3'd1:disp_dat = data[3:0]; //第二个数码管3'd3:disp_dat = dat[7:4]; //第四个数码管3'd4:disp_dat = dat[3:0]; //第五个数码管3'd7:disp_dat = disp; //第八个数码管default:disp_dat = 4'h0;endcasecase(cnt3) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd3:dig_r = 8'b11101111; //选择第一个数码管显示3'd4:dig_r = 8'b11110111; //选择第二个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示default:dig_r = 8'b11111111;endcaseendendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendalways @(state)if(state==s8)disp_r<=4'hf; //序列码检测正确,输出“F”elsedisp_r<=4'h0; //序列码检测错误,输出“0”endendmodule实验箱上的操作步骤为:按KEY3\KEY4输入检测预置数(数码管4\5上显示),假设为“11001001”(C9);按KEY1\KEY2输入待检测序列码(在数码管1\2上显示),也是“11001001”(C9)。