实验三序列发生器与序列检测器实验报告
EDA实验报告实验三、序列检测器的设计

实验三、序列检测器的设计一、预习内容1、预习序列发生器和检测器的基本工作原理;2、画出实验原理草图;3、写出实验的基本步骤和源程序。
二、实验目的1、掌握序列检测器的工作原理;2、学会用状态机进行数字系统设计。
三、实验器材PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干四、实验要求1、检测连续4个‘1’的状态机,画出状态转移图,并写出VHD代码;(必做部分)2、了解试验箱,完成数据分配器的硬件实验。
(实验一的硬件操作,首次使用请谨慎使用试验箱!)3、检测“10001110”序列,当检测到该序列后输出为‘1’。
(此部分选作)五、实验原理和实验内容1、序列发生器原理(此部分选作)在数字信号的传输和数字系统的测试中,有时需要用到一组特定的串行数字信号,产生序列信号的电路称为序列信号发生器。
本实验要求产生一串序列“10001110”。
该电路可由计数器与数据选择器构成,其结构图如图6-1所示,其中的锁存输出的功能是为了消除序列产生时可能出现的毛刺现象:图6-1 序列发生器结构图2、序列检测器的基本工作过程:序列检测器用于检测一组或多组由二进制码组成的脉冲序列信号,在数字通信中有着广泛的应用。
当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
状态图如图6-2所示:图6-2 序列检测器状态图3、状态机的基本设计思想:在状态连续变化的数字系统设计中,采用状态机的设计思想有利于提高设计效率,增加程序的可读性,减少错误的发生几率。
同时,状态机的设计方法也是数字系统中一种最常用的设计方法。
一般来说,标准状态机可以分为摩尔(Moore)机和米立(Mealy)机两种。
实验三 序列信号检测器的设计

实验三序列信号检测器的设计一、实验目的:1、理解序列信号检测器的工作原理;2、掌握原理图和文本输入的混合设计输入方法;3、理解状态划分;4、掌握状态机程序的编写方法;二、实验原理:序列检测器是时序数字电路中非常常见的设计之一。
它的主要功能是:将一个指定的序列从数字码流中识别出来。
接下来的设计就是针对“011”这个序列的检测器。
设input为数字码流输入,output为检出标记输出,高电平表示“发现指定序列”,低电平表示“没有发现指定的序列”。
设输入的码流为“001101101111011111...”,在时钟2~4中,码流input里出现指定序列“011”,对应输出output在第4个时钟变为高电平“1”,表示发现指定"011”,以此类推。
序列发生器模块采用的是M(n=4)序列发生器,详细可以参考《EDA技术与应用》一书的4.4团队协作及逻辑锁定。
三、实验内容(1)最终的顶层设计原理图如下:左侧的四个D触发器组成的电路为M序列信号发生器模块,它可以产生15位随机的二进制码流。
发生器产生的二进制码流每隔15个时钟周期重复出现一次。
详细的可以在最终的时序仿真图中看出来。
右侧的get_str模块为检测模块,给予状态机的结构编写的,具体如下:library ieee;use ieee.std_logic_1164.all;entity get_ser isport(clk : in std_logic;input : in std_logic;reset : in std_logic;serout : out std_logic_vector(1 downto 0);output : out std_logic);end entity;architecture rtl of get_ser is-- Build an enumerated type for the state machine type state_type is (s0, s1, s2, s3);-- Register to hold the current statesignal state : state_type;beginserout <= ('0'&input);-- Logic to advance to the next stateprocess (clk, reset)beginif reset = '1' thenstate <= s0;elsif (rising_edge(clk)) thencase state iswhen s0=>if input = '0' thenstate <= s1;elsestate <= s0;end if;when s1=>if input = '1' thenstate <= s2;elsestate <= s1;end if;when s2=>if input = '1' thenstate <= s3;elsestate <= s1;end if;when s3 =>if input = '1' thenstate <= s0;elsestate <= s1;end if;end case;end if;end process;-- Output depends solely on the current state process (state)begincase state iswhen s0 =>output <= '0';when s1 =>output <= '0';when s2 =>output <= '0';when s3 =>output <= '1';end case;end process;end rtl;(2)理解状态机请根据上图对照get_str程序理解检测“011”序列的基本编程思路。
序列信号检测实验报告

一、实验目的1. 理解序列信号检测的基本原理。
2. 掌握序列信号检测的方法和步骤。
3. 通过实验验证序列信号检测的准确性。
4. 分析实验结果,探讨影响序列信号检测准确性的因素。
二、实验原理序列信号检测是数字信号处理中的一个重要领域,主要研究如何从含有噪声的信号中检测出特定的序列信号。
本实验采用模拟信号检测的方法,通过设计序列信号发生器和检测器,实现对特定序列信号的检测。
三、实验器材1. 信号发生器2. 数据采集器3. 计算机及软件(如MATLAB等)4. 信号分析仪四、实验步骤1. 设计序列信号发生器:- 根据实验要求,设计特定的序列信号,如“1101”。
- 使用信号发生器产生该序列信号。
2. 设计序列信号检测器:- 设计一个检测器,用于检测序列信号。
- 检测器可以采用状态机或有限状态机(FSM)实现。
3. 实验设置:- 将信号发生器产生的序列信号输入到数据采集器。
- 将数据采集器采集到的信号输入到计算机进行后续处理。
4. 信号处理:- 使用MATLAB等软件对采集到的信号进行预处理,如滤波、去噪等。
- 对预处理后的信号进行序列信号检测。
5. 结果分析:- 分析实验结果,比较检测器检测到的序列信号与原始序列信号是否一致。
- 分析影响序列信号检测准确性的因素,如噪声水平、信号带宽等。
五、实验结果与分析1. 实验结果:- 通过实验,成功检测到了设计的序列信号“1101”。
- 检测到的序列信号与原始序列信号基本一致。
2. 结果分析:- 实验结果表明,所设计的序列信号检测器能够有效地检测出特定序列信号。
- 影响序列信号检测准确性的因素主要包括:- 噪声水平:噪声水平越高,检测难度越大。
- 信号带宽:信号带宽越窄,检测难度越大。
- 序列长度:序列长度越长,检测难度越大。
六、实验结论1. 序列信号检测实验验证了序列信号检测的基本原理和方法。
2. 通过实验,掌握了序列信号检测的步骤和技巧。
3. 实验结果表明,所设计的序列信号检测器能够有效地检测出特定序列信号。
序列检测器实验报告

序列检测器设计实验内容:设计一个1110010序列检测器,即检测器检测到序列1110010时,输出为1,否则输出为0。
输入信号:一个时钟输入信号clk;一个输入端x以输入序列来检测;一个输入y用来选择是检测序列1110010或是检测自己输入的序列;一个输入k(7..0)用来输入想要检测器检测的序列;输出信号:一个7位输出信号q,用来输出正在检测的7位序列;一个1位输出信号unlk,当被检测序列符合时,输出unlk为1否则为0;中间信号:再定义两个7位的中间信号a和combination;执行操作:在上升的时钟沿时候,将从x输入的序列赋给7位a,在y等于1的情况下,令中间信号combination为1110010,否则,在y等于0的情况下,令中间信号combination为从k输入的七位长序列。
最后把a的值赋给q,如果a与combination输出unlk等于1否则等于0。
(1)序列检测器语言设计:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;USE IEEE.STD_LOGIC_ARITH.ALL;entity xulie2 isport (clk,x:in std_logic;y:in std_logic;k:in std_logic_vector(7 downto 1);unlk:out std_logic;q:out std_logic_vector(7 downto 1)); end xulie2;architecture art of xulie2 issignal a:std_logic_vector(7 downto 1);signal combination: std_logic_vector(7 downto 1);beginprocess(clk)beginif clk'event and clk='1' thena<=a(6 downto 1)&x;if y='1' thencombination<="1110010";else combination<=k;end if;end if;q<=a;end process;unlk<='1' when(a=combination) else '0';end art;序列检测器波形图:其中ENDTIME=10.0us GRIDSIZE=100.0ns波形图分析:如图,选择输入端y输入为1时,q对应着输出从x输入的7位序列,如果从x输入的待检测的7位序列为1110010时,unlk为1,否则为0,当选择输入端y输入为0时,q依旧对应着输出从x输入的待检测的当前7为序列,但是只有当从x输入的7为序列与从k输入的7位序列一致时,输出端unlk才为1,否则为0。
高等教育工科序列检测器的实验报告

序列检测器实验一、实验目的1、掌握序列检测器的工作原理;2、掌握时序电路的经典设计方法;3、学习AHDL 语言的状态机的设计方法;二、实验内容设计一个1110010 序列检测器,即检测器连续收到一组串行码“1110010”后,输出检测标志1,否则输出0。
要求用图形输入法完成:①作状态图和状态表;②状态化简,建立最简状态表;③写出状态编码;画出状态编码表;④建立激励函数,输出函数真值表;⑤写出激励函数和输出函数表达式;⑥画出逻辑电路测试图;⑦逻辑功能仿真,记录仿真波形并加以说明;⑧下载验证(两种以上的方式)。
三、实验平台及实验方法用电路图输入法完成序列检测器,对其进行逻辑功能运用MaxplusII软件进行波形仿真再结合FPGA(即对试验箱的芯片进行编译)下载验证。
四、实验原理代码序列检测器是一种同步时序电路,它用于搜索,检测输入的二进制代码串中是否出现指定的代码序列,001 序列检测器的原理图如下:实验设计(每收到一次信号时钟必须有一次上升沿)状态编码状态命名输入(x)0 1000 收到1个0 S0 000(s0)/0 001(s1)/0 001 收到1个1 S1 000(s0)/0 011(s2)/0 011 收到11 S2 000(s0)/0 010(s3)/0 010 收到111 S3 110(s4)/0 010(s3)/0 110 收到1110 S4 100(s5)/0 001(s1)/0 100 收到11100 S5 000(s0)/0 101(s6)/0 101 收到111001 S6 111(s7)/1 011(s2)/0 111 收到1110010 S7 000(s0)/0 001(s1)/0卡诺图化简Q1* Q2*00 01 11 10 00 0 0 1 0 01 0 1 0 0 11 0 0 0 0 1011Q3* 00 01 11 10 00 0 0 1 1 01 0 1 1 1 11 0 0 1 0 1013212133132321313212321321321''*''''''*''''''*Q Q Q XQ XQ Q Q XQ Q XQ Q Q Q Q XQ Q Q Q Q Q Q XQ Q Q Q X Q Q X Q ++=++++=++= D 触发器 OR5五、实验操作门电路图实验过程:1.启动MaxplusII 软件;2.新建一个逻辑图编辑界面,点Max+plus II Grahic Editor ,根据逻辑原理图编辑逻辑图;00 01 11 10 00 0 0 0 0 01 0 1 1 1 11 0 0 0 1 1011XQ1Q2Q3Q2Q3XQ1Q2Q3 XQ13.编译。
实验三_用状态机实现序列检测器的设计

实验三_用状态机实现序列检测器的设计引言:序列检测器是一类常用的电子设计电路,它在接收到特定的输入序列时,会产生特定的输出序列。
在许多应用场景中,如通信系统、数字信号处理和自动控制等领域,序列检测器都发挥着重要的作用。
本实验将利用状态机的概念,设计并实现一个简单的序列检测器。
一、序列检测器的设计原理序列检测器的设计原理基于状态机的思想。
状态机是一种抽象的计算模型,它由一组状态、一组输入和一组转移动作组成。
在序列检测器中,输入序列被连续地输入,状态也会根据输入进行不断变化。
当状态机检测到了预设的特定输入序列时,就会产生相应的输出序列。
二、序列检测器的设计步骤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时,输出低电平。
(整理)实验三序列发生器与序列检测器实验报告.

南昌大学实验报告姓名: 学号:6100210173 专业班级:中兴通信101实验类型:验证□综合■设计□创新□实验日期:2012、11、16实验四序列信号发生器与检测器设计一、实验目的1、.学习VHDL文本输入法2、学习有限状态机的设计3、设计序列信号发生器和检测器二.实验内容与要求1. 设计序列发生器,完成序列为0111010011011010的序列生成器2.用有限状态机设计序列检测器,实现串行序列11010的检测器3. 若检测到符合要求的序列,则输出显示位为“1”,否则为“0”4. 对检测到的次数计数三.设计思路1.设计分频器因为最终要把待检测序列的检测次数在数码管上显示出,所以必须设计一个分频器,将起始频率作为数码管的扫描频率,而将分频后的频率作为序列发生器的移位频率,所以在程序中设置10KHZ进行分频分成1HZ脉冲(10KHZ的扫描频率是为了让数码管的动态显示更加清晰)2.设计序列发生器在这次的设计序列发生器时没有用状态转移的方法来来形成一个16位的序列,而是通过直接设计一串16位的序列,通过对最高位的输出与并置来形成一串循环的16位序列,这样设计简单方便,易于操作与控制,也减少了在状态转移产生的误差,其主要的核心程序为:architecture bhv of p2 issignal bs: std_logic_vector(15 downto 0):="0111010011011010";beginxlout<=bs(15);process (clk1hz)beginif (clk1hz'event and clk1hz='1') thenbs<= bs(14 downto 0)&bs(15);先将序列最高位输出至序列检测器中,然后在一个脉冲作用下,将此时最高位变成最低位,其余14位不变,使序列循环移动,最终形成一个16位循环序列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌大学实验报告姓名: 学号:6100210173 专业班级:中兴通信101实验类型:验证□综合■设计□创新□实验日期:2012、11、16实验四序列信号发生器与检测器设计一、实验目的1、.学习VHDL文本输入法2、学习有限状态机的设计3、设计序列信号发生器和检测器二.实验内容与要求1. 设计序列发生器,完成序列为0111010011011010的序列生成器2.用有限状态机设计序列检测器,实现串行序列11010的检测器3. 若检测到符合要求的序列,则输出显示位为“1”,否则为“0”4. 对检测到的次数计数三.设计思路1.设计分频器因为最终要把待检测序列的检测次数在数码管上显示出,所以必须设计一个分频器,将起始频率作为数码管的扫描频率,而将分频后的频率作为序列发生器的移位频率,所以在程序中设置10KHZ进行分频分成1HZ脉冲(10KHZ的扫描频率是为了让数码管的动态显示更加清晰)2.设计序列发生器在这次的设计序列发生器时没有用状态转移的方法来来形成一个16位的序列,而是通过直接设计一串16位的序列,通过对最高位的输出与并置来形成一串循环的16位序列,这样设计简单方便,易于操作与控制,也减少了在状态转移产生的误差,其主要的核心程序为:architecture bhv of p2 issignal bs: std_logic_vector(15 downto 0):="0111010011011010";beginxlout<=bs(15);process (clk1hz)beginif (clk1hz'event and clk1hz='1') thenbs<= bs(14 downto 0)&bs(15);先将序列最高位输出至序列检测器中,然后在一个脉冲作用下,将此时最高位变成最低位,其余14位不变,使序列循环移动,最终形成一个16位循环序列。
3.设计序列检测器基本思想是采用有限状态机设计,通过状态的转移来实现被检测序列的的检测,首先设定6个状态S0 S1 S2 S3 S4 S5 通过这6个状态的转移情况来检测出11010这个序列。
但因为序列发生器发生的序列不断循环过程中也会出现一些类似11010的特殊序列,则在状态转移中则需要通过一些状态的变换来检测出里面包含的11010序列,如下文所讲的两种特殊情形便是我们序列发生器产生序列中出现的特殊序列:(1)在序列发生器产生序列不断循环过程中出现该序列1110100,此序列中也有一个要检测到的序列但在状态转移过程需要注意:1 1 1 0 1 0 0 S0 S1 S2 S2 S3 S4 S5 S0即当S2状态转移到S3状态时,如果此时序列值为1,则只需转移到状态本身S2而不需要转移至S0,这样即可节约转移时间也可提高检测效率,之后的状态按正常转移并且最后从状态S5回到S0。
(2)在序列发生器产生序列不断循环过程中出现该序列110110100,此序列中也有一个要检测到的序列但是在状态团转移时同样需要注意:1 1 0 1 1 0 1 0 0 S0 S1 S2 S3 S4 S2 S3 S4 S5 S0 即当状态S4转移到S5状态时,如果此时序列值为1,则需要将状态转移至S2状态,从S2状态重新开始检测,而不需要转移至S0,之后其它状态正常转移并且最后由S5状态转移至S0状态。
从上面的流程图可以看出所有的回路在检测完一次序列后在下一次没有该序列时会流向初始状态S0,而当两个或多个被检测序列连续在一起时,状态S5会跳过状态S0直接转移至状态S1完成序列的的检测,直到检测完后再次回到初始状态S0,并且为了避免上面所讲的两种特殊序列在状态转移都进行了改进,在状态S2至状态S3时若序列值为1则返回自身,消除第一种特殊情况下序列的检测问题,在状态S4至状态S5时若序列值为1返回到状态S2,消除第二种特殊情况对1101016序列的检测。
3、此外在设计序列检测器时,为了使实验现象更明显,更好的观测序列的的移动与检测情况我使用了5个LED 分别来显示最新产生的五个序列位,分别输出到端口ledag(4),ledag(3),ledag(2),ledag(1),ledag(0)实现程序语句如下if(clk1hz'event and clk1hz='1') thenledag(4)<=ledag(3);---移位输出显示在led 上以便观看S1S0S4S3S20 110 111S5ledag(3)<=ledag(2); ledag(2)<=ledag(1); ledag(1)<=ledag(0);ledag(0)<=xlout;--将最近生产的序列赋给最前端的ledge(0)位 end if; 4、设计计数器模块因为序列发生器产生的序列不断地循环,待检测序列11010的个数很多,则在程序中设计计数模块,当序列检测器模块检测完一次待检测序列11010时产生一次下降沿,而计数器模块通过该下降沿进行计数自动加一,因为用两个数码管来表示待检测序列的个数,所以计数模块取上限为99即用数码管译码模块将计数值在数码管表示出来时最多能计99检测序列之后清零重新计数,这样设计之后比通过LED 的亮灭来统计被检测序列的个数更加具体直观。
四、实验程序(程序来源于自己编写) --总的设计模块如图所示:--分频器模块library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity p1 isrt(clk:in std_logic;clk1hz:out std_logic --分频的频率1HZ 的输出端口 ); end p1;architecture behave of p1 isSignal Clk_Count1 : std_logic_vector(13 downto 0); beginprocess(clk) --将10KHZ 的频率分频成1HZ beginif(Clk'event and Clk='1') then if(Clk_Count1<10000) thenClk_Count1<=Clk_Count1+1; --在小于10000时,自动加1 elseClk_Count1<="00000000000001"; --超过10000后返回1分频模块序列产生模块序列检测模块100计数模块扫描译码模块流水灯(显示序列移动)模块end if;end if;end process;Clk1Hz<=Clk_Count1(13); --将Clk_Count1的第14位赋给Clk1Hzend behave;--序列发生器模块library ieee;use ieee.std_logic_1164.all;entity p2 isport(clk1hz : in std_logic; --定义输入端口此时频率为1HZxlout : out std_logic --输出序列发生器产生的序列端口);end entity;architecture bhv of p2 issignal bs: std_logic_vector(15 downto 0):="0111010011011010";beginxlout<=bs(15); --将bs的第16位值赋给xloutprocess (clk1hz)beginif (clk1hz'event and clk1hz='1') thenbs<= bs(14 downto 0)&bs(15); --前15位保持不变,将bs的第16位并到最前来形成序列的循环end if;end process;end bhv;--序列检测器模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity p3 isport( clr :in std_logic; --清零端口clk1hz:in std_logic; --输入信号频率xlout : in std_logic; --输入序列result: out std_logic);end entity;architecture bhv of p3 istype state_value is(s0,s1,s2,s3,s4,s5); --定义6个状态signal state: state_value;signal dclk: std_logic;beginresult<=dclk;process (clr,clk1hz)beginif (clr='0') then state<=s0; dclk<='0'; --检测输入序列“11010”由左开始elsif(clk1hz'event and clk1hz='0') thencase state iswhen s0=> if xlout='1' then --序列值为1S0转态S1,若序列值为0,返回自身state<=s1;else state<=s0;end if;when s1=> if xlout='1' thenstate<=s2;else state<=s0;end if;when s2=> if xlout='0' then --序列值为1,S2转向自身,序列值为0,转向S3 state<=s3;else state<=s2;end if;when s3=> if xlout='1' thenstate<=s4;else state<=s0;end if;when s4=> if xlout='0' then --序列值为0,S4转向S5,输出端为1state<=s5; dclk<='1';else state<=s2; --若此时序列值为1,S4转向S2end if;when s5=> if xlout='0' then --序列值1,S5转移至S1,若为0,转向S0state<=s0;else state<=s1;end if;dclk<='0';when others => state<=s0; --其它状态都将返回初始状态end case;end if;end process;end bhv;--100计数模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity p5 isport( result:in std_logic; --前面序列检测模块中检测到序列后产生的跳变信号d6,d7: out std_logic_vector(3 downto 0) --定义十位个位数值);end entity;architecture behave of p5 issignal cnt0,cnt1:std_logic_vector(3 downto 0):="0000"; --初始化beginprocess (result)beginif (result'event and result='0') thenif (cnt0="1001" and cnt1="1001") then --设置计数上限为99cnt0<="0000"; cnt1<="0000";elsif (cnt0="1001") then --BCD码的调整cnt0<="0000";cnt1<=cnt1+1; --接受跳变信号后自动加1计数else cnt0<=cnt0+1;end if;end if;end process;d6<=cnt1;d7<=cnt0;end behave;--数码管译码模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity p6 isport(clk:in std_logic; --扫描频率10KHZ的输入端口sel0,sel1,sel2:buffer std_logic; --数码管的位选信号sg:out std_logic_vector(6 downto 0); --数码管的段选sel:out std_logic_vector(7 downto 0);d6,d7:in std_logic_vector(3 downto 0) --计数模块中个位十位的数值);end p6;architecture behave of p6 issignal cnt:std_logic_vector(1 downto 0);signal A:std_logic_vector(3 downto 0);beginprocess(clk)beginif clk'event and clk='1' thenif cnt<"01" then cnt<=cnt+1;else cnt<=(others=>'0');end if;end if;sel(0)<=sel0;sel(1)<=sel1;sel(2)<=sel2;case cnt iswhen "00"=>sel2<='1';sel1<='1';sel0<='1';A<=d7; --选择数码管的位置when "01"=>sel2<='1';sel1<='1';sel0<='0';A<=d6;when others=>null;end case;end process;process(A)begincase A iswhen "0000" =>sg<="0111111"; --数码管显示值为0时的译码值when "0001" =>sg<="0000110";when "0010"=>sg<="1011011";when "0011"=>sg<="1001111";when "0100"=>sg<="1100110";when "0101"=>sg<="1101101";when "0110"=>sg<="1111101";when "0111"=>sg<="0000111";when "1000"=>sg<="1111111";when "1001"=>sg<="1101111";when others=>null;end case;end process;end behave;--显示序列移动模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity p4 isport(clk1hz:in std_logic; --分频后的频率输入端口xlout:in std_logic; --序列发生器产生的序列ledag :buffer std_logic_vector(4 downto 0) --5位序列值的输出口);end p4;architecture behave of p4 isbeginprocess(clk1hz)beginif(clk1hz'event and clk1hz='1') thenledag(4)<=ledag(3); --序列值向左移动 ledag(3)<=ledag(2); ledag(2)<=ledag(1); ledag(1)<=ledag(0);ledag(0)<=xlout; --将最近生产的序列赋给最前端的ledge(0)位 end if;end process; end behave;四. 实验步骤 1. 建立工程项目2. 在VHDL 编辑窗口下写好程序,并保存3、进行全编译,没有错误。