您的当前位置:首页正文

状态机实现序列检测器实训报告

2024-02-17 来源:东饰资讯网


EDA专用周实验报告

课题名称:状态机实现序列检测器 班 级:2010级通信技术 姓 名:范 益 铭 谢 婷 学 号:200912020235 201012020031 指导老师:郭 欣 龚 德 宝

目录

一、实验目的................................................................................................................ 2 二、实验内容................................................................................................................ 2

1.基本内容........................................................................................................... 2 三、实验原理................................................................................................................ 2

1.有限状态机....................................................................................................... 2 2.序列检测器....................................................................................................... 2 四、实验步骤................................................................................................................ 3

1............................................................................................................................... 3 2............................................................................................................................... 3 3............................................................................................................................... 3 4............................................................................................................................... 3 5............................................................................................................................... 3 五、总体功能说明及现象............................................................................................ 3

1.总体功能说明...................................................................................................... 3 2.实验现象.............................................................................................................. 3 六、附录........................................................................................................................ 3 七、总结........................................................................................................................ 6

1............................................................................................................................... 6 2............................................................................................................................... 6

1

八、参考资料................................................................................................................ 6

一、实验目的

训练和提高学生EDA技术应用能力为目的,在实际的课题设计中以锻炼学生以下方面的能力:

 掌握EDA应用系统的设计方法;

 巩固Verilog HDL硬件描述语言在EDA设计中的应用;

 提高学生对利用EDA开发软件Quartus Π进行系统开发的掌握程度。

 掌握利用有限状态机实现一般时序逻辑分析的方法,了解一般状态机的设计

与应用

二、实验内容

1.基本内容

设计一序列检测器并在实验箱上进行硬件测试,利用软件进行设计、仿真验证,最后进行引脚锁定并完成硬件测试。用KEY5控制复位,KEY6控制状态机时钟,KEY1~KEY4控制输入待检测预置数和检测预置数(检测密码),并在数码管1/2和4/5上显示。

三、实验原理

1.有限状态机

有限状态机简写为FSM(),是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。有限状态机主为分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机;第二类,输出不仅和状态有关而且和输入有关系,则称为Melay状态机,而状态机又可以分为同步和异步两种;有限状态机还含有一级具有“记忆”功能的寄存器,常称为状态寄存器,也是组合逻辑和寄存器逻辑的一些种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑有可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。 2.序列检测器

序列检测器可用于检测由二进制码组成的脉冲序列信号。当序列检测器连续

2

收到一组串行二进制码后,如果这组序列码与检测器中预先设置的序列码相同,则输出1,否则输出0。这种检测的关键是必有收到连续的正确码,所以要求检测器必有对前一次接收到的序列码做记忆分析,直到在连续检测中所收到的每一位二进制码都与预置序列码对应相同。在检测过程中,只要有一位不相等都将回到初状态重新开始检测。这里不考虑序列重叠的可能。

四、实验步骤

1.启动Quartus||建立一个空白工程,然后命名为shixun.qpf 2.新建VerilogHDL源程序文件shixun.v, 输入程序代码并保存,进行综合编译。若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

3.选择目标器件并对相应的引脚进行定义锁定,在这里所选择的器件为EPIC6Q240C8芯片,将未使用的引脚设置为三态输入。 4.硬件连接、下载程序。 5.观察现象,检测结果。

五、总体功能说明及现象

1.总体功能说明

按KEY3/KEY4输入检测预置数(在数码管4/5上显示),假设预置数为“11001001”(C9);按KEY1/KEY2输入待检测序列码(在数码管上1/2上显示),也是“11001001”(C9)。设置好之后按KEY5复位(平时数码管8显示“0”),然后按KEY6(CLK)8次,待检测序列码将串行输入,输入过程显示于LED1~LED8上。若串行输入的序列码(LED1~LED8)与预置序列码相同,数码管8显示“F”,否则显示“0”。更改检测预置数重复以上步骤再做验证。 2.实验现象:

首先输入预置数,然后再输入待检测序列码,之后按KEY5复位,数码管8显示“0”,然后再按KEY6(CLK)8次,待检测序列码串行输入显示于LED1~LED8上,当串行序列码与预置序列码相同时,数码管8显示“F”,否则显示“0”。

六、附录

module shixun(clk,key,dig,led,seg); input clk; //系统时钟输入

input[7:0] key; //按键输入

3

output[7:0] seg,dig,led; 显示,位选,LED显示 reg[25:0] counter; 数器 reg clk_out;

//数码管//分频计//分频输

出时钟 reg[7:0] seg,dig,led_r,dout1,dout2,dout3,key_o,key_out;//按键消抖寄存器 reg[3:0] disp_dat,state; //数码管扫描显存,状态机寄存器 reg[7:0] data,dute,led; //序列码输入,预置数输入寄存器 reg[2:0] count; //数码管扫描计数寄存器 wire[7:0] led; wire sda,rst; //串行码输出、复位信号 reg[8:0] data_r; //内部寄存器

reg[3:0] disp_r; //检测结果输出寄存器 assign led=~led_r; assign sda=data_r[8]; parameter s0=4'd0,s1=4'd1,s2=4'd2,s3=4'd3,s4=4'd4; parameter s5=4'd5,s6=4'd6,s7=4'd7,s8=4'd8; //状态机参数

always@(posedge clk) //系统时钟分频 begin clk_out<=(counter>=26'd120000); if(clk_out) begin counter<=26'd0; end else counter<=counter+1'b1; end

always@(posedge clk_out) //消抖、边沿检测 begin dout1<=key; dout2<=dout1;

4

dout3<=dout2;

key_o<=(dout1|dout2|dout3); key_out<=~(dout1|dout2|dout3)&key_o;//边沿检测 end

assign rst=key_out[4];

always@(posedge clk_out) //按键处理 begin if(key_out[0]) data[7:4]<=data[7:4]+1'b1; //待检测序列码 if(key_out[1]) data[3:0]<=data[3:0]+1'b1; if(key_out[2]) dute[7:4]<=dute[7:4]+1'b1; //预置数 if(key_out[3]) dute[3:0]<=dute[3:0]+1'b1; if(key_out[4]) //复位 begin data_r={1'b0,data}; led_r=8'd0; end if(key_out[5]) //按键6 begin data_r=data_r<<1; led_r={data_r[8],led_r[7:1]}; end end

always@( negedge key_out[5] or posedge rst)//状态判断 begin if(rst) state<=s0; //复位 else case(state) s0:if(sda==dute[7])state<=s1;else state<=s0; s1:if(sda==dute[6])state<=s2;else

state<=s0; s2:if(sda==dute[5])state<=s3;else state<=s0; s3:if(sda==dute[4])state<=s4;else state<=s0; s4:if(sda==dute[3])state<=s5;else state<=s0; s5:if(sda==dute[2])state<=s6;else state<=s0; s6:if(sda==dute[1])state<=s7;else state<=s0; s7:if(sda==dute[0])state<=s8;else state<=s0; default:state<=s0; endcase end

always@(posedge clk)//判断结果输出 begin if(state==s8) disp_r<=4'hf; else disp_r<=4'h0; end

always@(posedge clk_out) //数码管扫描计数 begin count<=count+1'b1; end

always@(posedge clk_out) //扫描数码管数据 begin case(count) //扫描数码管 3'd0:disp_dat=data[7:4]; 3'd1:disp_dat=data[3:0]; 3'd2:disp_dat=dute[7:4];

3'd3:disp_dat=dute[3:0]; 3'd4:disp_dat=disp_r; default:disp_dat = 4'h0; endcase case(count) 选择数码管显示 3'd0:dig=8'b01111111; 3'd1:dig=8'b10111111; 3'd2:dig=8'b11101111; 3'd3:dig=8'b11110111; 3'd4:dig=8'b11111110; default: dig=8'b11111111; endcase end

always@(disp_dat) 七段段码译出 begin case(disp_dat) 4'h0:seg=8'hc0; 4'h1:seg=8'hf9; 4'h2:seg=8'ha4; 4'h3:seg=8'hb0; 4'h4:seg=8'h99; 4'h5:seg=8'h92; 4'h6:seg=8'h82; 4'h7:seg=8'hf8; 4'h8:seg=8'h80; 4'h9:seg=8'h90; 4'ha:seg=8'h88; 4'hb:seg=8'h83; 4'hc:seg=8'hc6; 4'hd:seg=8'ha1; 4'he:seg=8'h86; 4'hf:seg=8'h8e; endcase end

endmodule

5

//

//

七、总结

1.

两周的EDA实训结束了,在这紧张而又充实的实训周里,我学到了很多东西,也提升了我在EDA技术各方面的能力,掌握了EDA应用系统的设计方法,巩固了Verilog HDL硬件描述语言在EDA设计中的应用,感谢各位指导老师的耐心教导! “用状态机实现序列检测器”是我们选择的课题,看到实训指导书,两眼茫然,什么都不懂,对这个课题相应的知识,实现的功能等等都是表面意识,感觉非能力所及,在老师大致讲解下,有了一些印象,读懂了它的基本要求,但对其课题原理、实现方法还存在很大缺陷,随后在网上查阅了相关资料,才有了一些自我想法。

这个课题主要分为两个模块进行实验,第一个就是序列检测器模块;第二个就是按键输入、检测结果输出模块。首先从第二课题着手,按其要求,我们先做每个按键分别控制各个数码管,在这个基础上再按照要求一步一步向课题要求逼近,完成第二个模块之后,再按照相关资料完成第一模块。

在程序编写过程中,我们遇到了很多问题,例如:很多always语句中的触发条件不一致,某些变量定义不合要求,在程序处理上欠缺完整考虑,LED显示与串行码不一致,程序出错不知怎么去修改等等,诸如此类,不胜枚举。我们发扬不懂就问的精神,积极向老师询问、请教,终于在老师的耐心指导下,这些问题迎刃而解,不在话下。圆满完成了这个课题。谢谢各位指导老师的辛勤教导! 通过两周的EDA实训,我们学会了状态机实现序列检测器的编写、应用,获益良多,感觉我的EDA知识有了进一步的提升,也对这门课程有了质的认知以及在电学方面的巨大作用,也发现了自身的很多不足,明白了提升自我专业知识和技能的重要性,在以后的学习和生活中,努力奋斗,提升自我,做一个有知识、专业技能的中国大好青年! 范益铭 2.

八、参考资料

[1].《“EDA技术应用”实训专用周指导书/任务书》,电力电子教研室。 [2].《Verilog数字系统设计教程》,夏宇闻,北京航空航天大学出版社。

6

因篇幅问题不能全部显示,请点此查看更多更全内容