八位序列检测器设计
班级:1302012
学号:
姓名:郭春晖
一、设计说明
使用quartus软件进行仿真和验证,并且还可以检测其他的序列,只需要修改一部分代码就可以实现。
二、方案
工作原理:基于FPGA的多路脉冲序列检测器的设计方案,使用VHDL语言设计时序逻辑电路,先设计序列发生器产生序列:01010;再设计序列检测器,检测序列发生器产生序列,若检测到信号与预置待测信号相同,则输出“1”,否则输出“0”,并且将检测到的信号的显示出来。
三、单元模块设计
1、序列信号发生器
序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号。利用状态机设计,首先定义一个数据类型FSM_ST它的取值为st0到st15的16个状态。
序列信号发生器的代码如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SHK IS
PORT (CLK,RST :IN STD_LOGIC; CO :OUT STD_LOGIC );
END SHK;
ARCHITECTURE behav OF SHK IS
TYPE 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;
BEGIN
PROCESS(CLK,RST)
BEGIN
IF RST ='1' THEN REG<=s0;Q<='0';
ELSIF CLK'EVENT AND CLK='1' THEN
CASE REG IS
WHEN s0=> Q<='1'; REG<=s1; WHEN s1=> Q<='0';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<='0';REG<=s9; WHEN s9=> Q<='1';REG<=s10; WHEN s10=> Q<='1';REG<=s11; WHEN s11=> Q<='0';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;
转化成可调用的元件:
波形仿真如下:
2、序列检测器
脉冲序列检测起可用于检测一组或多组二进制码组成的脉冲序列信号,当序列检测器连续接收到一组穿行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确的序列,直到连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等将回到初始状态重新开始检测。
序列检测器的代码如下:
library ieee;
use ieee.std_logic_1164.all;
entity SCHK1 is
port(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 SCHK1;
architecture rt1 of SCHK1 is
signal reg:std_logic_vector(4 downto 0);
begin
process(clk)
variable t1:std_logic_vector (4 downto 0);
begin
if clk'event and clk='1' then
reg(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;
可调用的元件:
图3.3
波形仿真如下:
3、计数器
利用序列检测器产生的信号(1和0)作为计数器模块的时钟信号,产生的信号0、1变化,形成类似的CLK信号,实现计数器计数。
计数器的代码如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT IS
PORT (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 IS BEGIN
PROCESS(CLK,EN,RST)
VARIABLE CQI:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF RST='1' THEN CQI:= (OTHERS=>'0');
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN
IF CQI<153 THEN
IF 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;
可调用的元件:
波形仿真如下:
4、顶层文件设计
通过前面的准备,我们得到了3个模块,即序列信号发生器、序列检测器、计数器。在此,我们运用原理图法来生成顶层实体。即将上述3个模块,通过我们的设计软件,生成可以移植,调用的原理图文件,在将其在顶层设计中直接调用即可。
本次设计生成的顶层实体如下图所示: