实验三序列发生器与序列检测器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌大学实验报告姓名: 学号:6100210173 专业班级:中兴通信101
实验类型:验证□综合■设计□创新□实验日期:2012、11、16
实验四序列信号发生器与检测器设计
一、实验目的
1、.学习VHDL文本输入法
2、学习有限状态机的设计
3、设计序列信号发生器和检测器
二.实验内容与要求
1. 设计序列发生器,完成序列为0111010011011010的序列生成器
2.用有限状态机设计序列检测器,实现串行序列11010的检测器
3. 若检测到符合要求的序列,则输出显示位为“1”,否则为“0”
4. 对检测到的次数计数
三.设计思路
1.设计分频器
因为最终要把待检测序列的检测次数在数码管上显示出,所以必须设计一个分频器,将起始频率作为数码管的扫描频率,而将分频后的频率作为序列发生器的移位频率,所以在程序中设置10KHZ进行分频分成1HZ脉冲(10KHZ的扫描频率是为了让数码管的动态显示更加清晰)
2.设计序列发生器
在这次的设计序列发生器时没有用状态转移的方法来来形成一个16位的序列,而是通过直接设计一串16位的序列,通过对最高位的输出与并置来形成一串循环的16位序列,这样设计简单方便,易于操作与控制,也减少了在状态转移产生的误差,其主要的核心程序为:
architecture bhv of p2 is
signal bs: std_logic_vector(15 downto 0):="0111010011011010";
begin
xlout<=bs(15);
process (clk1hz)
begin
if (clk1hz'event and clk1hz='1') then
bs<= bs(14 downto 0)&bs(15);
先将序列最高位输出至序列检测器中,然后在一个脉冲作用下,将此时最高位变成最低位,其余14位不变,使序列循环移动,最终形成一个16位循环序列。
3.设计序列检测器
基本思想是采用有限状态机设计,通过状态的转移来实现被检测序列的的检测,首先设定6个状态S0 S1 S2 S3 S4 S5 通过这6个状态的转移情况来检测出11010这个序列。
但因为序列发生器发生的序列不断循环过程中也会出现一些类似11010的特殊序列,则在状态转移中则需要通过一些状态的变换来检测出里面包含的11010序列,如下文所讲的两种特殊情形便是我们序列发生器产生序列中出现的特殊序列:
(1)在序列发生器产生序列不断循环过程中出现该序列1110100,此序列中也有一个要检测到的序列但在状态转移过程需要注意:
1 1 1 0 1 0 0 S0 S1 S
2 S2 S
3 S
4 S
5 S0
即当S2状态转移到S3状态时,如果此时序列值为1,则只需转移到状态本身S2而不需要转移至S0,这样即可节约转移时间也可提高检测效率,之后的状态按正常转移并且最后从状态S5回到S0。
(2)在序列发生器产生序列不断循环过程中出现该序列110110100,此序列中也有一个要检测到的序列但是在状态团转移时同样需要注意:
1 1 0 1 1 0 1 0 0 S0 S1 S
2 S
3 S
4 S2 S3 S4 S
5 S0 即当状态S4转移到S5状态时,如果此时序列值为1,则需要将状态转移至S2状态,从S2状态重新开始检测,而不需要转移至S0,之后其它状态正常转移并且最后由S5状态转移至S0状态。
从上面的流程图可以看出所有的回路在检测完一次序列后在下一次没有该序列时会流向初始状态S0,而当两个或多个被检测序列连续在一起时,状态S5会跳过状态S0直接转移至状态S1完成序列的的检测,直到检测完后再次回到初始状态S0,并且为了避免上面所讲的两种特殊序列在状态转移都进行了改进,在状态S2至状态S3时若序列值为1则返回自身,消除第一种特殊情况下序列的检测问题,在状态S4至状态S5时若序列值为1返回到状态S2,消除第二种特殊情况对1101016序列的检测。
3、此外在设计序列检测器时,为了使实验现象更明显,更好的观测序列的的移动与检测情况我使用了5个LED 分别来显示最新产生的五个序列位,分别输出到端口ledag(4),ledag(3),ledag(2),ledag(1),ledag(0)实现程序语句如下
if(clk1hz'event and clk1hz='1') then
ledag(4)<=ledag(3);---移位输出显示在led 上以便观看
S1
S0
S4
S3
S2
0 1
1
0 1
1
1
S5
ledag(3)<=ledag(2); ledag(2)<=ledag(1); ledag(1)<=ledag(0);
ledag(0)<=xlout;--将最近生产的序列赋给最前端的ledge(0)位 end if; 4、设计计数器模块
因为序列发生器产生的序列不断地循环,待检测序列11010的个数很多,则在程序中设计计数模块,当序列检测器模块检测完一次待检测序列11010时产生一次下降沿,而计数器模块通过该下降沿进行计数自动加一,因为用两个数码管来表示待检测序列的个数,所以计数模块取上限为99即用数码管译码模块将计数值在数码管表示出来时最多能计99检测序列之后清零重新计数,这样设计之后比通过LED 的亮灭来统计被检测序列的个数更加具体直观。 四、实验程序(程序来源于自己编写) --总的设计模块如图所示:
--分频器模块
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity p1 is
rt(clk:in std_logic;
clk1hz:out std_logic --分频的频率1HZ 的输出端口 ); end p1;
architecture behave of p1 is
Signal Clk_Count1 : std_logic_vector(13 downto 0); begin
process(clk) --将10KHZ 的频率分频成1HZ begin
if(Clk'event and Clk='1') then if(Clk_Count1<10000) then
Clk_Count1<=Clk_Count1+1; --在小于10000时,自动加1 else
Clk_Count1<="00000000000001"; --超过10000后返回1
分频模块
序列产
生模块
序列检测模块
100计数模块
扫描译码模块
流水灯(显
示序列移动)模块