整理实验三序列发生器与序列检测器实验报告Word格式文档下载.docx
- 文档编号:13855327
- 上传时间:2022-10-14
- 格式:DOCX
- 页数:17
- 大小:234.81KB
整理实验三序列发生器与序列检测器实验报告Word格式文档下载.docx
《整理实验三序列发生器与序列检测器实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《整理实验三序列发生器与序列检测器实验报告Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
三.设计思路
1.设计分频器因为最终要把待检测序列的检测次数在数码管上显示出,所以必须设计一个分频器,将起始频率作为数码管的扫描频率,而将分频后的频率作为序列发生器的移位频率,所以在程序中设置10KHZ进行分频分成1HZ脉冲(10KHZ的扫描频率是为了让数码管的动态显示更加清晰)
2.设计序列发生器
在这次的设计序列发生器时没有用状态转移的方法来来形成一个16位的序列,而是通过直接设计一串16位的序列,通过对最高位的输出与并置来形成一串循环的16位序列,这样设计简单方便,易于操作与控制,也减少了在状态转移产生的误差,其主要的核心程序为:
architecturebhvofp2is
signalbs:
std_logic_vector(15downto0):
="
0111010011011010"
;
begin
xlout<
=bs(15);
process(clk1hz)
begin
if(clk1hz'
eventandclk1hz='
1'
)then
bs<
=bs(14downto0)&
bs(15);
先将序列最高位输出至序列检测器中,然后在一个脉冲作用下,将此时最高位变成最低位,其余14位不变,使序列循环移动,最终形成一个16位循环序列。
3.设计序列检测器
基本思想是采用有限状态机设计,通过状态的转移来实现被检测序列的的检测,首先设定6个状态S0S1S2S3S4S5通过这6个状态的转移情况来检测出11010这个序列。
但因为序列发生器发生的序列不断循环过程中也会出现一些类似11010的特殊序列,则在状态转移中则需要通过一些状态的变换来检测出里面包含的11010序列,如下文所讲的两种特殊情形便是我们序列发生器产生序列中出现的特殊序列:
(1)在序列发生器产生序列不断循环过程中出现该序列1110100,此序列中也有一个要检测到的序列但在状态转移过程需要注意:
1110100
S0S1S2S2S3S4S5S0
即当S2状态转移到S3状态时,如果此时序列值为1,则只需转移到状态本身S2而不需要转移至S0,这样即可节约转移时间也可提高检测效率,之后的状态按正常转移并且最后从状态S5回到S0。
(2)在序列发生器产生序列不断循环过程中出现该序列110110100,此序列中也有一个要检测到的序列但是在状态团转移时同样需要注意:
110110100
S0S1S2S3S4S2S3S4S5S0
即当状态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'
)then
ledag(4)<
=ledag(3);
---移位输出显示在led上以便观看
ledag(3)<
=ledag
(2);
ledag
(2)<
=ledag
(1);
ledag
(1)<
=ledag(0);
ledag(0)<
=xlout;
--将最近生产的序列赋给最前端的ledge(0)位
endif;
4、设计计数器模块
因为序列发生器产生的序列不断地循环,待检测序列11010的个数很多,则在程序中设计计数模块,当序列检测器模块检测完一次待检测序列11010时产生一次下降沿,而计数器模块通过该下降沿进行计数自动加一,因为用两个数码管来表示待检测序列的个数,所以计数模块取上限为99即用数码管译码模块将计数值在数码管表示出来时最多能计99检测序列之后清零重新计数,这样设计之后比通过LED的亮灭来统计被检测序列的个数更加具体直观。
四、实验程序(程序来源于自己编写)
--总的设计模块如图所示:
--分频器模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityp1is
rt(clk:
instd_logic;
clk1hz:
outstd_logic--分频的频率1HZ的输出端口
);
endp1;
architecturebehaveofp1is
SignalClk_Count1:
std_logic_vector(13downto0);
begin
process(clk)--将10KHZ的频率分频成1HZ
if(Clk'
eventandClk='
if(Clk_Count1<
10000)then
Clk_Count1<
=Clk_Count1+1;
--在小于10000时,自动加1
else
00000000000001"
--超过10000后返回1
endprocess;
Clk1Hz<
=Clk_Count1(13);
--将Clk_Count1的第14位赋给Clk1Hz
endbehave;
--序列发生器模块
libraryieee;
useieee.std_logic_1164.all;
entityp2is
port
(clk1hz:
instd_logic;
--定义输入端口此时频率为1HZ
xlout:
outstd_logic--输出序列发生器产生的序列端口
endentity;
xlout<
--将bs的第16位值赋给xlout
process(clk1hz)
if(clk1hz'
bs<
--前15位保持不变,将bs的第16位并到最前来形成序列的循环
endif;
endprocess;
endbhv;
--序列检测器模块
useieee.std_logic_unsigned.all;
entityp3is
(clr:
--清零端口
--输入信号频率
--输入序列
result:
outstd_logic
architecturebhvofp3is
typestate_valueis(s0,s1,s2,s3,s4,s5);
--定义6个状态
signalstate:
state_value;
signaldclk:
std_logic;
result<
=dclk;
process(clr,clk1hz)
if(clr='
0'
)thenstate<
=s0;
dclk<
='
--检测输入序列“11010”由左开始
elsif(clk1hz'
casestateis
whens0=>
ifxlout='
then--序列值为1S0转态S1,若序列值为0,返回自身
state<
=s1;
elsestate<
whens1=>
then
=s2;
whens2=>
then--序列值为1,S2转向自身,序列值为0,转向S3
=s3;
whens3=>
then
=s4;
whens4=>
then--序列值为0,S4转向S5,输出端为1
=s5;
--若此时序列值为1,S4转向S2
whens5=>
then--序列值1,S5转移至S1,若为0,转向S0
state<
elsestate<
whenothers=>
--其它状态都将返回初始状态
endcase;
endbhv;
--100计数模块
entityp5is
(result:
--前面序列检测模块中检测到序列后产生的跳变信号
d6,d7:
outstd_logic_vector(3downto0)--定义十位个位数值
architecturebehaveofp5is
signalcnt0,cnt1:
std_logic_vector(3downto0):
0000"
--初始化
process(result)
if(result'
eventandresult='
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 实验 序列 发生器 检测器 报告