一、 实验目的
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的作业,从中学会了如何构造一个工程,如何通过状态机来设计一个工程的算法,在工程中如何通过仿真来实现自己所要求的功能。这也是对自己的一次超越与提升。希望以后再接再厉。
用户377235 2015-5-28 17:24