实验三_用状态机实现序列检测器的设计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. 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。

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

相关文档
最新文档