1数字电路与逻辑设计实验实验名称:序列信号检测器的设计与实现学院:信息与通信工程学院班级:xxxxxxxxxx学号:xxxxxxxxxx班内序号:xx姓名大学霸2一、实验课题序列信号检测器的设计与实现二、实验任务及设计要求(1)熟悉用VHDL语言设计时序逻辑电路的方法。(2)熟悉序列信号检测器的设计方法(3)了解状态机的设计方法用VHDL语言设计实现一个序列信号检测器,当检测到“101”时,输出为“1”;其他情况时,输出为“0”,仿真验证其功能,并下载到实验板测试。三、设计思路与过程实验需要4个端口,时钟输入clk,数据输入d_in,输出f。根据老师的要求后面还加入了时钟显示clk_out来保证数据输入在时钟上升沿之前1、设计思路序列检测器有输入信号d_in和输出信号f。输入输出的的逻辑关系为:当外部输入x第一个为“1”,外部输出Z为“0”;当外部输入x第二个为“0”,外部输出Z为“0”;当外部输入x第三个为“1”,外部输出Z才为“1”。要判断输入序列中的一段是否为“101”,电路需要用不同的状态来标记。假设电路的初始状态A,d_in输入第一个“1”,检测器状态由A转换到B,B代表101序列中的第一个“1”,输出为f=0,如果之后继续输入“1”还会保持在这个状态;d_in输入“0”,检测器由B转换到C,C代表101序列中的“0”,输出f=0;d_in输入第三个值“1”时检测到完整的101序列,输出f=1,同时因为输入为“1”,状态由C又转换回B;如果d_in输入第三个值为“0”,状态由C退回到初始状态A,输出f=0。以上为序列检测器的功能分析。由此可以画出序列检测器的状态图3状态表如下:nS1nSZX=0X=1X=0X=1AAB00BCB00CAB012、实验过程(1)用计算机QuartusII9.0软件新建工程,新建VHDL,写入程序代码,运行调试直至编译成功。(2)新建波形仿真软件,设置endtime,输入输出信号,运行,观察仿真结果确认无误。(3)将实验板与计算机相连,设置管脚后再次编译工程。(4)下载至实验板,检查其功能准确无误。四、VHDL代码单进程状态机P1:process(clk_tmp)—分频过后的时钟信号beginif(clk_tmp'eventandclk_tmp='1')then0/0ABC0/01/01/00/01/14casestateiswhenA=if(d_in='1')thenstate=B;--A状态elsestate=A;endif;f='0';whenB=if(d_in='1')thenstate=B;--B状态elsestate=C;endif;f='0';whenC=if(d_in='1')thenstate=B;f='1';--C状态elsestate=A;f='0';endif;endcase;endif;endprocess;分频器:实验板提供的2Hz低频信号感觉还是有点快,所以自己加入了上节课用到的50M分频器,将时钟信号调整成1Hz,同时将时钟信号显示在实验板上,方便观测p2:process(clk)beginif(clk'eventandclk='1')thenifcnt=24999999thencnt=0;clk_tmp=notclk_tmp;elsecnt=cnt+1;endif;endif;endprocess;5clk_out=clk_tmp;完整的结构体定义architecturemealyofd_101istypestate_typeis(A,B,C);signalstate:state_type;signalcnt:integerrange0to24999999;signalclk_tmp:std_logic;beginP1:process(clk_tmp)beginif(clk_tmp'eventandclk_tmp='1')thencasestateiswhenA=if(d_in='1')thenstate=B;elsestate=A;endif;f='0';whenB=if(d_in='1')thenstate=B;elsestate=C;endif;f='0';whenC=if(d_in='1')thenstate=B;f='1';elsestate=A;f='0';endif;endcase;endif;endprocess;p2:process(clk)beginif(clk'eventandclk='1')then6ifcnt=24999999thencnt=0;clk_tmp=notclk_tmp;elsecnt=cnt+1;endif;endif;endprocess;clk_out=clk_tmp;endmealy;五、仿真波形图及其分析分析如下如图所示,当输入信号序列d_in为010101101001010时,能检测到101的有010101101001010,其中第四个值“1”,为两个“101”信号所共用。此时输出信号检测的结果f为000101001000010,在第4,6,9,14个时钟周期检测到目标信号,仿真结果准确无误,说明实现了题目的要求,完成对101信号的检测。由于时钟是上升沿触发,检测器的状态不受干扰,工作稳定。7六、故障及问题分析故障1、波形仿真的输出波形全是0原因:输入信号与时钟信号之间没有匹配解决方法:要想让输入信号与时钟信号对应,适当的修改设定周期,使其满足一定的关系。把输入信号d_in周期设置成时钟信号clk周期的两倍,但发现输入信号为0101010……,不满足随机序列的形式,需要自己手动将d_in的一些部分单独置1或0,这样能更全面直观地检测其功能。故障2、下载到实验板后出错原因:设置管脚后没有编译解决方法:在QuartusII9.0软件中设置管脚之后,再次编译工程无误后,下载到实验开发板上。故障3、拨码输入信号跟不上时钟信号原因:实验板提供的2Hz信号翻转太快解决方法:我在原来设计的VHDL程序里加入50M分频器,让实际的时钟信号变为1Hz,这样拨动拨码开关的速度就能跟得上时钟改变了。实验中还用了发光二极管来显示当前时钟的状态,亮灭分别表示高低电平,可以根据二极管状态来判定时钟的上升沿,输入信号d_in仅在上升沿有效七、总结和结论总结了之前的两次VHDL实验得到的经验,这次小的综合实验感觉还挺顺利的。这次的实验需要我们了解有限状态机的相关知识,在实验之前我预习了实验教程P72~80关于状态机的设计步骤与实例,然后按照步骤完成实验的设计,掌握了这部分的知识,了解到状态机包括时序逻辑电路(存储部分)以及组合逻辑电路(控制部分)进行VHDL实验,理论分析是十分重要的一环,只有逻辑分析透彻无误,才能用语言进行描述,进而用硬件实现。比如这个实验中,三个状态与转换关系的设计是实验的关键,用到了在数电理论课上学到的一般时序电路的设计知识,只有明白了实验背后的逻辑思想,才进行VHDL语言编写,仿真等等在这次实验中,我也发现了一些我的缺点,比如不够细心,VHDL代码调试中出现些小错误,自己发现不了,如果下次能细心点,就完全可以避免,在以后的实验中,我会尽量减少实验中的错误,顺利完成实验任务。同时我也发现了每学一门新知识的重要性,只有当所学的知识可以用来解决实际问题的时候,才是学到精处。通过不断的练习与应用,加深自己的理解,提高能力,学为所用8八、对本课程的建议完成了本学期四次数电基础实验课程之后,学到了很多知识,掌握了QuartusII软件的使用,完成了一些简单的实验,感觉每节课自己都有一些收获。同时为下学期的数电综合实验及以后一些硬件设计打下了基础。在实验课结束之际有一些自己的建议。1、希望这门课能像电子电路实验那样进行周末实验预约,对一些想要在课后单独练习的同学提供机会。2、实验的进度要与理论课的进度一致,记得做第三次实验时序逻辑电路设计时,我们才正学习这部分知识,虽然实验完成了,但对其中的原理还不是非常的了解。3、我发现每节课都有部分剩余的时间,如果有可能的话,可以利用这些时间讲一些这个学科前沿的内容,丰富我们的视野