实验五 用状态机实现序列检测器的设计
- 格式:doc
- 大小:246.50 KB
- 文档页数:4
实验报告用状态机实现序列检测器实验一、实验目的1.用Verilog HDL描述有限状态机电路。
2.IPCORE的概念与设计。
二、实验内容1.应用有限状态机的设计思路,检测从FPGA片上ROM读出的串行数据是否是特定的数据。
2.每个人需要检测的数据是所用的电脑编号+200后转换的8位二进制数。
三、实验要求1.拟用按键、拨动开关实现系统的时钟,复位信号的输入。
2.一个7段数码显示译码器作为检测结果的输出显示,如果串行序列为”100101”,显示A,否则显示b(系统需要设计一个7段数码显示译码器模块)仍使用消抖模块,对由按键输入的时钟进行消抖处理。
3.读取的串行数据为rom中固化的一个宽度为1bit,深度为16bits的数据。
四、设计思路软件的设计框图如下,该实验可以分为几个模块,rom数据读出模块,串行检测模块,数码管显示模块,顶层模块。
输入的clk为按键消抖后输出的数据,按下一次检测一次,在时钟的上升沿读出数据,时钟的下降沿检测数据,串行模块输出的4bits的数据,直接送给数码管译码模块,译码输出。
五、设计原理1.ROM IP核的生成首先在ISE自己的工程中新建一个块内存,Block Memory Generator,配置深度为16,宽度为1bit,选择生成的类型为单端ROM,然后选择一个已经编写好的memory初始化文件。
Memory初始化文件,编写coe文件:这里我要写入的是226,所以二进制是11100010,写入的内容如下,:memory_initialization_radix=10;memory_initialization_vector=1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0;保存并选择载入。
2.读取rom中的数据根据时钟上升沿读取数据,所以可以写出rom读的代码,代码如下:module read_rom(clk,da,rst);input clk;input rst;output da;reg[3:0] counter;always@(posedge clk or posedge rst) beginif(rst)counter<=1'b0;else counter<=counter+1'b1;enddata_rom u1(.clka(clk), // input clka.addra(counter), // input [3 : 0] addra.douta(da) // output [0 : 0] douta);编写仿真激励文件,得到如下波形,分析可以知道,时钟上升沿数据被读取,读取的数据与我们在配置文件中写入的相同。
实验三用状态机实现序列检测器的设计一、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
二、原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出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种状态。
实验三_⽤状态机实现序列检测器的设计实验三⽤状态机实现序列检测器的设计⼀、实验⽬的:⽤状态机实现序列检测器的设计,并对其进⾏仿真和硬件测试。
⼆、原理说明:序列检测器可⽤于检测⼀组或多组由⼆进制码组成的脉冲序列信号,当序列检测器连续收到⼀组串⾏⼆进制码后,如果这组码与检测器中预先设置的码相同,则输出a,否则输出b。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前⼀次的正确码及正确序列,直到在连续的检测中所收到的每⼀位码都与预置数的对应码相同。
在检测过程中,任何⼀位不相等都将回到初始状态重新开始检测。
例3-1描述的电路完成对序列数"11100101"的。
当这⼀串序列数⾼位在前(左移)串⾏进⼊检测器后,若此数与预置的密码数相同,则输出“a”,否则仍然输出“b”。
【例3-1】//顶层⽂件: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);endmodule//串⾏检测: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,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;e: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 ;endendmodule//前端预置8位数据输⼊:module xulie(clk, din8, reset, din); input clk;input[7:0] din8;input reset;output din;parameters0 = 3'b000,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;endnext_state <= s6;ends6 : begindin <= din8[1];next_state <= s7;ends7 : begindin <= din8[0];next_state <= s0;enddefault : begindin <= 1'b0;next_state <= s0;endendcaseendendmodule提⽰:1.若对于D <= "11100101 ",电路需记忆:初始状态、1、11、111 、1110 、11100、111001、1110010、11100101共9种状态。
数字系统设计与PLD应用实验报告实验名称:实验5序列检测器学院:大数据与信息工程学院专业:电子信息工程姓名:李晓雪学号:1108040198年级:大四任课教师:尉学军2014 年 12 月 7 日实验5 序列检测器一.实验目的(1)了解用状态机的方法设计序列检测器(2)实验一个11010串行序列检测器,用VHDL语言描述该电路二、实验原理序列检测器的示意图如图一所示11010序列检测器的状态转换图如图二所示三、实验内容(1)用VHDL语言编写11010序列检测器源程序。
给出正确仿真波形图。
(2)用VHDL分别设计一个包含(11010)和不包含的序列发生器。
(3)将上述两个序列发生器分别和序列检测器结合成一个文件(级联),并编译、模拟获得正确的仿真波形。
四、实验结果1、序列检测器(检测11010)根据状态转换通过VHDL语言实现序列检测器:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY jc11010 ISPORT(DIN,CLK,RST:IN STD_LOGIC;SOUT:OUT STD_LOGIC);END jc11010 ;ARCHITECTURE BEHA V OF jc11010 ISTYPE STATES IS (S0,S1,S2,S3,S4);SIGNAL ST,NST:STA TES:=S0;BEGINCOM:PROCESS(ST,DIN) BEGINCASE ST ISWHEN S0=>IF DIN='1'THEN NST<=S1;ELSE NST<=S0;END IF; WHEN S1=>IF DIN='1'THEN NST<=S2;ELSE NST<=S0;END IF; WHEN S2=>IF DIN='1' THEN NST<=S2;ELSE NST<=S3;END IF; WHEN S3=>IF DIN='1' THEN NST<=S4;ELSE NST<=S0;END IF; WHEN S4=>IF DIN='1' THEN NST<=S2;ELSE NST<=S0;END IF; WHEN OTHERS=>NST<=S0;END CASE;END PROCESS;REG:PROCESS (CLK,RST)BEGINIF RST='1' THEN ST<=S0;ELSIF CLK'EVENT AND CLK='1' THEN ST<=NST;END IF;END PROCESS REG;SOUT<='1' WHEN ST=S4 ELSE '0';END BEHA V;波形仿真结果:2.采用状态机方法设计序列发生器11010序列产生器的VHDL语言:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY csq11010 ISPORT(CLK:IN STD_LOGIC;Z :OUT STD_LOGIC);END csq11010 ;ARCHITECTURE RTL OF csq11010 ISTYPE STATE_TYPE IS(S0,S1,S2,S3,S4,S5);SIGNAL CURRENT_STATE,NEXT_STATE:STATE_TYPE; BEGINSYNCH: PROCESSBEGINWAIT UNTIL CLK'EVENT AND CLK='1'; CURRENT_STATE<=NEXT_STATE;END PROCESS;STATE_TRANS:PROCESS(CURRENT_STATE)BEGINCASE CURRENT_STATE ISWHEN S0=>NEXT_STATE<=S1;Z<='1';WHEN S1=>NEXT_STATE<=S2;Z<='1';WHEN S2=>NEXT_STATE<=S3;Z<='0';WHEN S3=>NEXT_STATE<=S4;Z<='1';WHEN S4=>NEXT_STATE<=S5;Z<='0';WHEN S5=>NEXT_STATE<=S0;Z<='1';END CASE;END PROCESS;END RTL;仿真波形结果:(产生的11010序列串)3、随机序列产生器(产生序列1100101)VHDL语言:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SY4 ISPORT(CLK:IN STD_LOGIC;Z :OUT STD_LOGIC);END SY4 ;ARCHITECTURE RTL OF SY4 ISTYPE STATE_TYPE IS(S0,S1,S2,S3,S4,S5,S6);SIGNAL CURRENT_STATE,NEXT_STA TE:STA TE_TYPE; BEGINSYNCH: PROCESSBEGINWAIT UNTIL CLK'EVENT AND CLK='1';CURRENT_STATE<=NEXT_STA TE;END PROCESS;STA TE_TRANS:PROCESS(CURRENT_STATE)BEGINCASE CURRENT_STATE ISWHEN S0=>NEXT_STATE<=S1;Z<='1';WHEN S1=>NEXT_STATE<=S2;Z<='1';WHEN S2=>NEXT_STATE<=S3;Z<='0';WHEN S3=>NEXT_STATE<=S4;Z<='0';WHEN S4=>NEXT_STATE<=S5;Z<='1';WHEN S5=>NEXT_STATE<=S6;Z<='0';WHEN S6=>NEXT_STATE<=S0;Z<='1';END CASE;END PROCESS;END RTL;波形仿真结果:3、11010序列产生器与11010序列检测器级联后的电路图:波形仿真结果:4、不包含11010的任意序列产生器与11010序列检测器级联后的电路图:波形仿真结果:。
实验三_用状态机实现序列检测器的设计
一、实验目的
①了解序列检测器的基本原理;
②使用状态机模型设计序列检测器;
③理解状态机的工作原理,以及应用状态机设计逻辑电路的思想与方法。
二、实验原理
序列检测器,又称序列检测器或序列检测装置,是将输入的序列信号,与一个事先给定的序列模式进行比较,以判断输入信号是否与给定的模式
相匹配。
当输入信号与给定模式完全匹配时,则检测出一个正确的模式序列。
如果输入的信号不与模式相匹配,则认为出错,并给出错误信号。
序列检测器有很多的组成部分,包括输出寄存器,状态寄存器,比较
状态机,其中比较状态机是序列检测器最重要的组成部分。
它主要功能是:获取模式序列,比较模式和输入序列,并根据比较结果生成对应的输出信号。
具体来说,比较状态机包括:输入处理模块,状态比较模块,指令控
制模块和输出触发模块。
三、实验内容
1、设计一个比较状态机,用于检测并确定序列是否与给定的模式序
列相同。
2、使用VHDL绘制比较状态机的模型,并编写代码实现。
3、真实应用比较状态机,设计一个校验器,用于检测序列是否符合一定的校验规则。
数字电路与逻辑计实验报告序列信号检测器的设计与实现一、课题名称:序列信号检测器的设计与实现二、实验目的:(1)熟悉用VHDL语言设计时序逻辑电路的方法;(2)熟悉序列信号检测器的设计方法;(3)了解状态机的设计方法。
三、实验所用仪器及元器件:(1)计算机(2)直流稳压电源(3)数字系统与逻辑设计实验开发板四、实验内容:用VHDL语言设计实现一个序列信号检测器,当检测到“101”时,输出为“1”;其他情况时,输出为“0”,仿真验证其功能,并下载到实验板测试。
五、设计思路与过程:第1步,画出原始状态图和状态表。
根据任务书要求,设计的序列检测器有一个外部输入x和一个外部输出Z。
输入和输出的逻辑关系为:当外部输入x第一个为“1”,外部输出Z为“0”;当外部输入x第二个为“0”,外部输出Z为“0”;当外部输入x第三个为“1”,外部输出Z才为“1”。
假定有一个外部输入x序列以及外部输出Z为:输入x: 0 1 0 1 1 1 0 1 1 1 1 0 1输出Z: 0 0 0 1 0 0 0 1 0 0 0 0 1要判别序列检测器是否连续接收了“101”,电路必须用不同的状态记载外部输入x的值。
假设电路的初始状态为A,x输入第一个值“1”,检测器状态由A装换到B,用状态B记载检测器接受了101序列的第一个值“1”,这时外部输出Z=0;x输入“0”,检测器状态由B装换到C,用状态C记载检测器接受了101序列的第二个值“0”,外部输出Z=0;x输入第三个值“1”,检测器状态由C装换到D,外部输出Z=1。
然后再根据外部输入及其他情况时的状态转移,写出相应的输出。
以上分析了序列检测器工作,由此可画出图一所示的原始状态图。
根据原始状态图可列出原始状态表,如表一所示。
0/0图一原始状态图表一:原始状态表第2步,在对原状态表进行简化,从状态表就可以看出B 、D 两个状态为等价状态。
从而可得简化后的状态表表二和状态图图二:图二 简化状态图表二:简化后的状态表第3步,状态分配:给A 分配编码00,B 分配01,C 分配11,则可得状态转移表三:表三:简化后的状态转移表第4步,选择存储器的类型,确定存储电路的激励输入: 选择使用D 触发器来完成此任务。
序列检测器设计实践报告一、引言序列检测器是现代通信系统中的关键组件之一,它能够检测出接收到的数据序列是否符合特定规则或模式。
在本次实践中,我们通过使用Verilog HDL 语言和ModelSim 软件,成功设计了一个基于有限状态机的序列检测器。
本报告将详细介绍设计实践的目标、设计思路、实现过程以及结果与分析。
二、设计目标本次实践的设计目标是设计一个序列检测器,其输入为一串二进制数据序列,输出为判断该数据序列是否符合预定的模式。
具体要求如下:1. 输入数据序列长度为N。
2. 设计的状态机模型能够正确判断数据序列是否匹配给定的模式。
3. 能够根据实际需要,设计一个可重用的序列检测器。
三、设计思路为了实现序列检测器,我们采用了有限状态机(Finite State Machine)的设计方法。
基于有限状态机的序列检测器通常包含以下几个关键部分:1. 状态寄存器(State Register):用于保存当前状态的寄存器。
2. 状态转移逻辑(State Transition Logic):用于根据当前状态和输入决定下一状态。
3. 输出逻辑(Output Logic):用于根据当前状态和输入决定输出。
在本次实践中,我们根据识别特定序列的要求设计了一个有限状态机模型。
具体步骤如下:1. 根据给定的数据序列模式,分析出可能的状态数以及状态转移条件。
2. 基于状态数和状态转移条件,设计状态转移表和状态转移条件的真值表。
3. 使用Verilog HDL语言,将状态寄存器、状态转移逻辑和输出逻辑实现为模块。
4. 将各个模块组合在一起,以实现完整的序列检测器。
四、实现过程1. 建立状态转移表和真值表根据给定的数据序列模式,我们设定了以下状态:- `S0`:初始状态;- `S1`:序列开始状态;- `S2`:序列匹配状态;- `S3`:序列不匹配状态。
根据分析,我们得到以下状态转移表和状态转移条件的真值表:状态/输入0 1S0 S1 S0S1 S2 S0S2 S2 S3S3 S1 S0状态/输入输出-S2 1S3 02. 实现Verilog HDL模块我们根据状态转移表和真值表,用Verilog HDL语言实现了状态寄存器、状态转移逻辑和输出逻辑。
序列检测器实验报告序列检测器是一种常见的信号处理技术,广泛应用于通信、雷达、生物医学和金融等领域。
本文将介绍序列检测器的原理、实验设计和实验结果,并对其应用进行讨论。
一、序列检测器的原理序列检测器是一种用于检测和识别输入信号序列的设备或算法。
它通过对输入信号进行观测和分析,判断信号是否符合特定的模式或规律。
常见的序列检测器包括有限状态机、卷积神经网络和隐马尔可夫模型等。
有限状态机是一种基本的序列检测器,它由一组状态和状态之间的转移规则组成。
在每个时刻,输入信号会触发状态之间的转移,最终达到一个终止状态。
通过定义状态和转移规则,可以实现对输入信号序列的检测和识别。
二、实验设计本实验旨在设计并实现一个简单的序列检测器,用于检测二进制信号序列中是否存在特定的模式。
实验使用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"的存在。
实验五用状态机实现序列检测器的设计序列检测器是一种可以根据输入序列的模式检测和识别特定序列的设备或系统。
在计算机科学和电子工程中,状态机常常被用来实现序列检测器。
状态机是一种抽象的数学模型,具有有限数量的状态和状态转换函数。
本实验将通过使用状态机来实现一个序列检测器。
在序列检测器的设计中,我们需要定义输入序列的模式,并根据这个模式来设计状态机。
在这个例子中,我们将设计一个简单的序列检测器,用来检测输入序列是否包含连续的3个1首先,我们需要定义状态。
在本实验中,我们定义两个状态:初始状态和检测状态。
初始状态是状态机的起始状态,它等待输入序列的开始。
检测状态表示状态机已经开始检测输入序列,并且可能已经识别到了一部分符合要求的序列。
然后,我们需要定义状态转换函数。
状态转换函数描述了状态机在不同状态下如何根据输入来转换到其他状态。
在本实验中,我们定义以下状态转换函数:1.当输入位为0时,状态机保持在当前状态;2.当输入位为1且当前状态为初始状态时,状态机转换到检测状态;3.当输入位为1且当前状态为检测状态时,状态机保持在检测状态。
最后,我们需要确定终止状态。
在本实验中,当状态机识别到连续的3个1时,我们将状态机置于终止状态,并输出一个信号表明已经检测到了整个序列。
通过以上步骤,我们已经定义了一个简单的序列检测器的状态机。
下面是一个简单的状态机实现的示例代码:```#define INITIAL_STATE 0#define DETECTION_STATE 1#define TERMINATE_STATE 2int state = INITIAL_STATE;int count = 0;void detect_sequence(int input)switch(state)case INITIAL_STATE:if (input == 1)state = DETECTION_STATE;count = 1;}break;case DETECTION_STATE:if (input == 1)count++;if (count == 3)state = TERMINATE_STATE;output_signal(;}} elsestate = INITIAL_STATE;count = 0;}break;case TERMINATE_STATE:// do nothingbreak;}void output_signa// output signal here```在上述代码中,我们使用一个整型变量`state`来表示状态,一个整型变量`count`来表示检测到的连续1的数量。
数字系统设计与PLD应用实验报告实验名称:实验5序列检测器学院:大数据与信息工程学院专业:电子信息工程姓名:李晓雪学号:1108040198年级:大四任课教师:尉学军2014 年 12 月 7 日实验5 序列检测器一.实验目的(1)了解用状态机的方法设计序列检测器(2)实验一个11010串行序列检测器,用VHDL语言描述该电路二、实验原理序列检测器的示意图如图一所示11010序列检测器的状态转换图如图二所示三、实验内容(1)用VHDL语言编写11010序列检测器源程序。
给出正确仿真波形图。
(2)用VHDL分别设计一个包含(11010)和不包含的序列发生器。
(3)将上述两个序列发生器分别和序列检测器结合成一个文件(级联),并编译、模拟获得正确的仿真波形。
四、实验结果1、序列检测器(检测11010)根据状态转换通过VHDL语言实现序列检测器:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY jc11010 ISPORT(DIN,CLK,RST:IN STD_LOGIC;SOUT:OUT STD_LOGIC);END jc11010 ;ARCHITECTURE BEHA V OF jc11010 ISTYPE STATES IS (S0,S1,S2,S3,S4);SIGNAL ST,NST:STA TES:=S0;BEGINCOM:PROCESS(ST,DIN) BEGINCASE ST ISWHEN S0=>IF DIN='1'THEN NST<=S1;ELSE NST<=S0;END IF; WHEN S1=>IF DIN='1'THEN NST<=S2;ELSE NST<=S0;END IF; WHEN S2=>IF DIN='1' THEN NST<=S2;ELSE NST<=S3;END IF; WHEN S3=>IF DIN='1' THEN NST<=S4;ELSE NST<=S0;END IF; WHEN S4=>IF DIN='1' THEN NST<=S2;ELSE NST<=S0;END IF; WHEN OTHERS=>NST<=S0;END CASE;END PROCESS;REG:PROCESS (CLK,RST)BEGINIF RST='1' THEN ST<=S0;ELSIF CLK'EVENT AND CLK='1' THEN ST<=NST;END IF;END PROCESS REG;SOUT<='1' WHEN ST=S4 ELSE '0';END BEHA V;波形仿真结果:2.采用状态机方法设计序列发生器11010序列产生器的VHDL语言:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY csq11010 ISPORT(CLK:IN STD_LOGIC;Z :OUT STD_LOGIC);END csq11010 ;ARCHITECTURE RTL OF csq11010 ISTYPE STATE_TYPE IS(S0,S1,S2,S3,S4,S5);SIGNAL CURRENT_STATE,NEXT_STATE:STATE_TYPE; BEGINSYNCH: PROCESSBEGINWAIT UNTIL CLK'EVENT AND CLK='1'; CURRENT_STATE<=NEXT_STATE;END PROCESS;STATE_TRANS:PROCESS(CURRENT_STATE)BEGINCASE CURRENT_STATE ISWHEN S0=>NEXT_STATE<=S1;Z<='1';WHEN S1=>NEXT_STATE<=S2;Z<='1';WHEN S2=>NEXT_STATE<=S3;Z<='0';WHEN S3=>NEXT_STATE<=S4;Z<='1';WHEN S4=>NEXT_STATE<=S5;Z<='0';WHEN S5=>NEXT_STATE<=S0;Z<='1';END CASE;END PROCESS;END RTL;仿真波形结果:(产生的11010序列串)3、随机序列产生器(产生序列1100101)VHDL语言:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SY4 ISPORT(CLK:IN STD_LOGIC;Z :OUT STD_LOGIC);END SY4 ;ARCHITECTURE RTL OF SY4 ISTYPE STATE_TYPE IS(S0,S1,S2,S3,S4,S5,S6);SIGNAL CURRENT_STATE,NEXT_STA TE:STA TE_TYPE; BEGINSYNCH: PROCESSBEGINWAIT UNTIL CLK'EVENT AND CLK='1';CURRENT_STATE<=NEXT_STA TE;END PROCESS;STA TE_TRANS:PROCESS(CURRENT_STATE)BEGINCASE CURRENT_STATE ISWHEN S0=>NEXT_STATE<=S1;Z<='1';WHEN S1=>NEXT_STATE<=S2;Z<='1';WHEN S2=>NEXT_STATE<=S3;Z<='0';WHEN S3=>NEXT_STATE<=S4;Z<='0';WHEN S4=>NEXT_STATE<=S5;Z<='1';WHEN S5=>NEXT_STATE<=S6;Z<='0';WHEN S6=>NEXT_STATE<=S0;Z<='1';END CASE;END PROCESS;END RTL;波形仿真结果:3、11010序列产生器与11010序列检测器级联后的电路图:波形仿真结果:4、不包含11010的任意序列产生器与11010序列检测器级联后的电路图:波形仿真结果:。
实验五用状态机实现序列检测器的设计
一、背景简介
序列检测器是用来检测输入字符串中是否存在特定序列的字符串检测器。
在现代的工业控制中,序列检测器的应用十分广泛,例如机器操作指令的检测,机器人的动作序列检测,机械手的加工步骤检测等等,它们可以用在几乎所有的自动控制系统中,既提高了系统的可靠性,又提高了系统的运行效率。
二、状态机实现序列检测器
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”时,输出为高电平,表示检测成功;当输入其他序列时,输出为低电平,表示未检测到目标序列。
实验报告实验中心电子信息技术实验中心专业年级实验课程EDA技术与VHDL 姓名实验名称序列检测器学号提交日期成绩一、实验目的用状态机实现序列检测器的设计,了解一般状态机的设计与应用。
二、实验设备GW48系列SOPC/EDA实验开发系统实验箱一台计算机一台三、实验原理序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
例7-1描述的电路完成对序列数“11100101”的检测,当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则仍然输出“B”。
四、实验内容(一)序列检测器(1)程序LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SCHK ISPORT(DIN,CLK,CLR : IN STD_LOGIC; --串行输入数据位/工作时钟/复位信号AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --检测结果输出END SCHK;ARCHITECTURE behav OF SCHK ISSIGNAL Q : INTEGER RANGE 0 TO 8 ;SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0); --8位待检测预置数(密码=E5H) BEGIND <= "11100101 " ; --8位待检测预置数PROCESS( CLK, CLR )BEGINIF CLR = '1' THEN Q <= 0 ;ELSIF CLK'EVENT AND CLK='1' THEN --时钟到来时,判断并处理当前输入的位CASE Q ISWHEN 0=> IF DIN = D(7) THEN Q <= 1 ; ELSE Q <= 0 ; END IF ;WHEN 1=> IF DIN = D(6) THEN Q <= 2 ; ELSE Q <= 0 ; END IF ;WHEN 2=> IF DIN = D(5) THEN Q <= 3 ; ELSE Q <= 0 ; END IF ;WHEN 3=> IF DIN = D(4) THEN Q <= 4 ; ELSE Q <= 0 ; END IF ;WHEN 4=> IF DIN = D(3) THEN Q <= 5 ; ELSE Q <= 0 ; END IF ;WHEN 5=> IF DIN = D(2) THEN Q <= 6 ; ELSE Q <= 0 ; END IF ;WHEN 6=> IF DIN = D(1) THEN Q <= 7 ; ELSE Q <= 0 ; END IF ; WHEN 7=> IF DIN = D(0) THEN Q <= 8 ; ELSE Q <= 0 ; END IF ; WHEN OTHERS => Q <= 0 ; END CASE ; END IF ; END PROCESS ;PROCESS( Q ) --检测结果判断输出 BEGINIF Q = 8 THEN AB <= "1010" ; --序列数检测正确,输出 “A ” ELSE AB <= "1011" ; --序列数检测错误,输出 “B ” END IF ; END PROCESS ; END behav ;(2)编译成功(3)波形仿真(4)RTL 图A[3..0]B[3..0]OUTEQUALSEL[3..0]DATA[15..0]OUTMUXSEL[3..0]DATA[15..0]OUTMUXSEL[3..0]DATA[15..0]OUTMUXSEL[3..0]DATA[15..0]OUTMUXDQPRE ENACLREqual04' h8 --Mux08' h00 --7' h00 --Mux29' h000 --2' h0 --1' h0 --Mux39' h000 --1' h0 --1' h0 --1' h0 --Q[3..0]CLK CLRAB[3..0]3' h5 --Mux19' h000 --3' h0 --DIN(5)引脚锁定(6)下载(二)(1)VHDL语句LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SCHK1 ISPORT(DIN,CLK,CLR : IN STD_LOGIC;D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END SCHK1;ARCHITECTURE behav OF SCHK1 ISSIGNAL Q : INTEGER RANGE 0 TO 8 ;BEGINPROCESS( CLK, CLR )BEGINIF CLR = '1' THEN Q <= 0 ;ELSIF CLK'EVENT AND CLK='1' THENCASE Q ISWHEN 0=> IF DIN = D(7) THEN Q <= 1 ; ELSE Q <= 0 ; END IF ; WHEN 1=> IF DIN = D(6) THEN Q <= 2 ; ELSE Q <= 0 ; END IF ; WHEN 2=> IF DIN = D(5) THEN Q <= 3 ; ELSE Q <= 0 ; END IF ; WHEN 3=> IF DIN = D(4) THEN Q <= 4 ; ELSE Q <= 0 ; END IF ; WHEN 4=> IF DIN = D(3) THEN Q <= 5 ; ELSE Q <= 0 ; END IF ; WHEN 5=> IF DIN = D(2) THEN Q <= 6 ; ELSE Q <= 0 ; END IF ; WHEN 6=> IF DIN = D(1) THEN Q <= 7 ; ELSE Q <= 0 ; END IF ; WHEN 7=> IF DIN = D(0) THEN Q <= 8 ; ELSE Q <= 0 ; END IF ; WHEN OTHERS => Q <= 0 ;END CASE ;END IF ;END PROCESS ;PROCESS( Q )BEGINIF Q = 8 THEN AB <= "1010" ; ELSE AB <= "1011" ; END IF ; END PROCESS ; END behav ;(2)编译图(3)波形仿真(4)RTL 图A[3..0]B[3..0]OUTEQUALSEL[3..0]DATA[15..0]OUTMUXSEL[3..0]DATA[15..0]OUTMUXSEL[3..0]DATA[15..0]OUTMUXSEL[3..0]DATA[15..0]OUTMUXDQPREENACLREqual04' h8 --Mux08' h00 --7' h00 --Mux29' h000 --2' h0 --1' h0 --Mux39' h000 --1' h0 --1' h0 --1' h0 --process0~0process0~1process0~2process0~3process0~4process0~5process0~6process0~7Q[3..0]DIN CLK CLRD[7..0]AB[3..0]3' h5 --Mux19' h000 --3' h0 --(5)引脚锁定(6)编程下载图六、实验总结。
实验五用状态机实现序列检测器的设计一、实验目的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命令,开始编译。
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.熟悉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;
endcase
end
always @(ns)
begin if(ns==s8) err<=4'b1010;
else err<=4'b1110;
end
endmodule
编译:选择processing---start compilation命令,开始编译。
也可直接点击面板上编译按钮。
结果如图:
RTL Viewer:选择Tools---netlist viewers---RTL viewer命令,查看寄存器电路结构图,结果如图:
状态机转换图。
当输入信号din与预先设定好的序列d完全相同时,仿真结果:
当输入信号din与预先设定好的序列d不完全相同时,仿真结果:
设置引脚,试验箱验证:启动EDA6000,连接试验箱。
装入模式12。
根据右侧管脚提示进行管脚锁定。
在QuartusⅡ界面中选择assignment—pins命令。
可以用拖放的方式指定管脚,也可以在location中输入管脚号。
然后在QuartusⅡ界面中选择tools--- programmer
命令。
在弹出的界面中Mode选为passive serial。
点击add hardware,选择byteblasterMV,
添加驱动成功后,勾选program/configure,点击start,下载文件到试验箱。
点击EDA6000start,开始测试。
结果如图:
五、实验总结
通过本次实验掌握了如何用Verilog HDL语言实现状态机的原理,运用状态机实现序列检测器的设计,进一步掌握了课堂上所学到的知识,但同时充分的感觉到了自己的不足之处,今后一定要加强自己弱势方面的学习,用心学好EDA教科书上的知识,并抽时间在课外进行深入地学习,相信下次试验情况会有很大程度的改观。