您好,欢迎访问三七文档
实验报告课程名称:FPGA技术实验名称:用状态机实现序列检测器的设计姓名:学号:班级:指导教师:2实验题目一、实验原理1、实验目的:用状态机实现序列检测器的设计,并对其进行仿真和硬件测试。2、实验内容:应用有限状态机设计思路,检测输入的串行数据是否是“010000”,本次实验由顶层文件、串行检测、并行数据转串行、数码管显示四个模块组成。图3.1整体模块方块图3、序列检测器的原理说明:序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出A,否则输出b。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始状态重新开始检测。例3-1描述的电路完成对特定的序列数100101的检测的部分HDL代码。当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码数相同,则输出“A”,否则仍然输出“b”。4、系统共包括4个模块:4.1、并行数据转串行数据模块(xulie.v)1)、输入端口:clk-----系统时钟,由按键K2通过消抖模块后提供。din6-----6bits输入数据,需在时钟控制下,串行输出。reset----系统复位信号,当reset=1’b1时,系统输出复位,否则系统正常工作。2)、输出端口:din----------1bit输出信号3)、操作要求及功能描述:1、异步复位,在时钟控制下,将并行输入数据din6[5:0],按照din[5],din[4],din[3],din[2],din[1],din[0]的顺序输出至串行检测模块的输入端口din。2、根据设计要求,先画出并行数据转串行数据模块的状态转移图,在此基础上写出HDL代码。3、比较实验指导书提供并行数据转串行数据模块(xulie.v)的参考代码,总结有限状态机的HDL设计方法34.2、串行检测模块(schk.v)1)、输入信号:DIN-----1bit的串行输入数据CLK-----同步输入时钟CLR------异步清零信号,当CLR=1,系统输出置0,否则,系统正常工作2)、输出信号:AB--------4bits数据,如果系统检测到6’b100101的串行输入,AB=4’b1010,否则,AB=4’b1011。3)、操作要求及功能描述:1、根据设计要求,画出串行检测模块(schk.v)的状态转移图,并自行设计HDL源代码。2、用VerilogHDL设计数码管驱动电路、系统顶层电路。3、注意顶层系统中,应加入消抖模块,对K2输入的时钟clk进行消抖处理。注:剩下两个模块在第二次实验中都已经运用过,在这里不另做说明。二、实验步骤(一)新建一个工程,为工程命名、指定存储路径和目标芯片等。(在E盘或者DATA盘的根目录下,以自己的学号为文件名建立工程)。建议工程名、路径名中不要使用中文,file-NewProject。(二)选择Top-level的类型是HDL。图3.2Top-level操作界面(三)做好器件、EDA工具的正确选择,才能使得正常完成锁定引脚、下载的操作。本次实验中仍采用ISE自带的综合和仿真工具。4图3.3器件和EDA工具选择界面(四)建立新VerilogHDL模块编辑窗口,添加文件,选择VerilogModule,建立工程后建立工程后,开始分别设计:1)并行数据转串行数据模块(xulie.v)程序代码如下:modulexulie(clk,din6,reset,din);inputclk;input[5:0]din6;inputreset;outputdin;parameters0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101;reg[2:0]cur_state,next_state;regdin;always@(posedgeclkorposedgereset)if(reset)cur_state=s0;elsecur_state=next_state;always@(cur_stateordin6ordin)begin5case(cur_state)s0:begindin=din6[5];next_state=s1;ends1:begindin=din6[4];next_state=s2;ends2:begindin=din6[3];next_state=s3;ends3:begindin=din6[2];next_state=s4;ends4:begindin=din6[1];next_state=s5;ends5:begindin=din6[0];next_state=s0;enddefault:begindin=1'b0;next_state=s0;endendcaseendendmodule2)串行检测模块(schk.v)程序代码如下:moduleschk(din,clk,reset,AB);inputdin;inputclk;6inputreset;output[3:0]AB;reg[3:0]AB;reg[2:0]cur_state,next_state;parameters0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101,s6=3'b110;always@(posedgeclkorposedgereset)if(reset)cur_state=s0;elsecur_state=next_state;always@(cur_stateordin)begincase(cur_state)s0:beginAB=4'b1011;next_state=(din==0)?s1:s0;ends1:beginAB=4'b1011;next_state=(din==1)?s2:s1;ends2:beginAB=4'b1011;next_state=(din==0)?s3:s0;ends3:beginAB=4'b1011;next_state=(din==0)?s4:s2;ends4:beginAB=4'b1011;next_state=(din==0)?s5:s2;ends5:beginif(din==0)beginAB=4'b1010;next_state=s6;endelsebeginAB=4'b1011;next_state=s0;endends6:beginAB=4'b1011;next_state=(din==0)?s1:s0;endendcaseendendmodule3)数码管显示模块(decled7s.v)程序代码如下:moduledecled7s(IN,OUT);input[3:0]IN;output[6:0]OUT;7reg[6:0]OUT;wire[3:0]IN;always@(IN)begincase(IN)4'b1010:OUT=7'b0001000;4'b1011:OUT=7'b0000011;default:OUT=0;endcaseendEndmodule4)消抖模块(debounce_module.v)程序代码如下:moduledebounce_module(CLK,RSTn,Pin_In,Pin_Out);inputCLK;inputRSTn;inputPin_In;outputPin_Out;wireH2L_Sig;wireL2H_Sig;detect_moduleU1(.CLK(CLK),.RSTn(RSTn),.Pin_In(Pin_In),//input-fromtop.H2L_Sig(H2L_Sig),//output-toU2.L2H_Sig(L2H_Sig)//output-toU2);delay_moduleU2(.CLK(CLK),.RSTn(RSTn),.H2L_Sig(H2L_Sig),//input-fromU1.L2H_Sig(L2H_Sig),//input-fromU1.Pin_Out(Pin_Out)//output-totop);endmodule8(五)按照前述子模块的相同的设计步骤完成,用VerilogHDL将并行数据转串行数据模块(xulie.v)串行检测模块(schk.v)数码管显示模块(decled7s.v)组合为一个模块XULIEQI.v。编写顶层文件将以上模块进行组合,程序代码如下:`timescale1ns/1psmoduleXULIEQI(CLK,RESET,din6,din,AB,LED7S);inputCLK,RESET;input[5:0]din6;output[6:0]LED7S;output[3:0]AB;outputdin;wiredin;wire[3:0]AB;xulieu1(CLK,din6,RESET,din);schku2(din,CLK,RESET,AB);decled7su3(AB,LED7S);endmodule(六)对XULIEQI.v进行综合,功能仿真,时序仿真。(七)将XULIEQI.v文件和消抖模块,用VerilogHDL组合起来,建立顶层模块top.v,该顶层模块不需要仿真。程序代码如下:`timescale1ns/1psmoduleXULIEQI(CLK_50M,CLK,RESET,din6,din,AB,LED7S);inputCLK_50M,CLK,RESET;input[5:0]din6;output[6:0]LED7S;output[3:0]AB;outputdin;wiredin;wirePin_Out;wire[3:0]AB;debounce_moduleu0(CLK_50M,RESET,CLK,Pin_Out);xulieu1(Pin_Out,din6,RESET,din);schku2(din,Pin_Out,RESET,AB);decled7su3(AB,LED7S);Endmodule9(八)进行引脚锁定,然后验证程序后,下载,连接输入信号到FPGA,改变相应的拨动开关和按键,观察结果。三、实验结果及分析(一)、完成并行数据转串行数据模块(xulie.v)程序代码的编写之后,保存文件,然后对此模块进行综合。方法为在sources窗口选中待综合模块(xulie.v),在process窗口双击Synthesize-XST,综合完后可以双击Synthesize-XST下的ViewRTLSchematic,得到综合后的电路图为:图1、模块(xulie.v)的综合电路图(二)、完成串行检测模块(schk.v)程序代码的编写之后,然后对此模块进行综合。由(一)同理可得:综合后的(schk.v)模块电路图为:图2、模块(schk.v)的综合电路图激励信号波形如下(序列号为010000):10添加TestBenchWaveForm文件,进行仿真仿真图如下:根据激励波形和输出波形可得。当序列号为010000时,输出波形为1010,显示“A”,其他结果显示“B”,所以结果正确。(三)、完成数码管显示模块(decled7s.v)程序代码的编写之后,然后对此模块进行综合。由(一)同理可得:综合后的(decled7s.v)模块电路图为:图3、模块(decled7s.v)的综合电路图添加TestBenchWaveForm文件,进行仿真仿真图如下:(四)、完成消抖模块(debounce_module.v)程序代码的编写之后,然后对此模块进行综合。由(一)同理可得:综合后的(debounce_module.v)模块电路图为:11图4、模块(debounce_module.v)的综合电路图(五)、将XULIEQI.v文件和消抖模块,用VerilogHDL组合起来,建立顶层模块top.v,
本文标题:FPGA实验报告
链接地址:https://www.777doc.com/doc-1868767 .html