原创 VHDL实验一 序列检测器的设计

2010-12-20 16:49 8435 8 9 分类: FPGA/CPLD

一、  实验目的


1、    掌握序列检测器的工作原理


2、    学会用状态进进行数字系统设计


二、  实验原理与内容


1、    序列检测器的基本工作原理


序列检测器用于检测一组或由二进制码组成的脉冲序列信号,在数字通信中有着广泛的应用。当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的监测中所收到的每一位码都与预置的对应码相同。在监测过程中,任何一位不相等都将回到初始状态重新开始监测。


2、    状态机的基本设计思想


在状态连续变化的数字系统设计中,采用状态机的设计思想有利于提高设计效率,增加程序的可读性,减少错误的发生几率。同时,状态机的设计方法也是数字系统中一种常用的设计方法,其输出仅仅是当前状态值的函数,并且在时钟上升沿到来时才发生变化。米立机的输出则是当前状态值、当前输出值和当前输入值的函数。本实验要从一串二进制码中检测出一个已预置的12位二进制码,每增加一位二进制相当于增加一个状态,用12个状态可以实现,其过程如下:


实验程序:(由于单进程和双进程实质上没有什么区别这里只列出双进程的。)


library ieee;


use ieee.std_logic_1164.all;


use ieee.std_logic_unsigned.all;


use ieee.std_logic_arith.all;


 


 


entity detect110 is


  port(clk,D_in:in std_logic;


       en:in std_logic;


       D_out:out std_logic


       );   


end entity;


 


architecture behav of detect110 is


   type state is(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11);


   signal n:state;


   signal p:state;


   begin


   process(clk)


   begin


   if clk'event and clk='1' then


     n<=p;


     end if;


    end process;


   


    process(D_in,clk)


    begin


      if(en='1') then


       case n is


          when s0=>


               if(D_in='1') then


                p<=s1;


                else p<=s0;


                end if;


                D_out<='0';


               


           when s1=>


              if(D_in='1') then


                p<=s2;


                else p<=s0;


                end if;


                D_out<='0';


               


            when s2=>


              if(D_in='1') then


                p<=s2;


                else p<=s3;


                end if;


                D_out<='0';


                  


            when s3=>


              if(D_in='1') then


                p<=s0;


                else p<=s4;


                end if;


                D_out<='0'; 


                  


            when s4=>


              if(D_in='1') then


                p<=s5;


                else p<=s0;


                end if;


                D_out<='0'; 


               


             when s5=>


              if(D_in='1') then


                p<=s6;


                else p<=s0;


                end if;


                D_out<='0'; 


                  


            when s6=>


             if(D_in='1') then


                p<=s7;


               else p<=s3;


                end if;


               D_out<='0';   


               


            when s7=>


              if(D_in='0') then


               p<=s3;


               else p<=s8;     


                end if;


                 D_out<='0';           


 


            when s8=>


              if(D_in='1') then


                p<=s2;


                else p<=s9;     


                end if;


                 D_out<='0';


                   


             when s9=>    


              if(D_in='1') then


                p<=s0;


                else p<=s10;     


                end if;


                 D_out<='0';


              


             when s10=>    


              if(D_in='1') then


                p<=s5;


                else p<=s11;     


                end if;


                 D_out<='0'; 


                


             when s11=>    


              if(D_in='0') then


                p<=s0;


                else p<=s0; D_out<='1';   


                end if;


             when others=>null;


             end case;


            else  D_out<='0'; 


          end if;


           end process;


      end behav;


生成的状体机:



仿真波形生成



生成的结构图:



方法二:利用移位寄存器实现序列检测:上面检测的原理是:逐位检测,的那个检测到信号时则转入下一个状态。


这种检测的原理清晰,但缺点是当检测到序列比较长时就非常麻烦,而且检测的灵活性差。利用移位寄存器能实现简便快速,可移植的序列检测器。


程序设计如下:


library ieee;


use ieee.std_logic_1164.all;


use ieee.std_logic_unsigned.all;


use ieee.std_logic_arith.all;


 


entity detect_s is


  port(datain,clk,en:in std_logic;


       q:out std_logic);


end entity;


 


architecture behav of detect_s is


signal reg:std_logic_vector(11 downto 0);


begin


   process(clk)


   begin


     if clk'event and clk='1' then  --第一个if语句


        if (en='0') then


         reg(0)<=datain;    --被检测数据打入第一个寄存器的0位


         reg(11 downto 1)<=reg(10 downto 0);   --内部寄存器进行想高位移位操作


         else q<='0';


         end if;


     end if;                 


     if reg="110011110001" then q<='1';    --第一个if语句是判断检测到“0111110”


                                       --序列是把标志位置一


     else q<='0';


     end if;


     end process;


  end behav;


仿真生成波形:



生成的结构图:



 


实验总结:其中根据生成的结构图比较可以知道,明显是程序二比较有优势:程序简短,可以移植,同时占用的资源也相对的较少。在实验的过程中主要是体会到了如何设计状态机,利用状体机来解决问题。虽然程序一只是改写课本的程序,但是这也是我的第一个VHDL的作业,从中学会了如何构造一个工程,如何通过状态机来设计一个工程的算法,在工程中如何通过仿真来实现自己所要求的功能。这也是对自己的一次超越与提升。希望以后再接再厉。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2015-5-28 17:24

用不上那个怎么办
相关推荐阅读
用户307537 2011-07-12 01:24
ad603中文资料
ad603中文资料 2008-03-24 21:32:16|  分类: 电子设计 |  标签: |字号大中小 订阅 正文内容: 在很多信号采集系统中,信号变化的幅度都比较大,那么放大以后的信号幅...
用户307537 2011-06-10 20:39
电脑PC端下载电子市场(Market)软件,Android SDK模拟器安装电子市场(Market)
http://bbs.dospy.com/thread-10844471-1-404-1.html...
用户307537 2011-06-02 15:48
使用BSRR和BRR寄存器直接操作STM32的I/O端口
标签: STM32  GPIO   使用BSRR和BRR寄存器直接操作STM32的I/O端口 STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通...
用户307537 2011-05-30 22:53
免费芯片申请地址
免费芯片申请地址 1、铁电存储器(未见量的限制,据说最多有人申请了100片,不知真假.)介绍:铁电存储器(FRAM)产品将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结...
用户307537 2011-03-20 23:16
STM32高级控制定时器1学习
学习STM32这么久了,很想将所学到的东西总结一下,好让自己不会在遗忘中迷失。 高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。 用途在于:测量输入信号的脉冲...
用户307537 2011-03-20 01:02
2440串口纠结后
以前一直都是在纠结在串口中,现在终于解决了。我整个人都好像轻松了不少。我又可以进行我的嵌入式之旅了。原来市面上卖的串口线,有两种,一种是默认TXD和RXD相连的,而另外一种没有,所以,我不知道,刚刚好...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条