1、EDA 专用周实验报告课题名称: 用状态机实现序列检测器 班 级: 通信技术 091 姓 名: 指导老师: 日 期: 2011.2.213.5 四川工程学院 通信技术16 目录一、实验目的3二、实验内容3三、实验原理3四、实验步骤4五、实验程序及现象5六、实训总结16七、参考资料19四川工程学院 通信技术16 一、 实验目的掌握利用有限状态机实现一般时序逻辑分析的方法,了解一般状态机的设计与应用。二、 实验内容设计一序列检测器并在 SmartSOPC 实验箱上进行硬件测试。利用Quartus |软件进行设计、仿真验证,最后进行引脚锁定并完成硬件测试。用 KEY5 控制复位,KEY6 控制状态机
2、的时钟,KEY1KEY4控制输入待检预置数和检测预置数(检测密码) ,并在数码管 12 和45 上显示。三、 实验原理(1)序列检测器可用于检测由二进制码组成的脉冲序列信号。当序列检测器连续收到一组串行二进制码后,如果这组序列码与检测器中预先设置的序列码相同,则输出 1,否则输出 0.这种检测的关键是必须收到连续的正确码,所以要求检测器必须对前一次接受到的序列码做记忆分析,直到在连续检测中所收到的每一位二进制码都与预置序列码对应相同。在检测过程中,只要有一位不相等都将回到初始状态重新开始检测。不考虑重叠的可能。(2)为了配合硬件测试,本实验提供了一个测试模块(schk_test),该模块主要产
3、生序列检测器所需的时钟、复位、串行输入序列码及预置数等信号。四川工程学院 通信技术16 对莫模块的各端口说明如下:Clock 系统时钟输入(48MHz)key5.0 按键输入disp3.0 序列检测器检测结果输入(显示于数码管 8)sda 串行序列码输出clkout 序列检测器状态机时钟输出rstout 序列检测器复位信号输出dat7.0 检测预置数输出led7.0 LED 输出seg7.0 数码管段输出dig7.0 数码管位输出四、实验步骤(1)启动 Quartus|建立一个空白工程,然后命名为 schk_top.qpf。(2)新建 VerilogHDL 源程序文件 schk_v,输入程序代
4、码并保存,进行综合编译。若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。(3)将光盘中的 EDA_Component 目录下的 schk_test.bsf,schk_test.v拷贝到工程目录。 (原理图形式需此步骤)(4)新建图形设计文件命名为 schk_top.bdf 并保存,其模块原理图如下:四川工程学院 通信技术16 (5)选择目标器件并对相应的引脚进行定义锁定,在这里所选择的器件为 EPIC6Q240C8 芯片,将未使用的引脚设置为三态输入。(6)将 schk_top.bdf 设置为顶层实体,对该工程进行全程编译处理,若在编译过程中发现错误,则找出错误并更正错误,直至编译
5、成功为止。(7)硬件连接、下载程序。五、实验程序(一)原理图形式的实验参考程序如下:模块 1 为:module schk(sda,clk,rst,dat,disp); /序列检测器模块input sda; /串行序列码输入input clk; /时钟信号输入input rst; /复位信号输入input 7:0 dat; /输入待检测预置数output 3:0 disp; /检测结果输出reg 3:0 disp_r; /检测结果输出寄存器reg 3:0 state; /状态机寄存器四川工程学院 通信技术16 parameter s0=4d0,s1=4d1, /状态机参数s2=4d2,s3=4d
6、3,s4=4d4,s5=4d5,s6=4d6,s7=4d7,s8=4d8;assign disp=disp_r; /输出检测结果always (posedge clk or negedge rst)beginif(rst)state=s0; /复位elsebegincase(state)s0:if(sda=dat7)state=s1;else state=s0; /状态 s0s1:if(sda=dat6)state=s2;else state=s0; /状态 s1s2:if(sda=dat5)state=s3;else state=s0; /状态 s2s3:if(sda=dat4)state=
7、s4;else state=s0; /状态 s3s4:if(sda=dat3)state=s5;else state=s0; /状态 s4s5:if(sda=dat2)state=s6;else state=s0; /状态 s5s6:if(sda=dat1)state=s7;else state=s0; /状态 s6s7:if(sda=dat0)state=s8;else state=s0; /状态 s7default:state=s0;endcaseendendalways (state)beginif(state=s8)disp_r=4hf; /序列码检测正确,输出“F”elsedisp_
8、r=4h0; /序列码检测错误,输出“0”endendmodule模块 2 为:module schk_test(clock,key,sda,clkout,rstout,dat,disp,led,seg,dig); /外接 I/O 口 input clock; /系统时钟 input5:0key; /按键输入 output7:0led; /输出接 LED output7:0seg; /输出接数码管段码 output7:0dig; /输出接数码管位码 /序列码检测模块 I/O 口 output sda; /串行序列码输出 四川工程学院 通信技术16 output clkout; /产生时钟信号输
9、出 output rstout; /产生复位信号输出 output7:0dat; /8 位预置数输出 input3:0disp; /输入检测结果 reg7:0dat_r; /输出寄存器 reg7:0led_r; reg7:0seg_r; reg7:0dig_r; reg16:0count; /时钟分频计数器 reg7:0data; /内部寄存器 reg8:0data_shift; reg5:0dout1,dout2,dout3,buff; /消抖寄存器 reg2:0cnt3; /数码管扫描计数器 reg3:0disp_dat; /数码管扫描显存 reg div_clk; /分频时钟,用于消抖和
10、扫描 wire5:0key_edge; /按键消抖输出 assign dat = dat_r; assign led = led_r; assign seg = seg_r; assign dig = dig_r; /时钟分频部分 always (posedge clock) begin if (count 17d120000) begin count = count + 1b1; div_clk = 1b0; end else begin count = 17d0; div_clk = 1b1; end end /按键消抖部分 always (posedge clock) begin if(
11、div_clk) begin 四川工程学院 通信技术16 dout1 = key; dout2 = dout1; dout3 = dout2; end end /按键边沿检测部分 always (posedge clock) begin buff = dout1 | dout2 | dout3; end assign key_edge = (dout1 | dout2 | dout3) /按键控制处理部分 always (posedge clock) /按键 1 序列码高 4 位 begin if(key_edge0) /下降沿检测 data7:4 = data7:4 + 1b1; end a
12、lways (posedge clock) /按键 2 序列码低 4 位 begin if(key_edge1) /下降沿检测 data3:0 = data3:0 + 1b1; end always (posedge clock) /按键 3 预置数高 4 位 begin if(key_edge2) /下降沿检测 dat_r7:4 = dat_r7:4 + 1b1; end always (posedge clock) /按键 4 预置数低 4 位 begin if(key_edge3) /下降沿检测 dat_r3:0 = dat_r3:0 + 1b1; end assign rstout =
13、 buff4; /按键 5 复位 assign clkout = buff5; /按键 6 时钟 always (posedge clock) begin 四川工程学院 通信技术16 if(key_edge4) /按键 5 复位 begin data_shift = 1b0,data; /重新装载数据 led_r = 8d0; end else if(key_edge5) /按键 6 begin data_shift = data_shift 1; led_r = data_shift8,led_r7:1; /LED 左移显示 end end assign sda = data_shift8;
14、 /串行序列码输出 /数码管扫描显示部分 always (posedge clock) /定义上升沿触发进程 begin if(div_clk) cnt3 = cnt3 + 1b1; end always (posedge clock) begin if(div_clk) begin case(cnt3) /选择扫描显示数据 3d0:disp_dat = data7:4; /第一个数码管 3d1:disp_dat = data3:0; /第二个数码管 3d3:disp_dat = dat7:4; /第四个数码管 3d4:disp_dat = dat3:0; /第五个数码管 3d7:disp_d
15、at = disp; /第八个数码管 default:disp_dat = 4h0; endcase case(cnt3) /选择数码管显示位 3d0:dig_r = 8b01111111; /选择第一个数码管显示 3d1:dig_r = 8b10111111; /选择第二个数码管显示 3d3:dig_r = 8b11101111; /选择第四个数码管显示 3d4:dig_r = 8b11110111; /选择第五个数码管显示 3d7:dig_r = 8b11111110; /选择第八个数码管显示 default:dig_r = 8b11111111; endcase end end 四川工程
16、学院 通信技术16 always (disp_dat) begin case(disp_dat) /七段译码 4h0:seg_r = 8hc0; /显示 0 4h1:seg_r = 8hf9; /显示 1 4h2:seg_r = 8ha4; /显示 2 4h3:seg_r = 8hb0; /显示 3 4h4:seg_r = 8h99; /显示 4 4h5:seg_r = 8h92; /显示 5 4h6:seg_r = 8h82; /显示 6 4h7:seg_r = 8hf8; /显示 7 4h8:seg_r = 8h80; /显示 8 4h9:seg_r = 8h90; /显示 9 4ha:s
17、eg_r = 8h88; /显示 a 4hb:seg_r = 8h83; /显示 b 4hc:seg_r = 8hc6; /显示 c 4hd:seg_r = 8ha1; /显示 d 4he:seg_r = 8h86; /显示 e 4hf:seg_r = 8h8e; /显示 f endcase end endmodule(二)用程序形式做的程序如下;module schk(clock,key,sda,clkout,dat,disp,led,seg,dig); /外接 I/O 口 input clock; /系统时钟 input5:0key; /按键输入 /input sda; /串行序列码输入wire rst; /复位信号输入/input3:0disp; /输入检测结果 /input 7:0 dat; /输入待检测预置数output7:0led; /输出接 LED output7:0seg; /输出接数码管段码 output7:0dig; /输出接数码管位码 output sda; /串行序列码输出 output clkout; /产生时钟信号输出 output7:0dat; /8 位预置数输出 output 3:0 disp; /检测结果输出reg7:0dat_r; /输出寄存器 reg7:0led_r;
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。