序列信号检测器的设计与实现 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电路与逻辑设计实验
实验名称:序列信号检测器的设计与实现
学院: 信息与通信工程学院
班级: xxxxxxxxxx
学号: xxxxxxxxxx
班内序号: xx
姓名大学霸
一、实验课题
序列信号检测器的设计与实现
二、实验任务及设计要求
(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。
以上为序列检测器的功能分析。
由此可以画出序列检测器的状态图
状态表如下:
2、实验过程
(1) 用计算机QuartusII 9.0软件新建工程,新建VHDL,写入程序代码,运行调试直至编译成功。
(2) 新建波形仿真软件,设置endtime,输入输出信号,运行,观察仿真结果确认无误。
(3) 将实验板与计算机相连,设置管脚后再次编译工程。
(4) 下载至实验板,检查其功能准确无误。
四、VHDL代码
单进程状态机
P1:process(clk_tmp)—分频过后的时钟信号
begin
if (clk_tmp'event and clk_tmp='1')then
case state is
when A=>if(d_in='1')then state<=B;--A状态
else state<=A;
end if;
f<='0';
when B=>if(d_in='1')then state<=B;--B状态
else state<=C;
end if;
f<='0';
when C=>if(d_in='1')then state<=B;f<='1';--C状态
else state<=A;f<='0';
end if;
end case;
end if;
end process;
分频器:实验板提供的2Hz低频信号感觉还是有点快,所以自己加入了上节课用到的50M分频器,将时钟信号调整成1Hz,同时将时钟信号显示在实验板上,方便观测
p2:process(clk)
begin
if (clk'event and clk='1') then
if cnt=24999999 then
cnt<=0;
clk_tmp<= not clk_tmp;
else
cnt<=cnt+1;
end if;
end if;
end process;
clk_out<=clk_tmp;
完整的结构体定义
architecture mealy of d_101 is
type state_type is(A,B,C);
signal state:state_type;
signal cnt : integer range 0 to 24999999; signal clk_tmp : std_logic;
begin
P1:process(clk_tmp)
begin
if (clk_tmp'event and clk_tmp='1')then
case state is
when A=>if(d_in='1')then state<=B;
else state<=A;
end if;
f<='0';
when B=>if(d_in='1')then state<=B;
else state<=C;
end if;
f<='0';
when C=>if(d_in='1')then state<=B;f<='1'; else state<=A;f<='0';
end if;
end case;
end if;
end process;
p2:process(clk)
begin
if (clk'event and clk='1') then
if cnt=24999999 then
cnt<=0;
clk_tmp<= not clk_tmp;
else
cnt<=cnt+1;
end if;
end if;
end process;
clk_out<=clk_tmp;
end mealy;
五、仿真波形图及其分析
分析如下
如图所示,当输入信号序列d_in为010101101001010时,能检测到101的有010101101001010,其中第四个值“1”,为两个“101”信号所共用。
此时输出信号检测的结果f为000101001000010,在第4,6,9,14个时钟周期检测到目标信号,仿真结果准确无误,说明实现了题目的要求,完成对101信号的检测。
由于时钟是上升沿触发,检测器的状态不受干扰,工作稳定。
六、故障及问题分析
故障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代码调试中出现些小错误,自己发现不了,如果下次能细心点,就完全可以避免,在以后的实验中,我会尽量减少实验中的错误,顺利完成实验任务。
同时我也发现了每学一门新知识的重要性,只有当所学的知识可以用来解决实际问题的时候,才是学到精处。
通过不断的练习与应用,加深自己的理解,提高能力,学为所用
八、对本课程的建议
完成了本学期四次数电基础实验课程之后,学到了很多知识,掌握了Quartus II软件的使用,完成了一些简单的实验,感觉每节课自己都有一些收获。
同时为下学期的数电综合实验及以后一些硬件设计打下了基础。
在实验课结束之际有一些自己的建议。
1、希望这门课能像电子电路实验那样进行周末实验预约,对一些想要在课后单独练习的同学提供机会。
2、实验的进度要与理论课的进度一致,记得做第三次实验时序逻辑电路设计时,我们才正学习这部分知识,虽然实验完成了,但对其中的原理还不是非常的了解。
3、我发现每节课都有部分剩余的时间,如果有可能的话,可以利用这些时间讲一些这个学科前沿的内容,丰富我们的视野。