VHDL序列检测器
- 格式:doc
- 大小:70.00 KB
- 文档页数:5
序列检测器的仿真一、实验内容1.用逻辑图和VHDL 语言设计序列检测器,并进行仿真与分析;2.参看教材P406~P408 部分。
二、预习报告要求1.预习报告可以写成电子文件,进实验室后开机检查,禁止复制他人的劳动成果,违者预习无效。
2.预习报告内容有:计数器的逻辑图和用VHDL 语言编写的程序;三、电路功能介绍设计一个具有1 个输入X 和1 个输出Y 的时钟同步状态机。
当且仅当X 为0 并且前面7 个时钟触发沿到来时,X 接收到的输入序列为1010111,则输出Y 为1。
VhdlLIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY xl ISPORT (clk : IN STD_LOGIC;reset : IN STD_LOGIC := '0';x : IN STD_LOGIC := '0';y : OUT STD_LOGIC);END xl;ARCHITECTURE BEHAVIOR OF xl ISTYPE type_fstate IS (d0,d1,d2,d3,d4,d5,d6,d7);SIGNAL fstate : type_fstate;SIGNAL reg_fstate : type_fstate;BEGINPROCESS (clk,reset,reg_fstate)BEGINIF (reset='1') THENfstate <= d0;ELSIF (clk='1' AND clk'event) THENfstate <= reg_fstate;END IF;END PROCESS;PROCESS (fstate,x)BEGINy <= '0';CASE fstate ISWHEN d0 =>IF ((x = '1')) THENreg_fstate <= d1;ELSIF (NOT((x = '1'))) THENreg_fstate <= d0;-- Inserting 'else' block to prevent latch inferenceELSEreg_fstate <= d0;END IF;WHEN d1 =>IF (NOT((x = '1'))) THENreg_fstate <= d2;ELSIF ((x = '1')) THENreg_fstate <= d1;-- Inserting 'else' block to prevent latch inferenceELSEreg_fstate <= d1;END IF;WHEN d2 =>IF ((x = '1')) THENreg_fstate <= d3;ELSIF (NOT((x = '1'))) THENreg_fstate <= d0;-- Inserting 'else' block to prevent latch inference ELSEreg_fstate <= d2;END IF;WHEN d3 =>IF (NOT((x = '1'))) THENreg_fstate <= d4;ELSIF ((x = '1')) THENreg_fstate <= d1;-- Inserting 'else' block to prevent latch inference ELSEreg_fstate <= d3;END IF;WHEN d4 =>IF ((x = '1')) THENreg_fstate <= d5;ELSIF (NOT((x = '1'))) THENreg_fstate <= d0;-- Inserting 'else' block to prevent latch inference ELSEreg_fstate <= d4;END IF;WHEN d5 =>IF ((x = '1')) THENreg_fstate <= d6;ELSIF (NOT((x = '1'))) THENreg_fstate <= d4;-- Inserting 'else' block to prevent latch inference ELSEreg_fstate <= d5;END IF;WHEN d6 =>IF ((x = '1')) THENreg_fstate <= d7;ELSIF (NOT((x = '1'))) THENreg_fstate <= d2;-- Inserting 'else' block to prevent latch inference ELSEreg_fstate <= d6;END IF;WHEN d7 =>IF ((x = '1')) THENreg_fstate <= d1;ELSIF (NOT((x = '1'))) THENreg_fstate <= d2;-- Inserting 'else' block to prevent latch inferenceELSEreg_fstate <= d7;END IF;IF (NOT((x = '1'))) THENy <= '1';-- Inserting 'else' block to prevent latch inferenceELSEy <= '0';END IF;WHEN OTHERS =>y <= 'X';report "Reach undefined state";END CASE;END PROCESS;END BEHAVIOR;功能图仿真。
作业一:序列检测器(1110010)1 设计功能与要求(1) 利用有限状态的状态机设计一个序列检测器,序列检测器要检测的序列设定为“”。
(2) 根据设计功能和要求运用VHDL硬件描述语言进行设计编程,并且画出序列检测器的原理流程图。
(3) 对设计的序列检测器程序进行仿真,并予以分析和说明。
2 设计思路序列检测器的设计是采用VHDL硬件描述语言设计程序,对预先设置的序列信号进行检测。
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的相同,则输出1,否则输出0。
设计采用有限状态机来实现序列检测器。
3 原理流程图根据预先设置的序列信号“”,根据有限状态机的原理进行编程,设计出符合要求的八状态的状态机的序列检测器,原理流程说明如下图。
如图所示,假设状态机的初始状态为S1,当输入信号为“1”时,进入S2状态;为“0”还是在S1状态。
在S2状态下,如果输入信号为“1”,则进入S3状态,为“0”则返回S1状态。
在S3状态下,如果输入信号为“1”,则进入S4状态,为“0”则返回S1状态。
在S4状态下,如果输入信号为“0”,则进入S5状态,为“0”还是在S4状态。
在S5状态下,如果输入信号为“0”,则进入S6状态,为“1”则进入S2状态。
在S6状态下,如果输入信号为“1”,则进入S7状态,为“0”则返回S1状态。
在S7状态下,如果输入信号为“0”,则进入S8状态,为“1”则进入S3状态。
在S8状态下,如果输入信号为“1”,则进入S2状态,为“0”则返回S1状态,并输出序列信号1110010。
4 序列检测器VHDL程序代码在序列检测器的程序代码中采用cin表示输入序列信号,clr为复位控制信号,clk为时钟信号,cout为输出信号。
当检测到序列信号中出现““序列的时候,cout输出为高电平,否则为低电平,详细程序代码如下。
library ieee;use ieee.std_logic_1164.all;entity sq_det isport(cin,clr,clk:in std_logic;cout:out std_logic);end sq_det;architecture behav of sq_det istype state is(s1,s2,s3,s4,s5,s6,s7,s8);signal c_state,n_state:state;beginprocess(clk,clr)beginif(clr='1')thenc_state<=s1;elsif(clk'event and clk='1')then c_state <=n_state;end if;end process;process(c_state,cin)begincase(c_state) iswhen s1=>cout<='0';if(cin='1')thenn_state<=s2;elsen_state<=s1;end if;when s2=>cout<='0';if(cin='1')thenn_state<=s3;elsen_state<=s1;end if;when s3=>cout<='0';if(cin='1')thenn_state<=s4;elsen_state<=s1;end if;when s4=>cout<='0';if(cin='1')thenn_state<=s4;elsen_state<=s5;end if;when s5=>cout<='0';if(cin='1')thenn_state<=s2;elsen_state<=s6;end if;when s6=>cout<='0';if(cin='1')thenn_state<=s7;elsen_state<=s1;end if;when s7=>cout<='0';if(cin='1')thenn_state<=s3;elsen_state<=s8;end if;when s8=>cout<='1';if(cin='1')thenn_state<=s2;elsen_state<=s1;end if;end case;end process;end architecture behav;5 仿真结果与说明序列检测器程序仿真结果如下图,cin为输入序列信号,clr为复位控制信号,高电平复位清零准备进入工作状态,clk为时钟信号,cout为输出信号。
实验八序列检测器的设计与仿真一、实验要求1.用VHDL语言设计一个Mealy机以检测“1101001”序列;2.用VHDL语言设计一个Moore机以检测“1101001”序列;3.在文本编辑区使用VHDL硬件描述语言设计逻辑电路,再利用波形编辑区进行逻辑功能仿真,以此验证电路的逻辑功能是否正确。
二、实验内容用VHDL语言设计各一个mealy和moore状态机测试“1101001”位串的序列检测器,并通过仿真波形验证设计的功能是否正确。
三、实验过程由于在报告1中已经详尽描述了如何使用Quartus 2建立逻辑原理图和使用VHDL语言实现元件功能,所以本次的实验报告中便不再赘述上述内容,报告将主要就VHDL 语言描述实现元件的功能的过程进行阐述。
1.Mealy机选择File→New,弹出新建文本对话框,在该对话框中选择VHDL File并单击OK按钮,进入文本编辑窗口,输入VHDL代码。
library ieee;use ieee.std_logic_1164.all;entity melay isport(clk,rst,d: in std_logic;z: out std_logic);end melay;architecture arc of melay istype state_type is(s0,s1,s2,s3,s4,s5,s6);signal state: state_type;beginprocess(clk,rst)beginif rst= '1' thenstate<=s0;elsif (clk'event and clk ='1') thencase state is --1101001when s0 =>if d='1' thenstate<=s1;elsestate<=s0;end if;when s1=>if d='1' thenstate<=s2;elsestate<=s0;end if;when s2=>if d='0' thenstate<=s3;elsestate<=s2;end if;when s3=>if d='1' thenstate<=s4;elsestate<=s0;end if;when s4=>if d='0' thenstate<=s5;elsestate<=s1;end if;when s5=> --1101001if d='0' thenstate<=s6;elsestate<=s1;end if;when s6=>if d='1' thenstate<=s0;elsestate<=s0;end if;end case;end if;end process;process(state,d)begincase state iswhen s6=>if d='1' thenz<='1';elsez<='0';end if;when others=>z<='0';end case;end process;end arc;保存文件并编译,选择菜单File→New,选择Vector Waveform File新建波形图,添加节点,参数设置为:End Time=2us, Grip size=50ns。
数字电路与逻辑计实验报告序列信号检测器的设计与实现一、课题名称:序列信号检测器的设计与实现二、实验目的:(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 触发器来完成此任务。
课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 序列信号检测器一、设计目的1、根据设计要求,完成对序列信号检测器的设计。
2、进一步加强对QuartusⅡ的应用和对VHDL语言的使用。
二、设计内容和要求1、设计一个有限状态机,用以检测输入序列“1110101101”由左开始。
(1)画出状态转换图。
(2)使用VHDL语言编程。
(3)使用FPGA芯片。
2、掌握QuartusⅡ的操作和使用方法。
3、利用QuartusⅡ软件对所设计的电路进行仿真分析。
三、初始条件FPGA,七段数码管,时钟信号,3-8译码器,拨码开关等。
四、时间安排1、2011年1月12日集中,作课设具体实施计划与课程设计报告格式的要求说明。
2、2011年1月14日至2011年1月18日,查阅相关资料,学习电路的工作原理。
3、2011年1月18日至2011年1月20日,电路调试和设计说明书撰写。
4、2011年1月21日上交课程设计成果及报告,同时进行答辩。
课设答疑地点:13楼电子科学与技术实验室。
指导教师签名:年月日系主任(或责任教师)签名:年月日摘要----------------------------------------------------------------------- II Abstract ------------------------------------------------------------------ III1 绪论---------------------------------------------------------------------- 12 设计内容及要求------------------------------------------------------------ 22.1设计的目的及主要任务------------------------------------------------- 22.1.1设计的目的----------------------------------------------------- 22.1.2 设计任务及主要技术指标----------------------------------------- 22.2设计思想---------------------------------------------------------------- 23 QuartusⅡ及VHDL语言简介-------------------------------------------------- 34 设计原理及单元模块设计---------------------------------------------------- 44.1 设计原理及方法------------------------------------------------------ 44.1.1 Moore型状态机------------------------------------------------- 54.1.2 Mealy型状态机------------------------------------------------- 54.2模块设计------------------------------------------------------------- 54.2.1 时钟输入模块--------------------------------------------------- 54.2.2 状态检测判断模块----------------------------------------------- 64.2.3译码显示模块--------------------------------------------------- 74.2.4 Led状态指示模块---------------------------------------------- 84.3 设计方案确定----------------------------------------------------------- 85 电路的仿真及分析---------------------------------------------------------- 95.1状态机转换检测------------------------------------------------------- 95.1状态机检测模块的波形仿真--------------------------------------------- 96 硬件调试与现象分析------------------------------------------------------- 10 参考文献------------------------------------------------------------------- 12 附录序列检测器的源程序--------------------------------------------------- 12序列检测器多用于通信系统中对禁用码的检测,或者是对所需信号的提取,即一旦检测到所需信号就输出高电平,这在数字通信领域有广泛的应运。
课程报告基于VHDL的序列检测器设计课程名称 EDA技术实用教程姓名卢泽文李嘉阳吴炽扬学号200730530318200730530311200730530326专业电气工程及其自动化3班指导老师: 陈楚老师日期: 2010/12随着计算机的飞速发展,以计算机辅助设计为基础的电子设计自动化(EDA)技术已成为电子学领域的重要学科。
EDA工具使电子电路和电子系统的设计产生了革命性的变化。
序列检测器也称为串行数据检测器,它在数据通讯,雷达和遥测等领域中用于检测同步识别标志,是一种用来检测一组或多组序列信号的电路。
本文输入的序列信号由自行设计的计数器和数据选择器组成的序列信号发生器提供。
1.原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,知道在连续的检测中所收到的每一位码都与预置数的对应码相同。
在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
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 schk;architecture behav of schk issignal d:std_logic_vector(7 downto 0);signal q:integer range 0 to 8;type fsm_st is(s0,s1,s2,s3,s4,s5,s6,s7,s8); --数据类型定义,状态符号化signal current_state,next_state:fsm_st;begind<="11100101" ; --8位待检预置数 reg:process(clr,clk) --主控时序进程beginif clr='1' then current_state<=s0;elsif clk='1' and clk'event thencurrent_state<=next_state;end if;end process;com:process(current_state,din) --主控组合进程 begincase current_state iswhen s0=>q<=0;if din='0' then next_state<=s0;else next_state<=s1;end if;when s1=>q<=1;if din='0' then next_state<=s0;else next_state<=s2;end if;when s2=>q<=2;if din='0' then next_state<=s0;else next_state<=s3;end if;when s3=>q<=3;if din='1' then next_state<=s0;else next_state<=s4;end if;when s4=>q<=4;if din='1' then next_state<=s0;else next_state<=s5;end if;when s5=>q<=5;if din='0' then next_state<=s0;else next_state<=s6;end if;when s6=>q<=6;if din='1' then next_state<=s0;else next_state<=s7;end if;when s7=>q<=7;if din='0' then next_state<=s0;else next_state<=s8;end if;when s8=>q<=8;next_state<=s0;end case;end process;process(q) --检测结果判断输出beginif q=8 then ab<="1010"; --序列数检测正确,输出"A" else ab<="1011"; --序列数检测错误,输出"B" end if;end process;end behav;3.原理图(顶层电路结构):clr为复位端,din为置数端,ab为输出端。
6—26试用D触发器设计一个序列检测器,该检测器有一串行输入X,一个输出Z,当检测到0100111时输出为1.输入和输出的关系也可用下式表示:输入X:010001001111000输出Z:000000000010000解答过程:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xu_lie isport(clk:in std_logic;x:in std_logic;z:out std_logic);end xu_lie;architecture one of xu_lie issignal s:std_logic_vector(6 downto 0);beginprocess(clk)beginif clk'event and clk='1' thens<=s(5 downto 0)&x;if s="0100111" thenz<='1';elsez<='0';end if;end if;end process;end one;仿真结果:结果分析:本题目要求为序列0100111序列检测,当检测到0100111时,需要输出1。
D触发器为时钟上升沿触发,需要中间信号s记录送进的四位二进制数,当下一时钟到来时,要将送进来的一个新二进制与之前的四位二进制数比较,如果是0100111,则需要输出1。
从仿真结果来看,输入X,当上升沿到来时,检测到以满足0100111后,下一个上升沿到来后即输出1,仿真结果正确。
6—25设计一个序列信号发生器,该序列信号发生器产生的序列信号为0100111。
解答过程:VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xu_lie_event isport(clk : in std_logic;r : in std_logic;q : out std_logic);end xu_lie_event;architecture one of xu_lie_event istype s_type is (S0,S1,S2,S3,S4,S5,S6);signal state : s_type;beginP1 : process(clk,r)beginif r='0' thenstate <= S0;elsif clk'event and clk = '1' thenif state <= S0 thenstate <= S1;elsif state <= S1 thenstate <= S2;elsif state <= S2 thenstate <= S3;elsif state <= S3 thenstate <= S4;elsif state <= S4 thenstate <= S5;elsif state <= S5 thenstate <= S6;elsif state <= S6 thenstate <= S0;elsestate <= S0;end if;end if;end process P1;P2 : process(clk,r)beginif r='0' thenq <= '0';elsif clk'event and clk='1' thencase state iswhen S0=>q <= '0';when S1=>q <= '1';when S2=>q <= '0';when S3=>q <= '0';when S4=>q <= '1';when S5=>q <= '1';when S6=>q <= '1';when others=>NULL;end case;end if;end process P2;end one;仿真结果:结果分析:上升沿触发,r为使能信号,当r=1正常工作。
实验三序列信号发生器与检测器设计一、实验目的1.学习一般有限状态机的设计;2.利用状态机实现串行序列的输出与序列的检测。
3.继续学习优化设计。
二、内容与要求利用状态机设计实现实现串行序列的输出与序列的检测,具体要求:1.先设计序列发生器产生序列;2.再设计一个序列信号检测器,若系统检测到串行序列11010则输出为“1”,否则输出为“0”,并将检测到的11010数目显示出来;3.对所设计的电路进行波形仿真和硬件测试;4.整个工程采用顶层文件+底层模块的原理图或文本的设计思路。
三、设计思路/原理图“1”,没有检测到则输出“0”,并且将检测到的信号的显示出来。
为简化设计,整个工程采用顶层文件+底层模块的设计方法。
1.序列信号发生器序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号。
利用状态机设计,首先定义一个数据类型FSM_ST它的取值为st0到st15的16个状态。
REG s0 s1 s2 s3 s4 s5 s6 s7Q 0 1 1 1 0 1 0 0REG s8 s9 s10 s11 s12 s13 s14 s15Q 1 1 0 1 1 0 1 02、序列检测器序列检测器设计的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及序列,直到在连续的检测中收到的每一位码都与预置码相同。
在此,必须利用状态转移图。
定义预置信号D=“11010”,电路需要分别不间断记忆:初始状态、1、11、110、1101、11010共六种状态,状态转移图:3、计数模块利用序列检测器产生的信号(1和0)作为计数器模块的时钟信号,产生的信号0、1变化,形成类似的CLK信号,实现计数模块计数。
计数模块设计可采用前面的实验二设计。
4.顶层设计为简化设计,顶层设计采用原理图输入法设计,直接将模块进行连接。
四、实验程序(陈杰独立编写)序列信号发生器:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY C_OUT ISPORT (CLK,RST :IN STD_LOGIC;CO :OUT STD_LOGIC );END C_OUT;ARCHITECTURE behav OF C_OUT ISTYPE FSM_ST IS (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15); SIGNAL REG:FSM_ST;SIGNAL Q:STD_LOGIC;BEGINPROCESS(CLK,RST)BEGINIF RST ='1' THEN REG<=s0;Q<='0';ELSIF CLK'EVENT AND CLK='1' THENCASE REG ISWHEN s0=> Q<='0'; REG<=s1;WHEN s1=> Q<='1';REG<=s2;WHEN s2=> Q<='1';REG<=s3;WHEN s3=> Q<='1';REG<=s4;WHEN s4=> Q<='0';REG<=s5;WHEN s5=> Q<='1';REG<=s6;WHEN s6=> Q<='0';REG<=s7;WHEN s7=> Q<='0';REG<=s8;WHEN s8=> Q<='1';REG<=s9;WHEN s9=> Q<='1';REG<=s10;WHEN s10=> Q<='0';REG<=s11;WHEN s11=> Q<='1';REG<=s12;WHEN s12=> Q<='1';REG<=s13;WHEN s13=> Q<='0';REG<=s14;WHEN s14=> Q<='1';REG<=s15;WHEN s15=> Q<='0';REG<=s0;WHEN OTHERS=>REG<=s0;Q<='0';END CASE;END IF;END PROCESS;CO<=Q;END behav;转化成可调用的元件:序列信号检测器:LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SCHK ISPORT(DIN, CLK, CLR : IN STD_LOGIC;SS : OUT STD_LOGIC);END SCHK;ARCHITECTURE behav OF SCHK ISSIGNAL Q : INTEGER RANGE 0 TO 5 ;SIGNAL D : STD_LOGIC_VECTOR(4 DOWNTO 0);BEGIND <= "11010" ;PROCESS( CLK, CLR )BEGINIF CLR = '1' THEN Q <= 0 ;ELSIF CLK'EVENT AND CLK='1' THENCASE Q ISWHEN 0=> IF DIN = D(4) THEN Q <= 1 ; ELSE Q <= 0 ; END IF ; WHEN 1=> IF DIN = D(3) THEN Q <= 2 ; ELSE Q <= 0 ; END IF ; WHEN 2=> IF DIN = D(2) THEN Q <= 3 ; ELSE Q <= 2 ; END IF ; WHEN 3=> IF DIN = D(1) THEN Q <= 4 ; ELSE Q <= 0 ; END IF ; WHEN 4=> IF DIN = D(0) THEN Q <= 5 ; ELSE Q <= 2 ; END IF ; WHEN OTHERS => Q <= 0 ;END CASE ;END IF ;END PROCESS ;PROCESS( Q )BEGINIF Q = 5 THEN SS <= ‘1’;ELSE SS <=‘0’;END IF ;END PROCESS ;END behav ;转化成可调用的元件:计数模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNT ISPORT (CLK, EN,RST :IN STD_LOGIC;Q1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Q2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT: OUT STD_LOGIC );END ENTITY COUNT;ARCHITECTURE ONE OF COUNT ISBEGINPROCESS(CLK,EN,RST)V ARIABLE CQI:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINIF RST='1' THEN CQI:= (OTHERS=>'0');ELSIF CLK'EVENT AND CLK='1' THENIF EN='1' THENIF CQI<153 THENIF CQI(3 DOWNTO 0)=9 THEN CQI:=CQI +7; --高位进位ELSE CQI := CQI+1;END IF;ELSE CQI:= (OTHERS=>'0');END IF;END IF;END IF;IF CQI=153 THEN COUT<='1';ELSE COUT<='0';END IF;Q1<=CQI(3 DOWNTO 0);Q2<=CQI(7 DOWNTO 4);END PROCESS COUNT;END ARCHITECTURE ONE;转化成可调用的元件:顶层文件(原理图法):第二种方法(任意序列,任意检测):实验程序如下:library ieee;use ieee.std_logic_1164.all;entity jiance11010 isport(datain,clk:in std_logic;t: in std_logic_vector (4 downto 0);q:out std_logic;cq: out std_logic_vector (4 downto 0)); end jiance11010;architecture rt1 of jiance11010 issignal reg:std_logic_vector(4 downto 0);beginprocess(clk)variable t1:std_logic_vector (4 downto 0);beginif clk'event and clk='1' thenreg(0)<=datain;reg(4 downto 1)<=reg(3 downto 0) ;end if;t1:=t;if reg=t1 then q<='1' ;else q<='0';cq<=reg;end if;end process;end rt1;基于实验发现序列一个一个输入比较麻烦所以设计如下任意十六位循环系列:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jc ISPORT(CLK,CLR,RESET:IN STD_LOGIC;B: in std_logic_vector (15 downto 0) ;q:out std_logic);END ENTITY;ARCHITECTURE ONE OF jc ISSIGNAL A:STD_LOGIC;BEGINPROCESS(CLK,CLR)V ARIABLE N:INTEGER RANGE 16 DOWNTO 1;BEGINIF RESET='1' THEN N:=1;ELSIF CLK'EVENT AND CLK='1'THEN CASE N ISWHEN 1=>A<=B(0);N:=N+1;WHEN 2=>A<=B(1);N:=N+1;WHEN 3=>A<=B(2);N:=N+1;WHEN 4=>A<=B(3);N:=N+1;WHEN 5=>A<=B(4);N:=N+1;WHEN 6=>A<=B(5);N:=N+1;WHEN 7=>A<=B(6);N:=N+1;WHEN 8=>A<=B(7);N:=N+1;WHEN 9=>A<=B(8);N:=N+1;WHEN 10=>A<=B(9);N:=N+1;WHEN 11=>A<=B(10);N:=N+1;WHEN 12=>A<=B(11);N:=N+1;WHEN 13=>A<=B(12);N:=N+1;WHEN 14=>A<=B(13);N:=N+1;WHEN 15=>A<=B(14);N:=N+1;WHEN 16=>A<=B(15);N:=1;WHEN OTHERS=>NULL;END CASE;END IF;Q<=A;END PROCESS;END ARCHITECTURE;五、实验步骤1.建立工作库文件夹和编辑模块设计文件(1)在D盘下建立一个文件夹保存工程文件;(2)打开QuartusII,建立新的VHDL文件,在设计有顶层和底层文件时,在打开的页面下输入模块设计程序。
一设计要求:用状态机设计序列检测器(101)。
二设计功能:考虑一个序列检测器,检测的序列流为“101”,当输入信号中依次有“101”时输出一个高电平脉冲,否则输入为低电平。
三设计思路:首先设置四个状态分别为起始状态S0,S1(出现一个1),S2(相邻两个值为10),S3(相邻三个值为101)。
然后确定状态间的转换关系,此刻状态为S0输入为1时此时出现一个1下一个状态为S1,若输入为0则下一个状态为S0。
此刻状态为S1输入为1此时依然为只出现一个1下一个状态为S1,若输入为0则相邻两个值为10下一个状态为S2。
此刻状态为S2输入为0则下一个状态为S0,若输入为1则相邻三个值为101下一个状态为S3。
此刻状态为S3输入为1则出现一个1下一个状态为S1,若输入为0则相邻两个为10下一状态转移图四源代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY detect101 ISPORT(clk,reset:IN STD_LOGIC;detect_inputs:IN STD_LOGIC;detect_outputs : OUT STD_LOGIC );END detect101;ARCHITECTURE behv OF detect101 ISTYPE FSM_ST IS (s0,s1,s2,s3);SIGNAL current_state,next_state :FSM_ST;BEGINPROCESS(reset,clk)BEGINIF reset='1' THEN current_state<=s0;ELSIF clk= '1' AND clk'event THENcurrent_state<=next_state;END IF;END PROCESS;PROCESS(clk)BEGINIF(clk ='0') THENCASE current_state ISWHEN s0 => detect_outputs <= '0';IF detect_inputs = '1' THEN next_state<=s1;ELSE next_state<=s0;END IF;WHEN s1 => detect_outputs <= '0';IF detect_inputs = '1' THEN next_state <= s1;ELSE next_state <= s2;END IF;WHEN s2 => detect_outputs <= '0';IF detect_inputs = '1' THEN next_state <= s3;ELSE next_state <= s0;END IF;WHEN s3 => detect_outputs <= '1';IF detect_inputs = '1' THEN next_state <= s1;ELSE next_state <= s2;END IF;END CASE;END IF;END PROCESS;END behv;五波形仿真图如图所示当输入含有一组101时输出一个时钟周期的脉冲。
课程:VHDL数字系统设计与测试
题目:序列检测器(1110010)
功能:输入一个串行位流,当出现“1110010”时,输出为1,其它输出为0
设计思路:通过状态机来实现序列检测器
状态机转移图(quartus)
具体的VHDL代码:
library ieee;
use ieee.std_logic_1164.all; //VHDL库声明
entity sequence_dectector is
port(clk,rst,d: in bit;
q: out bit);
end sequence_dectector;//实体定义及输入输出
architecture behavior of sequence_dectector is //构造体部分
type state is (state1,state2,state3,state4,state5,state6,state7,state8);
signal present_state ,next_state: state;//定义枚举数据类型
begin
// 状态机时序逻辑部分的设计
process(rst , clk)
begin
if(rst = '1') then
present_state <= state1; // 复位有效时,状态变为state1
elsif(clk'event and clk = '1') then
present_state <= next_state; // 复位无效时,时钟上升沿状态更新end if;
end process;
//状态机中组合逻辑部分的设计
process(d , present_state) //状态不同时,输出也不同,根据d的不同来确定下一状态
begin
case present_state is
when state1 =>
q <= '0';
if(d = '1') then next_state <= state2;
else next_state <= state1;
end if;
when state2 =>
q <= '0';
if(d = '1') then next_state <= state3; else next_state <= state1;
end if;
when state3 =>
q <= '0';
if(d = '1') then next_state <= state4; else next_state <= state1;
end if;
when state4 =>
q <= '0';
if(d = '0') then next_state <= state5; else next_state <= state4;
end if;
when state5 =>
q <= '0';
if(d = '0') then next_state <= state6; else next_state <= state2;
end if;
when state6 =>
q <= '0';
if(d = '1') then next_state <= state7;
else next_state <= state1;
end if;
when state7 =>
q <= '0';
if(d = '0') then next_state <= state8;
else next_state <= state3;
end if;
when state8 => //此时检测到"1110010",输出为1 q <= '1';
if(d = '0') then next_state <= state1;
else next_state <= state2;
end if;
end case;
end process;
end behavior;
quartus的功能仿真图
有功能仿真图可知代码实现了要求的序列检测器的要求。