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

合集下载

基于verilog的序列检测器设计

基于verilog的序列检测器设计

基于verilog的序列检测器设计作者:周小仨来源:《软件工程师》2015年第03期摘要:随着科技的飞速发展,传统的电子技术逐渐被现代电子技术取代,以FPGA/CPLD 为硬件,以verilog语言为软件的EDA技术应用越来越广泛,本文旨在以一个具体的序列检测器的设计为例,将以硬件描述语言来设计芯片的流程呈现给大家。

关键词:verilog;序列检测器;状态;EDA中图分类号:TP273 文献标识码:A1 引言(Introduction)在数字信号的传输和数字系统产品的设计和测试过程中,往往需要用到一组特定的串行数字信号,我们把产生序列信号的模块电路称作序列信号发生器,如要求产生一串序列“10001110”为例来给大家展示EDA设计有限状态机的过程[1]。

本电路由计数器与数据选择器两部分构成,结构框图如图1所示,该锁存输出的功能是为了消除电路产生的毛刺。

图1 结构框图Fig.1 Structure diagram2 序列检测器的基本工作过程(The basic workingprocess serial detector)有限状态机一般用来检测一组或多组由二进制码组成的脉冲序列信号,广泛应用于在数字系统中。

当该特定序列检测器连续接收到一组二进制码,如果这组二进制码与检测器中预先设置的码能匹配成功,就输出1,否则输出0。

因为该检测的关键在必须连续接受正确码,中间只要出错以为,就必须重新进行检测,所以要求该检测器记住前一次的正确码及正确序列,直到在连续的检测中所有的串行二进制码都能连续匹配成功。

检测二进制码中,只要有任何一位没匹配成功都回到初始状态重新开始匹配[2]。

方框图如图2所示。

图2 状态流程图Fig.2 State flow diagram3 状态机的基本设计思想(The basic design idea ofstate machine)在数字系统中,当状态连续变化,我们可以采用状态机的设计思想来提高设计效率,还可以增加程序的可读性,从而降低错误的概率。

用状态机实现序列检测器实验报告

用状态机实现序列检测器实验报告

实验报告用状态机实现序列检测器实验一、实验目的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);编写仿真激励文件,得到如下波形,分析可以知道,时钟上升沿数据被读取,读取的数据与我们在配置文件中写入的相同。

序列检测器verilog课程设计

序列检测器verilog课程设计

序列检测器verilog课程设计一、课程目标知识目标:1. 掌握Verilog硬件描述语言的基本语法和结构;2. 理解序列检测器的基本原理和工作流程;3. 学会使用Verilog设计并实现序列检测器。

技能目标:1. 能够运用Verilog语言编写简单的数字电路模块;2. 能够对序列检测器进行模块划分,并进行代码编写和仿真;3. 能够分析并解决序列检测器设计过程中遇到的问题。

情感态度价值观目标:1. 培养学生对数字电路设计的兴趣和热情,提高其主动学习的积极性;2. 培养学生的团队协作意识,使其学会在团队中发挥自己的作用;3. 培养学生严谨的学术态度,注重实验数据和结果的分析。

分析课程性质、学生特点和教学要求:本课程为电子与计算机工程专业高年级学生的专业课程,旨在培养学生的硬件设计能力。

学生已具备一定的数字电路基础和Verilog编程能力。

课程要求学生能够独立完成序列检测器的设计和仿真,并在实践中提高自身的问题分析和解决能力。

课程目标分解为以下具体学习成果:1. 能够熟练使用Verilog编写基本的数字电路模块;2. 能够理解和分析序列检测器的工作原理;3. 能够独立完成序列检测器的模块划分、代码编写和功能仿真;4. 能够针对设计过程中遇到的问题进行有效分析和解决;5. 能够在团队项目中发挥自己的优势,为团队贡献力量;6. 能够严谨对待学术问题,注重实验数据和结果的准确性。

二、教学内容1. Verilog基础知识回顾:变量定义、数据类型、运算符、控制语句等;2. 序列检测器原理讲解:序列检测器的功能、应用场景、工作原理及状态机设计方法;3. Verilog模块编写:根据序列检测器原理,编写Verilog代码,包括模块声明、端口定义、逻辑描述等;4. 序列检测器模块划分:对序列检测器进行模块划分,实现模块化设计;5. 代码仿真与调试:使用ModelSim等仿真工具,对Verilog代码进行功能仿真,分析并解决可能出现的问题;6. 实验与分析:结合实际电路,搭建序列检测器,进行验证实验,分析实验结果;7. 团队项目实践:分组进行序列检测器设计,培养学生的团队协作能力和实际操作能力;8. 课程总结与拓展:对本章节内容进行总结,拓展学习其他类型的数字电路设计方法。

序列检测器 verilog

序列检测器 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;}}四、实验总结本实验利用状态机的思想,设计并实现了一个简单的序列检测器。

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

实验三用状态机实现序列检测器的设计
• 由processing->start compile对设计进行全编译 • 再由processing -> start simulation 进行时序
仿真,分析结果
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”。

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

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

实验三_用状态机实现序列检测器的设计1实验三_用状态机实现序列检测器的设计1实验三:用状态机实现序列检测器的设计引言:序列检测器是一种通过检测输入序列中的特定模式来实现特定功能的电路。

在本实验中,将使用状态机来设计和实现一个简单的序列检测器,以此来加深对状态机概念的理解。

一、实验目的:1.理解状态机的基本概念和工作原理2.学习使用状态转移图设计状态机3.设计并实现一个简单的序列检测器二、实验原理:1.状态机概念状态机是由有限个状态和输入信号、输出信号及状态转移函数所确定的一种特殊的信息处理系统。

它根据输入信号的变化,通过状态转移函数切换状态,根据当前状态和输入信号来确定输出信号。

2.状态转移图状态转移图是一种图示方法,用于描述状态机的状态、输入和输出之间的关系。

它由状态节点和状态转移边组成。

状态节点表示状态,状态转移边表示状态之间的转移条件。

三、实验内容:1.确定序列检测器的功能和输入输出规格在本实验中,我们设计一个序列检测器来检测输入序列"101"。

当检测到输入序列为"101"时,输出信号为1,否则输出信号为0。

2.设计状态转移图根据输入输出规格,设计状态转移图。

状态转移图应包括初始状态、输入信号、输出信号和状态转移条件。

假设状态为S0、S1和S2,其中S0为初始状态。

输入信号为X,输出信号为Y。

状态转移条件如下:-从S0状态到S1状态,当输入信号X为1时-从S1状态到S2状态,当输入信号X为0时-从S2状态到S0状态,当输入信号X为1时状态转移图如下所示:```01S0→S1→S2↑______```3.实现状态机电路根据状态转移图,可以实现状态机电路。

使用触发器来存储状态。

每个触发器的输出连接到其他触发器的输入。

根据状态转移图,配置触发器的输入和输出。

配置表如下所示:```状态XY下一个状态S000S0S010S1S100S2S110S1S201S0S210S1```根据配置表,配置触发器的输入和输出。

序列检测器 用verilog语言实现

序列检测器 用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级电路如下。

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

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

实验三_用状态机实现序列检测器的设计
一、实验目的
①了解序列检测器的基本原理;
②使用状态机模型设计序列检测器;
③理解状态机的工作原理,以及应用状态机设计逻辑电路的思想与方法。

二、实验原理
序列检测器,又称序列检测器或序列检测装置,是将输入的序列信号,与一个事先给定的序列模式进行比较,以判断输入信号是否与给定的模式
相匹配。

当输入信号与给定模式完全匹配时,则检测出一个正确的模式序列。

如果输入的信号不与模式相匹配,则认为出错,并给出错误信号。

序列检测器有很多的组成部分,包括输出寄存器,状态寄存器,比较
状态机,其中比较状态机是序列检测器最重要的组成部分。

它主要功能是:获取模式序列,比较模式和输入序列,并根据比较结果生成对应的输出信号。

具体来说,比较状态机包括:输入处理模块,状态比较模块,指令控
制模块和输出触发模块。

三、实验内容
1、设计一个比较状态机,用于检测并确定序列是否与给定的模式序
列相同。

2、使用VHDL绘制比较状态机的模型,并编写代码实现。

3、真实应用比较状态机,设计一个校验器,用于检测序列是否符合一定的校验规则。

序列检测器设计实践报告

序列检测器设计实践报告

序列检测器设计实践报告一、引言序列检测器是现代通信系统中的关键组件之一,它能够检测出接收到的数据序列是否符合特定规则或模式。

在本次实践中,我们通过使用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语言实现了状态寄存器、状态转移逻辑和输出逻辑。

vhdl eda 序列信号发生器与检测器设计

vhdl eda 序列信号发生器与检测器设计

实验三序列信号发生器与检测器设计一、实验目的1.学习一般有限状态机的设计;2.利用状态机实现串行序列的输出与序列的检测。

3.继续学习优化设计。

二、内容与要求利用状态机设计实现实现串行序列的输出与序列的检测,具体要求:1.先设计序列发生器产生序列0111010011011010;2.再设计一个序列信号检测器,若系统检测到串行序列11010则输出为“1”,否则输出为“0”,并将检测到的11010数目显示出来;3.对所设计的电路进行波形仿真和硬件测试;4.整个工程采用顶层文件+底层模块的原理图或文本的设计思路。

三、设计思路/原理图根据实验要求,先设计序列发生器产生序列:0111010011011010;再设计检测器,检测串行信号:11010,若检测到11010信号,则输出“1”,没有检测到则输出“0”,并且将检测到的信号的显示出来。

为简化设计,整个工程采用顶层文件+底层模块的设计方法。

1.序列信号发生器序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号。

利用状态机设计,首先定义一个数据类型FSM_ST它的取值为st0到st15的16个状态。

REG s0 s1 s2 s3 s4 s5 s6 s7 Q 0 1 1 1 0 1 0 0 REG s8 s9 s10 s11 s12 s13 s14 s15 Q 1 1 0 1 1 0 1 0 2、序列检测器序列检测器设计的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及序列,直到在连续的检测中收到的每一位码都与预置码相同。

在此,必须利用状态转移图。

定义预置信号D=“11010”,电路需要分别不间断记忆:初始状态、1、11、110、1101、11010共六种状态,状态转移图:3、计数模块利用序列检测器产生的信号(1和0)作为计数器模块的时钟信号,产生的信号0、1变化,形成类似的CLK信号,实现计数模块计数。

计数模块设计可采用前面的实验二设计。

EDA技术-VHDL-4.11 用状态机实现序列检测器的设计

EDA技术-VHDL-4.11 用状态机实现序列检测器的设计

4.11 用状态机实现序列检测器的程序设计与仿真1 实验目的用状态机实现序列检测器的设计,并对其进行仿真和硬什测试。

2 实验原理序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到—组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出“I”,否则输出“0”。

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

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

该实验源程序描述的电路完成对序列数“11l00101”的检测,当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则输出“B”。

3 实验内容(1) 用VHDL语言编写序列检测器的源程序。

(2)将源程序进行综合、优化及功能仿真,并给出仿真波形,了解控制信号的时序,最后进行引脚锁定并完成硬件测试实验。

建议用键7(PIO11)控制复位信号CLR;键6(PI09)控制状态机工作时钟CLK;待检测串行系列数输入DIN接PIO10(左移,最高位在前):指示输出AB接PI039~PI036(显示于数码管6),下载后:①按实验板“系统复位”键:②用键2和键1输入2位十六进制待测序列数“11100101”;③按键7复位(平时数码6指示显“B”):④按键6(CLK)8次,这时若串行输入的8位二进制序列码(显示于数码2/1和发光管D8~D6)与预置码11100101”相同,则数码6应从原来的B变成A,表示序列检测正确,否则仍为B。

4 实验预习思考(1)说明源程序的代码表达的是什么类型的状态机,它的优点是什么?详述其功能和对序列数检测的逻辑过程。

(2) 写出由两个主控进程构成的相同功能的符号化Moore型有限状态机,画出状态图,井给出其仿真测试波形。

5 程序设计与仿真(1)程序设计为此工程新建一个文件夹。

verilog有限状态机实验报告(附源代码)

verilog有限状态机实验报告(附源代码)

有限状态机实验报告一、实验目的●进一步学习时序逻辑电路●了解有限状态机的工作原理●学会使用“三段式”有限状态机设计电路●掌握按键去抖动、信号取边沿等处理技巧二、实验内容用三段式有限状态机实现序列检测功能电路a)按从高位到低位逐位串行输入一个序列,输入用拨动开关实现。

b)每当检测到序列“1101”(不重叠)时,LED指示灯亮,否则灭,例如i.输入:1 1 0 1 1 0 1 1 0 1ii.输出:0 0 0 1 0 0 0 0 0 1c)用八段数码管显示最后输入的四个数,每输入一个数,数码管变化一次d)按键按下的瞬间将拨动开关状态锁存i.注意防抖动(按键按下瞬间可能会有多次的电平跳变)三、实验结果1.Rst_n为0时数码管显示0000,led灯不亮,rst_n拨为1,可以开始输入,将输入的开关拨到1,按下按钮,数码管示数变为0001,之后一次类推分别输入1,0,1,按下按钮后,数码管为1101,LED灯亮,再输入1,LED灯灭,之后再输入0,1(即共输入1101101使1101重叠,第二次LED灯不亮),之后单独输入1101,LED灯亮2.仿真图像刚启动时使用rst_n一段时间后其中Y代表输出,即控制led灯的信号,sel表示数码管的选择信号,seg表示数码管信号四、实验分析1、实验基本结构其中状态机部分使用三段式结构:2、整体结构为:建立一下模块:Anti_dither.v输入按键信号和时钟信号,输出去除抖动的按键信号生成的脉冲信号op这一模块实现思路是利用按钮按下时会持续10ms以上而上下抖动时接触时间不超过10ms来给向下接触的时间计时,达到上限时间才产生输出。

Num.v输入op和序列输入信号A,时钟信号clk和复位信号,复位信号将num置零,否则若收到脉冲信号则将num左移一位并将输入存进最后一位。

输出的num即为即将在数码管上显示的值Scan.v输入时钟信号,对其降频以产生1ms一次的扫描信号。

2021年序列检测器的设计实验报告

2021年序列检测器的设计实验报告
PROCESS (fstate,input1,input2)
BEGIN
output1 <= '0';
CASE fstate IS
WHEN st1 =>
IF (((input1 = '1') AND (input2 = '1'))) THEN
reg_fstate <= st2;
ELSE
reg_fstate <= st0;
设计原理图及源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITYAAIS
PORT ( CLK ,DIN,RST : IN STD_LOGIC;
SOUT: OUT STD_LOGIC;
ENDAA;
ARCHITECTURE behav OFAAIS
TYPE states IS (s0, s1, s2, s3,s4,s5,s6,s7,s8);
SIGNAL ST,NST: states:=s0;
BEGIN
COM : PROCESS(ST,DIN) BEGIN
CASE ST IS
WHEN s0 => IF DIN = '1' THENNST <= s1;ELSE NST<=s0;END IF;
WHEN s1=> IF DIN = '0' THENNST <= s2;ELSE NST<=s0;END IF;
WHEN s8=> IF DIN = '0' THENNST <= s2;ELSE NST<=s0;END IF;
WHEN OTHERS =>NST <= st0;

序列检测器设计-modelsim-verilog-实验报告

序列检测器设计-modelsim-verilog-实验报告

实验四-序列检测一、实验目的:1.实验目的:通过学习硬件编程语言,掌握一般时序逻辑分析的方法。

2.学会使用Verilog语言编写实现任意序列检测。

3.学会使用Verilog编写测试文件testbech的方法并在Modelsim中实现时序仿真。

二、实验设备1.PC机一台2.Modelsim软件三、实验内容:序列检测器是能够与从二进制码流中检测出一组特定序列的信号的时序电路。

通过接受的序列号与检测其预设值比较,当检测到输入信号匹配时,输出响应的指示。

设计序列检测器,要求能够识别序列“10010”。

din为数字码流的输入,z是检测标记的输出,高电平表示“发现指定序列”,低电平表示“没有发现指定的序列”。

1.打开Modelsim软件,切换目录至常用位置,这里选择D:\seqdet。

(注,在D:\seqdet 目录下一保存有序列检测文件seqdet.v和测试文件seqdet_tb.v,源程序在附录里)2.然后新建工程,File ->New->Project,建立工程工程为seqdet,设置如下,并在接下来的步骤中添加序列检测文件seqdet.v和测试文件seqdet_tb.v。

4.编译文件编译无误后,进行仿真5.文件仿真在弹出的窗口中选择Design->work->seqdet_tb,默认选中优化选项。

选择OK6.添加信号到wave视图中。

在仿真状态下,切换到左侧导航窗口到object视图下,添加信号T,clk,rst,x,z,q到wave窗口中,添加完成后如图所示:7.运行仿真至1000ns,,波形图显示如图所示:8.结果分析:对上述图形分析如下,用蓝色表示的为第一次检测到匹配序列“10010”,黄色表示为第二次匹配序列,紫色表示为第三次匹配序列。

z分别在这三处匹配时输出高电平,其他为低电平,实现了序列检测的功能。

四,程序:①源程序模块seqdet.v :module seqdet(input wire x, //信号输入input wire clk, //时钟信号input wire rst,output wire z,output reg [4:0] q //序列输出);wire [4:0] q_next;assign q_next ={q[3:0],x};assign z = (q_next== 5'b10010) ? 1'b1:1'b0;always @ (posedge clk,negedge rst)if(!rst)q <= 5'd0;elseq <= q_next;endmodule②测试程序模块seqdet_tb.v`timescale 1ns/1nsmodule seqdet_tb;localparam T =20;reg clk,rst;reg [23:0] data;wire z,x;wire [4:0] q;assign x = data[23];initialbeginclk =0;rst =1;#2 rst =0;#30 rst =1;data =20'b1100_1001_0000_1001_0100;#(T*1000) $stop;endalways #T clk = ~clk;always @ (posedge clk)#2 data = {data[22:0],data[23]};seqdet U1(.x(x),.z(z),.clk(clk),.q(q),.rst(rst));endmodule五、实验总结:通过本次实验,对Verilog硬件描述语言有了进一步认识,学会编写verilog语言的文本设计方法,并学会编写testbench测试程序。

深圳大学Verilog实验三状态机实验报告

深圳大学Verilog实验三状态机实验报告
always #10clk=~clk;
always@(posedgeclk)
data={data[22:0],data[23]};
initial begin
clk= 0;
rst= 1;
#2rst=0;
#30rst=1;
data='b0111_1111_1111_0011_0011;
#500 $stop;
regclk;
regrst;
wire x, z;
wire [3:0] count;
wire [2:0] state;
reg[23:0] data;
zuangtaijiuut(
.x(x),
.z(z),
.count(count),
.clk(clk),
.rst(rst),
.state(state)
);
assign x=data[23];
begin state<=BG;count<=0; end
else
case(state)
BG: if(x==1)
begin state<=A; count<=count+1; end
else
begin state<=BG; count<=0; end
A : if(x==1)
begin state<=B; count<=count+1; end
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
end
endmodule
—————————————————————————————————
4、保存代码,仿真,并查看仿真结果。
四、实验结果:

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

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

设计参考
本实验由顶层文件、串行检测、并行数据转 串行、数码管显示四个模块组成
顶层模块
并行8bits数据 串行数据 4bits数据 7bits数据
并转串 模块
clk
串行检测 模块
数码管显 示模块
reset
系统任务要求
• 系统主要包括3个模块: 1)并行数据转串行数据模块(xulie.v) 2)串行检测模块(schk.v) 3)数码管显示模块(decled7s .v) 由于需要用按键V16作为时钟输入,按键 D18作为系统复位输入,所以需调用实验二 中应用的消抖模块,对两个按键输入信号 进行消抖。
设计输入
• 选择Verilog Module ,并输入合法文件名
• 在文本编辑窗口输入代码
设计输入
设计处理
• 设计处理环节进行综合、功能仿真、时序仿真Байду номын сангаас等处理
设计处理
1、综合:
• 在sources窗口选中待综 合模块cnt10,在process 窗口双击Synthesize-XST • 综合完后可以双击 Synthesize-XST下的View RTL Schematic,得到综 合后的电路图。
实验三
用状态机实现序列检测器的设计
• 上网查询资料,复习《数字电子技术》教 材,理解有限状态机的概念。 • 有限状态机的状态图的画法及其含义。
任务分析
• 本次实验的核心是:应用有限状态机设计思路,检测输 入的串行数据是否是”11100101”。 • 根据下载电路板的资源, 拟用SW3---SW0,J4接口的E8,F8,C7,D7作为系统输入( 系统由此需要设计一个8bits并行数据转串行的模块) 一个7段数码显示译码器作为检测结果的输出显示,如 果串行序列为”11100101”,显示a,否则显示b(系统需 要设计一个7段数码显示译码器模块) 为了显示可控,清晰,拟用V16,D18实现时钟,复位信 号的输入。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三用状态机实现序列检测器的设计一、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。

二、原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出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种状态。

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

画出状态图,并给出其仿真测试波形;2.提示:可以在default分支选用显示“0”。

3. 利用QuartusII对文本编辑输入、仿真测试并给出仿真波形,了解控制信号的时序。

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

建议用KEY3(PIN_W26)控制复位信号RESET;KEY2(PIN_P23)控制状态机工作时钟CLK;指示输出AB接数码管HEX0(PIN_AF10, PIN_AB12, PIN_AC12, PIN_AD11, PIN_AE11, PIN_V14, PIN_V13)。

5. 下载后,按以下提示进行操作:1)、按实验板“系统复位”键;2)、用SW17-SW0键输入包含待测序列数"11100101 "的18位数据;3)、按下RESET键;4)、按KEY2键(时钟clk输入)18次,这时若串行输入的18位二进制序列码中包含有"11100101 ",则数码管HEX0应从原来的B变成A ,表示序列检测正确,否则仍为B。

四、思考题:说明代码表达的是什么类型的状态机,它的优点是什么?详述其功能和对序列数检测的逻辑过程;五、实验报告:根据以上的实验内容写出实验报告,包括设计原理、程序设计、程序分析、仿真分析、硬件测试和详细实验过程。

相关文档
最新文档