实验四序列发生器.docx
南昌大学实验报告学生姓名:学号:专业班级:中兴IOl班实验类型:口验证口综合设计口创新实验日期:2023、11、口成绩:实验四序列信号发生器与检测器设计一、实验目的1、学习VHDL文本输入法2、学习有限状态机的设计3、利用状态机实现串行序列的输出与序列的检测4、继续学习优化设计二.实验内容与要求2 .用有限状态机设计序列检测器,实现串行序列IIolO的检测器3 .假设检测到符合要求的序列,那么输出显示位为“1”,否那么为“04 .对检测到的次数计数5 .整个工程采用顶层文件+底层模块的原理图或文本的设计思路三、实验仪器PC机、QUartUSH软件、EDA实验箱四、实验思路1 .设计序列发生器根本思想为一个信号CQI计数,给另一个信号CO(代表序列的每一位)赋值的方法:先设定端口CQ1用于产生序列时计数,因为序列共16位,因此端口CQ1为标准逻辑矢量,位宽为4,设另一个端口M代表序列的每一位,CQI每计一个数,就给M赋一个值,这样产生一个16位的序列。由于端口不能参与相关运算,因此在结构体中我分别定义了信号CQl(标准逻辑矢量,位宽4),信号Q与相应的端口CQ1CO对应,在进程中参与相应的运算,在程序的最后再用端口接收信号:C0<=Q;在进程中我采用case-when语句,如当CQl为“0000”的时候,给另一信号Q赋'0',当CQl为“0001时,为Q赋'1'以此类推,且让CQl产生循环,即可源源不断的产生所需序列了,如下表CQl0000000100100011010001010110OlllQ01110100CQl10001001101010111100HOl1110HllQ110110102 .序列检测器序列检测器设计的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及序列,直到在连续的检测中收到的每一位码都与实验要求相同。在此,必须利用状态转移图。3 .时钟脉冲的选择数码管显示的扫描时钟需要很快的速度,因此采用IKHz频率的时钟;而序列发生器,为了能够人眼识别亮灭,那么我选择采用2000分频之后得到的0.5Hz频率五.原理图输入法设计(程序来源:根本上独立完成)1 .建立文件夹建立自己的文件夹(目录),如c:myeda,进入WindOWS操作系统QuartusII不能识别中文,文件及文件夹名不能用中文。2 .原理图设计输入翻开QUartUSII,选菜单FileNew,iDeviceDesignFile->BIockDiagram->SchematicFile,z项。点击“OK,在主界面中将翻开“Bk>CkEditOr”窗口。(1)分频器模块实体名为DIV)本设计使用的FPGA开发板中使用的芯片是CycloneIIEP2C35F672C8,使用的是IOkHz的时钟脉冲输入,根据电路的具体设计需要,对其进行分频设计。如图1所示为系统的分频模块,其中模块Clockout管脚输出为0.5hz的时钟脉冲,得出序列发生器和序列检测器模块正常工作的时钟信号,在ClOCkin管脚输出为一个IkhZ的时钟脉冲,作用与动态扫描模块的正常工作。输入管脚:Clockin为Ikhz脉冲输入;输出管脚:CloCkOUt为0.5hz脉冲输出;图1一时间:2023年11月10号-版本:7.2一功能:分频器2000分频)分频模块DIV源代码div.vhd如下:分频程序,从IKHZ中得到0.5HZ的计数频率,2000分频LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;-这3个程序包足发应付大局部的VHDL程序设计USEIEEE.STD_LOGIC_Arith.ALL;USEIEEE.STD_LOGIC_Unsigned.ALL;ENTITYDIVISGENERlC(N:Integer:=20000);-此处定义了一个默认值N=100O0,即电路为IOooO分频电路;Port(ClockinJNSTD.LOGIC;ClockOutiOUTSTD_LOGIC);END;ARCHITECTUREDeviderOFDIVISSIGNALCounteriIntegerRANGE0TON-1;SIGNALTempi:STD_LOGIC;一信号的声明在结构体内,进程外部BEGINPRoCESS(CIockin)BEGINIFRISING-EDGE(Clockin)THENIFCounter=N-ITHENcounter<=0;Templ<=NotTemp1;ELSECounter<=Counter+1;IFCounter=(N2-l)THENTemp1<=NOTTemp1;ENDIF;ENDIF;ENDIF;ENDPROCESS;ClockOuK=Templ;END;(2)序列发生器模块,(实体名为C_OUT)序列发生器模块如图2所示,其中:输入管脚:CLK为0.5hz的时钟脉冲;RST为复位信号;输出管脚:CO序列发生器设计时用于计数,实现模16计数,以产生16位的序列图2一时间:2023年11月10号一版本:7.2一功能:产生一个十六位的指定序列C_OUT-LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIeLUNSlGNED.ALL;-为了重载ENTITYC_OUTISPORT(CLK,RST:INSTD_LOGIC;定义时钟和复位信号Co:OUTSTD.LOGIC);-序列发生器设计时用于计数,实现模16计数,以产生16位的序列ENDC-OUT;ARCHITECTUREbehavOFC_OUTISSIGNALCQ1:STD_LOGIC_VECTOR(3DOWNTO0);-定义信号进行计数.实现模16计数,对应依次产生序列的位。到位15;SIGNALQ:STD_LOGIC;BEGINPROCESS(CLK,RST,Q)BEGINIFRST=1THENCQ1<="OOOO"Q<=,0'-如果复位,那么计数器清0,M也清0ELSiFClkeventandclk="thenCQ1<=CQ1+1;-时钟上升沿到来,Q开始计数,产生序列CASECQ1ISWHEN,0000"=>Q<=,0'WHEN,000Ih=>Q<=,;WHEN"0010"=>Q<=,;WHEN,0011"=>Q<=,;WHEN,0100"=>Q<=,0'WHEN"0101,'=>Q<=,;WHEN"0110,t=>Q<=,0,;WHEN"0111"=>Q<='0'WHEN"1000"=>Q<=,;WHEN"100'=>Q<=,;WHEN"1010"=>Q<='0'WHEN"1011,'=>Q<=,;WHEN,1100"=>Q<=,;WHEN,110'=>Q<=,0'WHEN,1110"=>Q<=,;WHEN"1111"=>Q<=,0'ENDCASE;ENDIF;ENDPRoCESSL序歹IJ发生器到此结束CO<=Q;ENDbehav;(3)序列检测模块:(实体名为SCHK)序列检测模块如图3所示,其中:输入管脚:CLK为0.5hz的时钟脉冲;EN为使能端,为1才正常工作;M为显示当前产生的位;输出管脚:N为显示满足序列要求时,产生T',即为标志位。图3一时间:2023年11月10号一版本:7.2一功能:检测指定的序列SCHKLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGlCJJNSlGNED.ALL;为了重载ENTITYSCHKISPORT(CLK,EN,M:INSTD_LOGIC;-EN为使能端,为1才正常工作;M为显示当前产生的位N:OUTSTD_LOGIC);-N为显示满足序列要求时,产生T,即为标志位ENDSCHK;ARCHITECTUREbehavOFSCHKISTYPESTATEIS(SO§52$35455);状态机的定义,5个状态SIGNALS:STATE;SIGNALA1,A2,A3,A4,A5:STD_LOGIC;-SIGNALQ:INTEGERRANGE0TO5;-SIGNALD:STD_LOGIC_VECTOR(4DOWNTO0);SIGNALN1:STD_LOGIC;BEGINPRoCESS(CLK,S,N1,EN)一序列检测器进程BEGINIFEN='O'THENS<=SO;NI<=,0'A5<='0'A4<='0'A3<='0'A2<='0'A1<='0,;ELSIFCLKtEVENTANDCLK=,O'THENNI<=,0'CASESISWHENSO=>ifM=TthenS<=SIjelseS<=SO;endif;WHENSl=>ifM-thenS<=S2;elseS<=SO;endif;WHENS2=>ifM='0'thenS<=S3;elseS<=S2;endif;WHENS3=>ifM-thenS<=S4;elseS<=SO;endif;WHENS4=>ifM='O,thenS<=S5;-生成一个IlOlO序列Nl<='l,;elseS<=S2;endif;-11011010里有一个,同时计数WHENothers=>S<=SO;ENDCASE;A5<=A4;一移位输出显示在led上以便观看A4<=A3;A3<=A2;A2<=A1;A1<=M;-将最近生产的序列赋给最前端的Al位endif;N<=N1l显示检测到IlOl0,检测到时它为高电平,它所对应二极管亮,否那么二极管灭ENDPROCESS;ENDbehav;(4)16进制计数模块(实体名:COUNT)16进制计数模块如图4所示,其中:输入管脚:CLK为检测到一个序列产生一个脉冲;RST为计数复位信号;EN为使能端;输出管脚:Q3.0为计数的个位;COUNT计数到达15时,产生标志信号图4一时间:2023年11月10号一版本:7.2一功能:16进制计数模块COUNTLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCOUNTISPORT(CLK,RST,EN:INSTD.LOGIC;Q:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD-LOGIC);ENDENTITYCOUNT;ARCHITECTUREONEOFCOUNTISBEGINPROCESS(CLK,EN,RST)VARIABLECQI:STD_L0GIC_VECT0R(3DOWNTO0);BEGINIFRST='THENCQI:=(OTHERS=>'0');ELSIFCLK,EVENTANDCLK='THENIFEN=TTHENIFCQK15THENCQL=CQI