实验三序列发生器与序列检测器实验报告_第1页
实验三序列发生器与序列检测器实验报告_第2页
实验三序列发生器与序列检测器实验报告_第3页
实验三序列发生器与序列检测器实验报告_第4页
实验三序列发生器与序列检测器实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档精品文档南昌大学实验报告姓名:_学号: 实验类型:验证6100210173专业班级:中兴通信101综合设计创新口实验日期:2012、11、16实验四序列信号发生器与检测器设计一、实验目的1、 .学习VHDL文本输入法2、学习有限状态机的设计3、设计序列信号发生器和检测器二.实验内容与要求1 .设计序列发生器,完成序列为0111010011011010的序列生成器2 .用有限状态机设计序列检测器,实现串行序列11010的检测器3 .若检测到符合要求的序列,则输出显示位为“1”,否则为“0”生对检测到的次数计数1 .设计分频器因为最终要把待检测序列的检测次数在数码管上显示出,所以必须设计一

2、个分频器,将起始频率作为数码管的扫描频率,而将分频后的频率作为序列发生器的移位频率,所以在程序中设置10KHZS行分频分成1HZ永冲(10KHZ勺扫描频率是为了让数码管的动态显示更加清晰)2 .设计序列发生器在这次的设计序列发生器时没有用状态转移的方法来来形成一个16位的序列,而是通过直接设计一审16位的序列,通过对最高位的输出与并置来形成一串循环的16位序列,这样设计简单方便,易于操作与控制,也减少了在状态转移产生的误差,其主要的核心程序为:architecturebhvofp2issignalbs:std_logic_vector(15downto0):="01110100110

3、11010”;beginxlout<=bs(15);process(clk1hz)beginif(clk1hz'eventandclk1hz='1')thenbs<=bs(14downto0)&bs(15);先将序列最高位输出至序列检测器中,然后在一个脉冲作用下,将此时最高位变成最低位,其余14位不变,使序列循环移动,最终形成一个16位循环序列。3 .设计序列检测器基本思想是采用有限状态机设计,通过状态的转移来实现被检测序列的的检测,首先设定6个状态S0S1S2S3S4S5通过这6个状态的转移情况来检测出11010这个序列。但因为序列发生器发生的序列

4、不断循环过程中也会出现一些类似11010的特殊序列,则在状态转移中则需要通过一些状态的变换来检测出里面包含的11010序列,如下文所讲的两种特殊情形便是我们序列发生器产生序列中出现的特殊序列:(1)在序列发生器产生序列不断循环过程中出现该序列1110100,此序列中也有一个要检测到的序列但在状态转移过程需要注意:1110100S0S1S2S2S3S4S5S0即当S2犬态转移到S3犬态时,如果此时序列值为1,则只需转移到状态本身S2而不需要转移至SO,这样即可节约转移时间也可提高检测效率,之后的状态按正常转移并且最后从状态S5回到S0(2)在序列发生器产生序列不断循环过程中出现该序列110110

5、100,此序列中也有一个要检测到的序列但是在状态团转移时同样需要注意:110110100S0S1S2S3S4S2S3S4S5S0即当状态S4W移到S5犬态时,如果此时序列值为1,则需要将状态转移至S2犬态,从S2状态重新开始检测,而不需要转移至S0,之后其它状态正常转移并且最后由S5状态转移至S0犬态。从上面的流程图可以看出所有的回路在检测完一次序列后在下一次没有该序列时会流向初始状态S0,而当两个或多个被检测序列连续在一起时,状态S5i跳过状态S0直接转移至状态S1完成序列的的检测,直到检测完后再次回到初始状态S0,并且为了避免上面所讲的两种特殊序列在状态转移都进行了改进,在状态S除状态S3

6、时若序列值为1则返回自身,消除第一种特殊情况下序列的检测问题,在状态S4至状态S5时若序列值为1返回到状态S2,消除第二种特殊情况对1101016序列的检测。3、此外在设计序列检测器时,为了使实验现象更明显,更好的观测序列的的移动与检测情况我使用了5个LES别来显示最新产生的五个序列位,分别输出到端口ledag(4),ledag(3),ledag(2),ledag(1),ledag(0)实现程序语句如下if(clk1hz'eventandclk1hz='1')thenledag(4)<=ledag(3);-移位输出显示在led上以便观看ledag(3)<=l

7、edag(2);ledag(2)<=ledag;ledag<=ledag(0);ledag(0)<=xlout;-将最近生产的序列赋给最前端的ledge(0)位endif;4、设计计数器模块因为序列发生器产生的序列不断地循环,待检测序列11010的个数很多,则在程序中设计计数模块,当序列检测器模块检测完一次待检测序列11010时产生一次下降沿,而计数器模块通过该下降沿进行计数自动加一,因为用两个数码管来表示待检测序列的个数,所以计数模块取上限为99即用数码管译码模块将计数值在数码管表示出来时最多能计99检测序列之后清零重新计数,这样设计之后比通过LED勺亮灭来统计被检测序列的

8、个数更加具体直观。r-扫描译 码模块-分频器模块 library ieee;序列检 测模块四、实验程序(程序来源于自己编写)-总的设计模块如图所示:序列产 生模块流水灯(显 示序列移 动)模块use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;100 计数模块必n剧I口 ?!分频模块entityp1isrt(clk:instd_logic;clk1hz:outstd_logic分频的频率1HZ的输出端口);endp1;architecturebehaveofp1isSignalClk_Count1:std_logic_vect

9、or(13downto0);beginprocess(clk)将10KHz的频率分频成1HZbeginif(Clk'eventandClk='1')thenif(Clk_Count1<10000)thenClk_Count1<=Clk_Count1+1;-在小于10000时,自动力口1elseClk_Count1<="00000000000001”;超过10000后返回1endif;endif;endprocess;Clk1Hz<=Clk_Count1(13);将Clk_Count1的第14位赋给ClkIHzendbehave;-序列发

10、生器模块libraryieee;useieee.std_logic_1164.all;entityp2isport(clk1hz:instd_logic;一定义输入端口此时频率为1HZxlout:outstd_logic一输出序列发生器产生的序列端口);endentity;architecturebhvofp2issignalbs:std_logic_vector(15downto0):="0111010011011010"beginxlout<=bs(15);-将bs的第16位值赋给xloutprocess(clk1hz)beginif(clk1hz'eve

11、ntandclk1hz='1')thenbs<=bs(14downto0)&bs(15);-前15位保持不变,将bs的第16位并到最前来形成序列的循环endif;endprocess;endbhv;-序列检测器模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityp3isport(clr:instd_logic;-清零端口clk1hz:instd_logic;-输入信号频率xlout:instd_logic;-输入序列result:outstd_logic);en

12、dentity;architecturebhvofp3istypestate_valueis(s0,s1,s2,s3,s4,s5);定义6个状态signalstate:state_value;signaldclk:std_logic;beginresult<=dclk;process(clr,clk1hz)beginif(clr='0')thenstate<=s0;dclk<='0'-检测输入序歹!J“11010”由左开始when s0=> if xlout='1' state<=s1;else state<=

13、s0;end if;when s1=> if xlout='1' state<=s2;else state<=s0;end if;when s2=> if xlout='0' state<=s3;else state<=s2;end if;when s3=> if xlout='1' state<=s4;else state<=s0;end if;when s4=> if xlout='0' state<=s5; dclk<='1' else

14、state<=s2;end if;when s5=> if xlout='0' state<=s0;else state<=s1;end if;elsif(clk1hz'eventandclk1hz='0')thencasestateisthen序列值为1S0转态S1,若序列值为0,返回自身thenthen序列值为1,S2转向自身,序列值为0,转向S3thenthen序列值为0,S4转向S5,输出端为1-若此时序列值为1,S4转向S2then序列值1,S5转移至S1,若为0,转向S0dclk<='0'when

15、others=>state<=s0;-其它状态都将返回初始状态endcase;endif;endprocess;endbhv;-100计数模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityp5isport(result:instd_logic;-前面序列检测模块中检测到序列后产生的跳变信号d6,d7:outstd_logic_vector(3downto0)-非义十位个位数值);endentity;architecturebehaveofp5issignalcnt0,cnt1:

16、std_logic_vector(3downto0):="0000”;-初始化beginprocess(result)beginif(result'eventandresult='0')thenif(cnt0="1001"andcnt1="1001")then-设置计数上限为99cnt0<="0000"cnt1<="0000"elsif(cnt0="1001")then-BCD码的调整cnt0<="0000"cnt1<

17、=cnt1+1;-接受跳变信号后自动加1计数elsecnt0<=cnt0+1;endif;endif;endprocess;d6<=cnt1;d7<=cnt0;endbehave;-数码管译码模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityp6isport(clk:instd_logic;-扫描频率10KHz的输入端口sel0,sel1,sel2:bufferstd_logic;-数码管的位选信号sg:outstd_logic_vector(6downto0);-数码管

18、的段选sel:outstd_logic_vector(7downto0);d6,d7:instd_logic_vector(3downto0)-计数模块中个位十位的数值);endp6;architecturebehaveofp6issignalcnt:std_logic_vector(1downto0);signalA:std_logic_vector(3downto0);beginprocess(clk)beginifclk'eventandclk='1'thenifcnt<"01"thencnt<=cnt+1;elsecnt<=

19、(others=>'0');endif;endif;sel(0)<=sel0;sel(1)<=sel1;sel(2)<=sel2;casecntiswhen"00"=>sel2<='1'sel1<='1'sel0<='1'A<=d7;when"01"=>sel2<='1'sel1<='1'sel0<='0'A<=d6;whenothers=>null;en

20、dcase;endprocess;process(A)begincaseAis-选择数码管的位置when"0000"=>sg<="0111111”;when"0001"=>sg<="0000110”;when"0010"=>sg<="1011011”;when"0011"=>sg<="1001111”;when"0100"=>sg<="1100110”;when"0101&qu

21、ot;=>sg<="1101101”;when"0110"=>sg<="1111101”;when"0111"=>sg<="0000111”;when"1000"=>sg<="1111111”;when"1001"=>sg<="1101111”;whenothers=>null;endcase;endprocess;endbehave;-数码管显示值为0时的译码值-显小序列移动模块libraryiee

22、e;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityp4isport(clk1hz:instd_logic;xlout:instd_logic;-分频后的频率输入端口-序列发生器产生的序列ledag:bufferstd_logic_vector(4downto0)-5位序列值的输出口);endp4;architecturebehaveofp4isbeginprocess(clk1hz)beginif(clk1hz'eventandclk1hz='1')thenledag(4)<=led

23、ag(3);-序列值向左移动ledag(3)<=ledag(2);ledag(2)<=ledag(1);ledag(1)<=ledag(0);ledag(0)<=xlout;-将最近生产的序列赋给最前端的ledge(0)位endif;endprocess;endbehave;四.实验步骤1 .建立工程项目2 .在VHD闾辑窗口下写好程序,并保存3、进行全编译,没有错误。显示出状态机如图所示:经过了 7 个移”三姐和 ?邓力吗 经过了 9个移位脉冲检测区中上映 位脉冲检测到 巴士1密鸣到下一个11010下一个11010LLHLhILIII I I ILL完全符合前面的设计

24、思想,说明了程序的正确性。4再新建波形仿真文件,引入端口,设置输入5、接下来就是波形仿真了,点击工,时序仿真,结果如下图所示IIIIIIIII|iIIIIIIIIIIIIIIIIIIIIIIIVIIVIIIIIiiiiiiiiviipiiiiiiiiiiiiiiiiiiiiiiviipii'Ii*序列中第一个满足每一个检测到11010的地方(对应ledag 显示 26)11010的地方都有此特征ItIIlliiq n- 15.042 ri15.对”15.E罚M16.(125 i.e16.353 k/刖趾11.001a'immmumimmmuMmmmiuiujMmuiuouMmm

25、mmmiuiuEl熊在计数到99的地方数码管显示o(ASCLL码为01101111)正好是数码管上显示的9下一个数码管应显 示0,仿真出“? ” (ASCLL 为 00111111) 正好显示0五、仿真波形分析结合仿真图和图上的注释对设计的模块进行功能的检测。由于序列产生的是0111010011011010,而要检测白向序列是11010,因此,当检测到一个序列时,须经7或9的移位脉冲才能检测到下一个序列,根据第一个仿真图,可看出仿真是正确的。由于总体的仿真正确了,所以对细节的仿真,例如:序列是如何在移位脉冲的输入下输出的:每检测到一个11010序列,数码管的具体输出是多少等,就不一一作分析了。

26、六、硬件测试EbM. CcAarw IIf |I| Emb*d PLL 40334D7D4jae3EWD70*4日希L口70d* 日了口4I hgi &也0i&tjA-Q- - V9C HHCtE 皿 HbM FillJBIdo-VHm 'saknjlad 4 'Aval-dUo thrvicaa1I <T" OHtl n/fi总上&知田 dgice,.0 mi pi ai io«n deMoef sealed12 2 hi!-.ha5 赛堂郭个 I66日r;uaab 中士21317121回21 皆就室w自二 考S4山山riH

27、募眨£ 尸尸pnrEE Er t462:340典“ -IN. ! !1.Assignments-.>device->引脚锁定,参照下载实验板引脚号说明书,选择适当的引脚_1LocationEnabled1>dk|PIN_C13Yes2drP1N_P£5Yes3,fc>ledaq4PIN_H11Yes4(ledag3PIN_Hi2Yes5ledag2PIN_G14Yes6<ledaglP1N_G15Yes71已由乖PIN.G13Yes8«>5日口PIN_GL0Yes95mP1N_G17Ves10Q的(6PIN_E1SYes11Q对

28、5P1N_F17Yes12»时明PIM_F16Yes13PIN_E1SYes14。期2PIN_F15Yes15PIN_FHYes16»对0PIN_F13Yes17<<new»2.引脚锁定后,保存,必须重新进行一次全程编译,编译通过后才能编程下载。3.编程下载,用下载线将计算机并口和试验箱上的JTAG口接起来,接通电源选择Tools>Programmer菜单,打开programmer窗口。在mode中选中JTAG,将Program/Con巾gure下的方框选中4在开始编程之前,必须正确设置编程硬件。点击“HardwareSetup”按钮,打开硬件设

29、置口。点击“AddHardware”打开硬件添加窗口,在“Hardwaretype'下拉框中选择“USB”,点击OK按钮确认,关闭HardwareSetup窗口,完成硬件设置。5、点击“Start”按钮,开始编程下载然后就可以根据实验要就进行检测,看是否能产生正确的序列,是不是在正确的状态计数等等功能。七、硬件测试结果(1)序列发生器测试结果,实验中产生了序列0111010011011010而且产生的原理即为通过预先设计的一个序列0111010011011010,然后通过把最高位移至最低位后与其余不变的15位相并接形成一个新的序列,然后循环往复,便可循环的产生该序列例如:第一步为0111010011011010第二次为1110100110110100第三次为1101001101101001第四次为1010011011010011第五次为0100110110100111等等然后继续循环相并即产生了序列0111010011011010每一次的最高位都会输出到LED中显示,然后通过循环次数,不断地向右推进,例如上面所写的:LED显示的是01110即灭、亮、亮、亮、灭,第五次的最高位0就是最近新产生的,而该LED就显示在锁定的ledag(4),ledag(3),ledag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论