VHDL序列检测器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

作业一:序列检测器(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 is
port(cin,clr,clk:in std_logic;
cout:out std_logic);
end sq_det;
architecture behav of sq_det is
type state is(s1,s2,s3,s4,s5,s6,s7,s8);
signal c_state,n_state:state;
begin
process(clk,clr)
begin
if(clr='1')then
c_state<=s1;
elsif(clk'event and clk='1')
then c_state <=n_state;
end if;
end process;
process(c_state,cin)
begin
case(c_state) is
when s1=>cout<='0';
if(cin='1')then
n_state<=s2;
else
n_state<=s1;
end if;
when s2=>cout<='0';
if(cin='1')then
n_state<=s3;
else
n_state<=s1;
end if;
when s3=>cout<='0';
if(cin='1')then
n_state<=s4;
else
n_state<=s1;
end if;
when s4=>cout<='0';
if(cin='1')then
n_state<=s4;
else
n_state<=s5;
end if;
when s5=>cout<='0';
if(cin='1')then
n_state<=s2;
else
n_state<=s6;
end if;
when s6=>cout<='0';
if(cin='1')then
n_state<=s7;
else
n_state<=s1;
end if;
when s7=>cout<='0';
if(cin='1')then
n_state<=s3;
else
n_state<=s8;
end if;
when s8=>cout<='1';
if(cin='1')then
n_state<=s2;
else
n_state<=s1;
end if;
end case;
end process;
end architecture behav;
5 仿真结果与说明
序列检测器程序仿真结果如下图,cin为输入序列信号,clr为复位控制信号,高电平复位清零准备进入工作状态,clk为时钟信号,cout为输出信号。

当检测到序列信号cin中出现““序列的时候,cout输出为高电平。

当没有出现“”序列时,cout输出低电平,如下如所示。

作业二:三位任意二值序列检测器
1 设计功能与要求
(1) 利用有限状态的状态机设计一个序列检测器,序列检测器可以检测输入序列中的任意一个3位2进制数。

(2) 根据设计功能和要求运用VHDL硬件描述语言进行设计编程,并且画出序列检测器的原理流程图。

(3) 对设计的序列检测器程序进行仿真,并予以分析和说明。

2 设计思路
序列检测器的设计是采用VHDL硬件描述语言设计程序,对预先设置的序列信号进行检测。

序列检测器可用于检测任意三位2进制数,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的相同,则输出1,否则输出0。

设计采用有限状态机来实现序列检测器。

3 原理流程图
4.RTL级表示
5.程序
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY detect_3 IS
PORT( Din:IN STD_LOGIC;
Clk:IN STD_LOGIC;
reset:IN STD_LOGIC;
Dout_000,Dout_001,Dout_010,Dout_011,Dout_100,Dout_101, Dout_110,Dout_111:OUT STD_LOGIC
);
END detect_3;
ARCHITECTURE RTL OF detect_3 IS
TYPE STATE IS(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14); SIGNAL pre_state,next_state:STA TE;
BEGIN
PROCESS(Din,pre_state) --Input Combinational Logic
BEGIN
CASE pre_state IS
WHEN S0=>
IF(Din='1') THEN
next_state<=S2;
ELSE
next_state<=S1;
END IF;
WHEN S1=>
IF(Din='1') THEN
next_state<=S4;
ELSE
next_state<=S3;
END IF;
WHEN S2=>
IF(Din='1') THEN
next_state<=S6;
ELSE
next_state<=S5;
END IF;
WHEN S3=>
IF(Din='1') THEN
next_state<=S8;
ELSE
END IF;
WHEN S4=>
IF(Din='1') THEN
next_state<=S10;
ELSE
next_state<=S9;
END IF;
WHEN S5=>
IF(Din='1') THEN
next_state<=S12;
ELSE
next_state<=S11;
END IF;
WHEN S6=>
IF(Din='1') THEN
next_state<=S14;
ELSE
next_state<=S13;
END IF;
WHEN S7=>
IF(Din='1') THEN
next_state<=S8;
ELSE
next_state<=S7;
END IF;
WHEN S8=>
IF(Din='1') THEN
next_state<=S10;
ELSE
END IF;
WHEN S9=>
IF(Din='1') THEN
next_state<=S12;
ELSE
next_state<=S11;
END IF;
WHEN S10=>
IF(Din='1') THEN
next_state<=S14;
ELSE
next_state<=S13;
END IF;
WHEN S11=>
IF(Din='1') THEN
next_state<=S8;
ELSE
next_state<=S7;
END IF;
WHEN S12=>
IF(Din='1') THEN
next_state<=S10;
ELSE
next_state<=S9;
END IF;
WHEN S13=>
IF(Din='1') THEN
next_state<=S12;
ELSE
END IF;
WHEN S14=>
IF(Din='1') THEN
next_state<=S14;
ELSE
next_state<=S13;
END IF;
END CASE;
END PROCESS;
PROCESS(Clk,reset)
BEGIN
IF(reset='1')then
pre_state<=s0;
ELSIF(clk'event and clk='1') THEN pre_state<=next_state;
END IF;
END PROCESS;
PROCESS(pre_state)
BEGIN
IF(pre_state=S7)THEN
Dout_000<='1';
ELSE
Dout_000<='0';
END IF;
IF(pre_state=S8)THEN
Dout_001<='1';
Dout_001<='0'; END IF;
IF(pre_state=S9)THEN Dout_010<='1'; ELSE
Dout_010<='0'; END IF;
IF(pre_state=S10)THEN Dout_011<='1'; ELSE
Dout_011<='0'; END IF;
IF(pre_state=S11)THEN Dout_100<='1'; ELSE
Dout_100<='0'; END IF;
IF(pre_state=S12)THEN Dout_101<='1'; ELSE
Dout_101<='0'; END IF;
IF(pre_state=S13)THEN Dout_110<='1';
Dout_110<='0';
END IF;
IF(pre_state=S14)THEN
Dout_111<='1';
ELSE
Dout_111<='0';
END IF;
END PROCESS;
END RTL;
6.仿真图
仿真图分析:
输入:1111110110100
输出:前三个序列式111,在第四个时钟周期的上升沿,Dout_111置高电平
接着是111,在第五个周期的上升沿,Dout_111置高电平,依次类推,接着是101,对应的Dout_101为高电平。

相关文档
最新文档