FPGA用状态机实现序列检测器的设计报告
用状态机实现序列检测器实验报告
实验报告用状态机实现序列检测器实验一、实验目的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
实验三用状态机实现序列检测器的设计一、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
二、原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出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种状态。
实验5 采用状态机实现序列检测器
实验5 采用状态机实现序列检测器一、实验目的1.掌握利用有限状态机实现一般时序逻辑分析的方法;2.掌握利用Verilog编写可综合的有限状态机的标准模板。
二、仪器设备计算机、Quartus II 9.0 开发软件。
三、实验内容与步骤:1.实验内容建立一个序列检测器设计文件,当检测到3个及3个以上1时输出为1。
2.实验步骤1)新建工程文件夹;2)启动Quartus II3)选择File->New Project Wizard,建立新工程;4)File->New->Verilog HDL File建立设计文件;5)选择Processing->Start->Start Analysis&Synthesis进行电路综合;6)选择Tools->Netlist Viewers->RTL Viewer,查看综合后得到的电路;7)选择Tools->Netlist Viewers->State Machine Viewer,查看综合后得到的有限状态机;8)选择Processing->Start->Start Fitter进行电路适配;9)选择Tools->Netlist Viewers->Technology Map Viewer,查看适配后得到的电路。
四、实验数据写出程序代码,及状态转换图。
五、讨论写出三段式有限状态机的建模方式。
六、其它实验原理要求说明:1.什么是有限状态机;2.什么是Moore有限状态机与Mealy有限状态机;3.说明用Verilog HDL设计有限状态机的一般步骤。
附:程序部分代码module seq_111(clk,clr,x,z);input clk,clr,x;output reg z;reg[1:0] state,next_state;parameter S0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11;/*状态编码*/always @(posedge clk or posedge clr) /*该过程定义当前状态*/ begin if(clr) state<=S0; //异步复位,s0为起始状态else state<=next_state;endalways @(state or x) /*该过程定义次态*/begincase (________ )S0:begin case (x)1:next_state=S1;0:next_state=S0;endcaseendS1:begin if(x) next_state=S2;else next_state=S0; endS2:beginif(x) next_state=S3;else next_state=S0; endS3:begin if(x) next_state=S3;else next_state=S0; enddefault:next_state=S0; /*default语句*/endcaseendalways @(________) /*该过程产生输出逻辑*/begin case(state)S3: z=1'b1;default:z=1'b0;endcaseendendmodule。
FPGA用状态机实现序列检测器的设计报告
FPGA 实验报告题目:用状态机实现序列检测器的设计一.实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
二.实验原理及内容:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出a ,否则输出b 。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
电路完成对序列数"11100101"的。
当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“a ”,否则仍然输出“b ”。
三.程序结构.四.实验步骤. 1.在QUARTUSII 软件下创建一工程,工程名为schk ,芯片名为EP2C35F672C6;2.输入串行检测模块,并命名为schk.v ,保存在与工程相同的文件夹中;module schk(DIN,CLK,CLR,AB,Q);input DIN,CLK,CLR;output[3:0] AB;output[7:0] Q;reg [7:0] Q;reg [3:0] AB;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;顶层模块 并转串模块 串行检测模块 数码管显示模块 并行8bits 数据 clk串行数据 4bits 数据 reset 7bits 数据always @(posedge CLK or negedge CLR)if(!CLR)begin Q <= idle;endelse begincase(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; else Q<=idle;ende: 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 ;end endmodule其功能仿真波形和时序仿真波形分别如下:结果分析如下: 当CLR有效时,连续8位DIN=11100101时,AB=1011=0x0A,连续8位DIN!=11100101时,AB=1011=0x0B,可知结果正确。
实验三_用状态机实现序列检测器的设计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```根据配置表,配置触发器的输入和输出。
FPGA实验报告10--0101序列检测器
Lab 10 0101序列检测器仿真集成1101班1.实验目的熟悉用Modelsim进行波形仿真的方法。
掌握用Verilog HDL 语言描述0101序列检测器的方法。
熟悉用Verilog HDL 语言编写testbench。
2.实验内容a)理解并掌握状态机与testbench的描述方法。
b)使用Modelsim软件得到仿真波形。
c)使用DE0开发板下载。
3.代码分析状态机描述定义模块名与输入输出,clk为时钟信号,rst为控制信号,seq 为待检测信号;输出是det.同时定义了四个状态(独热码)s0,s1,s2,s3;和reg型变量state,next_state.module seqdet(clk,rst,seq,det);input clk;input rst;input seq;output det;parameter s0=4'h1;parameter s1=4'h2;parameter s2=4'h4;parameter s3=4'h8; // 独热码reg det;reg [3:0] state, next_state状态转移:当rst=1时,state初始化为s0状态;当rst=0时,state的状态随着驱动变化。
always@(posedge clk) beginif(rst)state <= s0;elsestate <= next_state;end状态驱动:随着待检测信号的变化,状态在s0,s1,s2,s3之间变化,最终影响输出。
a lways @(posedge clk) begincase(state)s0: next_state=((seq==1)?s0:s1);s1: next_state=((seq==1)?s2:s1);s2: next_state=((seq==1)?s0:s3);s3: next_state=((seq==1)?s0:s1);default: next_state=((seq==1)?s0:s1);endcaseend输出:当现态state=s3时,det=1,即检测到一个0101序列。
用状态机实现序列检测器的设计
实验步骤
1、为本项设计建立文件夹
2、输入设计项目和存盘
3、将设计项目设置成工程文件 将序列检测器设置为工程文件 。 4、选择目标器件并编译
如果发现有错,排除错误后再次编译
实验步骤
5、时序仿真 接下来应该测试设计项目的正确性,即逻辑仿真,具体步骤如下: (1)建立波形文件。 (2)输入信号节点。 (3)设置波形参量。 (4)设定仿真时间宽度 (5)加上输入信号。 (6)波形文件存盘。 (7)运行仿真器。 (8)观察分析波形。对照数控分频器工作原理,观察显示的时序
EDA实验
【实验7】用状态机实现序列检测器的设计
实验目的
用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。 了解一般状态机的设计与应用。
实验原理
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号 当序列检测器连续收到一组串行二进制码后,如果这组码与检测器 中预先设置的码相同,则输出1,否则输出0。由于这种检测的关键 在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的 正确码及正确序列,直到在连续的检测中所收到的每一位码都与 预置数的对应码相同。在检测过程中,任何一位不相等都将回到 初始状态重新开始检测。
思考题
整理实验报告。 总结实验现象
实验步骤
实验步骤
实验步骤
实验步骤
实验步骤
实验步骤
实验步骤
实验步骤实验Biblioteka 骤实验步骤实验步骤
实验步骤
实验步骤
实验步骤
实验步骤
实验步骤
波形是否正确的
实验步骤
6、引脚锁定 在锁定引脚后必须再通过MAX+plusII的
Compiler选项,对文件从新进行编译一次, 以便将引脚信息编如入下载文件中。
序列检测器设计实践报告
序列检测器设计实践报告一、引言序列检测器是现代通信系统中的关键组件之一,它能够检测出接收到的数据序列是否符合特定规则或模式。
在本次实践中,我们通过使用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语言实现了状态寄存器、状态转移逻辑和输出逻辑。
FPGA10位序列检测器
FPGA嵌入式系统设计专题实践题目:10位序列检测器设计专业:电子信息科学与技术班级:电信092姓名:陈颖学号:0910930222一、设计题目:10位序列检测器设计二、设计目标:1.掌握序列检测器的工作原理2. 利用有限状态机实现一般时序逻辑分析的方法,了解一般状态机的设计与应用。
三、设计原理:本系统采用实验箱的48MHz时钟作为输入时钟,将其分频得到计数器计数频率和序列检测器检测序列频率,分析题目要求显示“RIGHT”或者“ERROR”,需要五个数码管,所以设计5进制计数器之后再加一个选通器直接连实验箱上数码管的位选;KEY3为待检测序列输入端,KEY4为清零端,序列检测结果有两个,检测正确为‘1111’,检测错误为‘0000’,送到译码端可译出“RIGHT”或“ERROR”相应的段选码。
四、设计内容1、VHDL描述(1)分频器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pulse1 isport(clk: in std_logic;Fout:out std_logic);end;architecture one of pulse1 issignal full:std_logic;beginp_reg:process(clk)variable cnt8:integer range 48000000 downto 0;beginif clk'event and clk='1' thenif cnt8=100 thencnt8:=0;full<='1';else cnt8:=cnt8+1;full<='0';end if;end if;end process p_reg;p_div:process (full)variable cnt2:std_logic;beginif full'event and full='1' thencnt2:=not cnt2;If cnt2='1'then fout<='1';else fout<='0';end if;end if;end process p_div;end;(2)序列检测器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;ARCHITECTURE BEHA V OF SCHK ISSIGNAL Q:INTEGER RANGE 0 TO 10;SIGNAL D:STD_LOGIC_VECTOR(9 DOWNTO 0);BEGIND<="1111111111";PROCESS(CLK,CLR)BEGINIF CLR='0' THEN Q<=0;ELSIF CLK'EVENT AND CLK='1' THENCASE Q ISWHEN 0=>IF DIN=D(9) THEN Q<=1 ;ELSE Q<=0;END IF;WHEN 1=>IF DIN=D(8) THEN Q<=2 ;ELSE Q<=0;END IF;WHEN 2=>IF DIN=D(7) THEN Q<=3 ;ELSE Q<=0;END IF;WHEN 3=>IF DIN=D(6) THEN Q<=4 ;ELSE Q<=0;END IF;WHEN 4=>IF DIN=D(5) THEN Q<=5 ;ELSE Q<=0;END IF;WHEN 5=>IF DIN=D(4) THEN Q<=6 ;ELSE Q<=0;END IF;WHEN 6=>IF DIN=D(3) THEN Q<=7 ;ELSE Q<=0;END IF;WHEN 7=>IF DIN=D(2) THEN Q<=8 ;ELSE Q<=0;END IF;WHEN 8=>IF DIN=D(1) THEN Q<=9 ;ELSE Q<=0;END IF;WHEN 9=>IF DIN=D(0) THEN Q<=10 ;ELSE Q<=0;END IF;WHEN OTHERS=>Q<=0;END CASE; END IF; END PROCESS;PROCESS(Q)BEGINIF Q=10 THEN AB<="1111"; ELSE AB<="0000";END IF;END PROCESS;END BEHA V;(3)五进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity CNT5 isport( clk:in std_logic;COUT:OUT std_logic_vector(2 downto 0));end;architecture one of CNT5 issignal CNT:std_logic_vector(2 downto 0);beginp2:process(clk)beginif clk'event and clk='0' then CNT<=CNT+1;if CNT="100" THEN CNT<="000";end if;end if;COUT<=CNT;end process p2;END;(4)位选library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity XT isport( cnt8 :IN std_logic_vector(2 downto 0);bt:out std_logic_vector(7 downto 0);a :out integer range 0 to 15);end;architecture one of XT isbeginp1:process (cnt8)begincase cnt8 iswhen "000"=>bt<="11101111";a<=0;--rwhen "001"=>bt<="11110111";a<=1;--iwhen "010"=>bt<="11111011";a<=2;--gwhen "011"=>bt<="11111101";a<=3;--hwhen "100"=>bt<="11111110";a<=4;--twhen others=>null;end case;end process p1;END;(5)译码器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dec17s isport( a:in std_logic_vector(3 downto 0);panduan:in std_logic_vector(3 downto 0);led7s:out std_logic_vector(6 downto 0));end;architecture one of dec17s isbeginp3:process(a)beginif panduan="1111" then--rigntcase a iswhen "0000"=>led7s<="0001000";when "0001"=>led7s<="1111001";when "0010"=>led7s<="1000010";when "0011"=>led7s<="0001001";when "0100"=>led7s<="1111000";when others=>null;end case;elsif panduan="0000" then--errorcase a iswhen "0000"=>led7s<="0000110";when "0001"=>led7s<="0001000";when "0010"=>led7s<="0001000";when "0011"=>led7s<="1000000";when "0100"=>led7s<="0001000";when others=>null;end case;end if;end process p3;end;五、实验现象10位的待检测序列,输入到第十位且前九位都正确时显示“RIGHT”,其他情况显示“ERROR”六、实验感想通过本次的FPGA课程设计,对Quartus II开发平台及EDA技术基础知识进行了复习,同时尝试使用了一些VHDL设计进阶中的语法以简化操作,取得了不错的效果。
2021年序列检测器的设计实验报告
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;
实验四用状态机实现序列检测器的设计
实验四用状态机实现序列检测器的设计序列检测器是一种可以检测输入序列中是否包含特定模式的系统,常见的应用包括编码/解码、错误检测和通信协议等。
状态机是一种数学模型,可以描述系统在不同状态之间的转换关系。
本实验旨在利用状态机的概念和原理,设计一个简单的序列检测器。
一、实验目的本实验的目的是通过实践,加深对状态机原理的理解,并掌握利用状态机设计和实现序列检测器的方法和技巧。
二、实验原理状态机是由状态、输入和输出组成的,其中状态表示系统的各种工作状态,输入是输入信号,输出是根据输入信号和当前状态产生的输出信号。
在设计序列检测器时,需要针对特定的输入序列定义状态转换条件,并根据状态转换条件确定系统的下一个状态和输出信号。
通常使用状态转换表或状态转换图来描述系统的状态转换关系。
三、实验内容1、确定输入序列和输出信号的定义在设计序列检测器之前,首先需要明确输入序列和输出信号的定义。
例如,输入序列为0和1的连续序列,输出信号为检测到序列的结果。
2、定义状态集合根据输入序列的定义,确定系统的状态集合。
例如,系统的状态可以有两个:A和B。
3、定义状态转换条件根据输入序列的定义和状态集合,确定状态转换条件。
例如,当输入为0时,系统从状态A转换到状态B;当输入为1时,系统保持在状态A。
4、确定初始状态确定系统的初始状态。
例如,初始状态可以为A。
5、确定输出信号根据输入序列的定义和状态转换条件,确定状态对应的输出信号。
例如,当检测到输入序列时,系统输出检测到的信号。
6、绘制状态转换图根据状态集合、状态转换条件和输出信号,绘制系统的状态转换图。
状态转换图表示系统在不同状态之间的转换关系。
7、实现状态转换逻辑将状态转换图转化为状态转换表,然后根据状态转换表实现状态转换逻辑。
状态转换逻辑可以使用编程语言来实现,例如使用C、C++或Verilog等。
8、测试和验证使用合适的输入序列对设计的状态机进行测试和验证。
根据实际运行结果判断系统是否工作正常。
实验三:状态机实现序列检测器设计
实验三:状态机实现序列检测器设计《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.掌握一种状态机的设计方法2.用状态机实现序列检测器的设计,并对其进行仿真和硬件测试二、实训器材1.EDA实验箱1台2.微型计算机1台3.MAX+PLUSII10.2软件1套4.下载电缆1条三、实训原理序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
例中描述的电路完成对序列数"11100101"的。
当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则仍然输出“B”。
四、设计程序(参考程序)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位待检测预置数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 ;提示:若对于D <= "11100101 ",电路需记忆:初始状态、1、11、111 、1110 、11100、111001、1110010、11100101 共9种状态。
序列检测器的设计实验报告
序列检测器的设计实验报告一、实验目的本次实验的目的是设计一个能够检测特定序列的数字逻辑电路,即序列检测器。
通过设计和实现这个电路,深入理解数字电路的基本原理和设计方法,掌握状态机的概念和应用,提高逻辑分析和电路设计的能力。
二、实验原理序列检测器是一种能够在输入数据流中检测特定序列的电路。
它通常由状态机实现,状态机根据输入的变化在不同的状态之间转移,并在特定的状态下输出检测结果。
以检测序列“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命令,开始编译。
序列检测器的设计 实验报告
EDA实验报告书设计原理图及源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY AA ISPORT ( CLK ,DIN,RST : IN STD_LOGIC;SOUT : OUT STD_LOGIC;END AA;ARCHITECTURE behav OF AA ISTYPE states IS (s0, s1, s2, s3,s4,s5,s6,s7,s8);SIGNAL ST,NST : states :=s0 ;BEGINCOM : PROCESS(ST,DIN) BEGINCASE ST ISWHEN s0 => IF DIN = '1' THEN NST <= s1;ELSE NST<=s0; END IF; WHEN s1 => IF DIN = '0' THEN NST <= s2;ELSE NST<=s0; END IF; WHEN s2 => IF DIN = '1' THEN NST <= s3;ELSE NST<=s0; END IF; WHEN s3 => IF DIN = '0' THEN NST <= s4;ELSE NST<=s0; END IF; WHEN s4 => IF DIN = '1' THEN NST <= s5;ELSE NST<=s0; END IF; WHEN s5 => IF DIN = '1' THEN NST <= s6;ELSE NST<=s0; END IF; WHEN s6 => IF DIN = '1' THEN NST <= s7;ELSE NST<=s0; END IF; WHEN s7 => IF DIN = '0' THEN NST <= s8;ELSE NST<=s0; END IF; WHEN s8 => IF DIN = '0' THEN NST <= s2;ELSE NST<=s0; END IF; WHEN OTHERS => NST <= st0;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=s8 ELSE '0' ;END behav;仿真波形图实验结果LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY SM1 ISPORT (clock : IN STD_LOGIC;reset : IN STD_LOGIC := '0';input1 : IN STD_LOGIC := '0';input2 : IN STD_LOGIC := '0';output1 : OUT STD_LOGIC);END SM1;ARCHITECTURE BEHAVIOR OF SM1 ISTYPE type_fstate IS (st1,st2,st3,st4,st5,st6,st7,st8,st0);。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA 实验报告题目:用状态机实现序列检测器的设计一.实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。
二.实验原理及内容:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出a ,否则输出b 。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
电路完成对序列数"11100101"的。
当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“a ”,否则仍然输出“b ”。
三.程序结构.四.实验步骤. 1.在QUARTUSII 软件下创建一工程,工程名为schk ,芯片名为EP2C35F672C6;2.输入串行检测模块,并命名为schk.v ,保存在与工程相同的文件夹中;module schk(DIN,CLK,CLR,AB,Q);input DIN,CLK,CLR;output[3:0] AB;output[7:0] Q;reg [7:0] Q;reg [3:0] AB;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;顶层模块 并转串模块 串行检测模块 数码管显示模块 并行8bits 数据 clk串行数据 4bits 数据 reset 7bits 数据always @(posedge CLK or negedge CLR)if(!CLR)begin Q <= idle;endelse begincase(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; else Q<=idle;ende: 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 ;end endmodule其功能仿真波形和时序仿真波形分别如下:结果分析如下: 当CLR有效时,连续8位DIN=11100101时,AB=1011=0x0A,连续8位DIN!=11100101时,AB=1011=0x0B,可知结果正确。
3.输入前端预置8位数据输入程序并命名为xulie.v,保存在与工程相同的文件夹中。
module xulie(clk, din8, reset, din);input clk;input[7:0] din8;input reset;output din;parameter s0 = 3'b000,s1 = 3'b001,s2 = 3'b010, 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;else cur_state <= next_state;always @ (cur_state or din8 or din )begin case (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;ends5 : begindin <= din8[2];next_state <= s6;ends6 : begindin <= din8[1];next_state <= s7; ends7 : begindin <= din8[0]; next_state <= s0; enddefault : begindin <= 1'b0;next_state <= s0;endendcaseendendmodule其功能仿真波形和时序仿真波形分别如下:波形分析:当复位信号无效,在时钟脉冲作用下并行输入的8bits数据转为由din连续输出的8字节数据。
4 数码管显示程序,将其命名为decl7s.v,保存在与工程相同的文件夹中。
module decl7s(AB,LED7S);input[3:0] AB;output[6:0] LED7S;reg[6:0] LED7S;always @(AB)Begin LED7S={7{1'b0}};case (AB)4'b1010 : LED7S[6:0]<=7'b0001000;4'b1011 : LED7S[6:0]<=7'b0000011;4'b0000 : LED7S[6:0]<=7'b0000000;default : LED7S[6:0]<={7{1'b0}};endcaseendendmodule其真值表如下图:输入(4bits)输出(7bits)显示内容4’b1010 7’b 0001000 a4’b1011 7’b 0000011 b4’b0000 7’b1000000 0其功能仿真波形和时序仿真波形分别如下所示:结果分析:当输入AB=1010时,LED7S=0001000,当输入AB=1011时,LED7S=0000011,和真值表相对应,由此可得,结果正确。
5 创建顶层文件,命名为XULIEQI.v,保存在与工程相同的文件夹中。
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其功能仿真波形和时序仿真波形分别如下所示:6 锁定引脚。
(1)根据DE2_pin_assignments文件内容、格式制作本设计引脚对应文件的引脚锁定文件:XUELIEQI.csv,其中用KEY1(PIN23)控制复位信号RESET;KEY0(PING26)控制状态机工作时钟CLK;指示输出AB接数码管HEX0(PIN_AF10, PIN_AB12, PIN_AC12, PIN_AD11, PIN_AE11, PIN_V14, PIN_V13)。
(2)由Assignments->Import Assignment,打开对话框,调入引脚对应文件XUELIEQI.csv 即可。
锁好引脚,进行全编译(compile),重新布局布线,时序仿真。
(3)引脚锁定,仿真结果核对无误后,准备下载7 下载后,按以下提示进行操作:1)、按实验板“系统复位”键;2)、用SW0-SW7(PIN_N25, PIN_N26,PIN_P25,PIN_AE14,PIN_AF14,PIN_AD13,PIN_AC13,PIN_C13)键输入待测序列数"11100101 ";3)、按下RESET键;4)、按KEY0键(时钟clk输入)8次,这时若串行输入的8位二进制序列码与预置码"11100101 "相同,则数码管HEX0应从原来的B变成A ,表示序列检测正确,否则仍为B。
8 硬件操作结果:将sw7至sw0依次置位为11100101,按下KEY0键复位,再按KEY1键8次,数码管由b转换为A,得知结果正确。
五思考题.说明代码表达的是什么类型的状态机,它的优点是什么?详述其功能和对序列数检测的逻辑过程;答:本实验代码表达的是Mealy型状态机,Mealy状态机与Moore有限状态机不同,Mealy有限状态机的输出不单与当前状态有关,而且与输入信号的当前值有关,Mealy有限状态机的输出直接受输入信号的当前值影响,而输入信号可能在一个时钟周期内任意时刻变化,这使得Mealy有限状态机对输入的响应发生在当前时钟周期,比Moore有限状态机对输入信号的响应要早一个周期。
功能和对序列检测的逻辑过程:并转串状态转换图。