实验三 序列信号发生器与检测器设计
一、实验目的
1.学习一般有限状态机的设计;
2.利用状态机实现串行序列的输出与序列的检测。 3.继续学习优化设计。 二、内容与要求
利用状态机设计实现实现串行序列的输出与序列的检测,具体要求: 1.先设计序列发生器产生序列0111010011011010;
2.再设计一个序列信号检测器,若系统检测到串行序列11010则输出为“1”,否则输出为“0”,并将检测到的11010数目显示出来; 3.对所设计的电路进行波形仿真和硬件测试;
4.整个工程采用顶层文件+底层模块的原理图或文本的设计思路。 三、设计思路/原理图
根据实验要求,先设计序列发生器产生序列:0111010011011010;再设计检测器,检测串行信号:11010,若检测到11010信号,则输出“1”,没有检测到则输出“0”,并且将检测到的信号的显示出来。为简化设计,整个工程采用顶层文件+底层模块的设计方法。
1.序列信号发生器
序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号。利用状态机设计,首先定义一个数据类型FSM_ST它的取值为st0到st15的16个状态。 REG s0 s1 s2 s3 s4 s5 s6 s7 Q 0 1 1 1 0 1 0 0 REG s8 s9 s10 s11 s12 s13 s14 s15 Q 1 1 0 1 1 0 1 0 2、序列检测器 序列检测器设计的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及序列,直到在连续的检测中收到的每一位码都与预置码相同。在此,必须利用状态转移图。
定义预置信号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 IS
PORT (CLK,RST :IN STD_LOGIC; CO :OUT STD_LOGIC ); END C_OUT;
ARCHITECTURE behav OF C_OUT 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<='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 IS
PORT(DIN, CLK, CLR : IN STD_LOGIC; SS : OUT STD_LOGIC); END SCHK;
ARCHITECTURE behav OF SCHK IS
SIGNAL Q : INTEGER RANGE 0 TO 5 ;
SIGNAL D : STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN
D <= \
PROCESS( CLK, CLR ) BEGIN
IF CLR = '1' THEN Q <= 0 ;
ELSIF CLK'EVENT AND CLK='1' THEN CASE Q IS
WHEN 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 ) BEGIN
IF 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 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; 转化成可调用的元件:
顶层文件(原理图法):
第二种方法(任意序列,任意检测): 实验程序如下:
library ieee;
use ieee.std_logic_1164.all; entity jiance11010 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 jiance11010;
architecture rt1 of jiance11010 is