实验三序列信号发生器与检测器设计一、实验目的1.学习一般有限状态机的设计;2.利用状态机实现串行序列的输出与序列的检测。3.继续学习优化设计。二、内容与要求利用状态机设计实现实现串行序列的输出与序列的检测,具体要求:1.先设计序列发生器产生序列0111010011011010;2.再设计一个序列信号检测器,若系统检测到串行序列11010则输出为“1”,否则输出为“0”,并将检测到的11010数目显示出来;3.对所设计的电路进行波形仿真和硬件测试;4.整个工程采用顶层文件+底层模块的原理图或文本的设计思路。三、设计思路/原理图根据实验要求,先设计序列发生器产生序列:0111010011011010;再设计检测器,检测串行信号:11010,若检测到11010信号,则输出“1”,没有检测到则输出“0”,并且将检测到的信号的显示出来。为简化设计,整个工程采用顶层文件+底层模块的设计方法。1.序列信号发生器序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号。利用状态机设计,首先定义一个数据类型FSM_ST它的取值为st0到st15的16个状态。REGs0s1s2s3s4s5s6s7Q01110100REGs8s9s10s11s12s13s14s15Q110110102、序列检测器序列检测器设计的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及序列,直到在连续的检测中收到的每一位码都与预置码相同。在此,必须利用状态转移图。定义预置信号D=“11010”,电路需要分别不间断记忆:初始状态、1、11、110、1101、11010共六种状态,状态转移图:3、计数模块利用序列检测器产生的信号(1和0)作为计数器模块的时钟信号,产生的信号0、1变化,形成类似的CLK信号,实现计数模块计数。计数模块设计可采用前面的实验二设计。4.顶层设计为简化设计,顶层设计采用原理图输入法设计,直接将模块进行连接。四、实验程序(陈杰独立编写)序列信号发生器:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYC_OUTISPORT(CLK,RST:INSTD_LOGIC;CO:OUTSTD_LOGIC);ENDC_OUT;ARCHITECTUREbehavOFC_OUTISTYPEFSM_STIS(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);SIGNALREG:FSM_ST;SIGNALQ:STD_LOGIC;BEGINPROCESS(CLK,RST)BEGINIFRST='1'THENREG=s0;Q='0';ELSIFCLK'EVENTANDCLK='1'THENCASEREGISWHENs0=Q='0';REG=s1;WHENs1=Q='1';REG=s2;WHENs2=Q='1';REG=s3;WHENs3=Q='1';REG=s4;WHENs4=Q='0';REG=s5;WHENs5=Q='1';REG=s6;WHENs6=Q='0';REG=s7;WHENs7=Q='0';REG=s8;WHENs8=Q='1';REG=s9;WHENs9=Q='1';REG=s10;WHENs10=Q='0';REG=s11;WHENs11=Q='1';REG=s12;WHENs12=Q='1';REG=s13;WHENs13=Q='0';REG=s14;WHENs14=Q='1';REG=s15;WHENs15=Q='0';REG=s0;WHENOTHERS=REG=s0;Q='0';ENDCASE;ENDIF;ENDPROCESS;CO=Q;ENDbehav;转化成可调用的元件:序列信号检测器:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSCHKISPORT(DIN,CLK,CLR:INSTD_LOGIC;SS:OUTSTD_LOGIC);ENDSCHK;ARCHITECTUREbehavOFSCHKISSIGNALQ:INTEGERRANGE0TO5;SIGNALD:STD_LOGIC_VECTOR(4DOWNTO0);BEGIND=11010;PROCESS(CLK,CLR)BEGINIFCLR='1'THENQ=0;ELSIFCLK'EVENTANDCLK='1'THENCASEQISWHEN0=IFDIN=D(4)THENQ=1;ELSEQ=0;ENDIF;WHEN1=IFDIN=D(3)THENQ=2;ELSEQ=0;ENDIF;WHEN2=IFDIN=D(2)THENQ=3;ELSEQ=2;ENDIF;WHEN3=IFDIN=D(1)THENQ=4;ELSEQ=0;ENDIF;WHEN4=IFDIN=D(0)THENQ=5;ELSEQ=2;ENDIF;WHENOTHERS=Q=0;ENDCASE;ENDIF;ENDPROCESS;PROCESS(Q)BEGINIFQ=5THENSS=‘1’;ELSESS=‘0’;ENDIF;ENDPROCESS;ENDbehav;转化成可调用的元件:计数模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCOUNTISPORT(CLK,EN,RST:INSTD_LOGIC;Q1:OUTSTD_LOGIC_VECTOR(3DOWNTO0);Q2:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDENTITYCOUNT;ARCHITECTUREONEOFCOUNTISBEGINPROCESS(CLK,EN,RST)VARIABLECQI:STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFRST='1'THENCQI:=(OTHERS='0');ELSIFCLK'EVENTANDCLK='1'THENIFEN='1'THENIFCQI153THENIFCQI(3DOWNTO0)=9THENCQI:=CQI+7;--高位进位ELSECQI:=CQI+1;ENDIF;ELSECQI:=(OTHERS='0');ENDIF;ENDIF;ENDIF;IFCQI=153THENCOUT='1';ELSECOUT='0';ENDIF;Q1=CQI(3DOWNTO0);Q2=CQI(7DOWNTO4);ENDPROCESSCOUNT;ENDARCHITECTUREONE;转化成可调用的元件:顶层文件(原理图法):第二种方法(任意序列,任意检测):实验程序如下:libraryieee;useieee.std_logic_1164.all;entityjiance11010isport(datain,clk:instd_logic;t:instd_logic_vector(4downto0);q:outstd_logic;cq:outstd_logic_vector(4downto0));endjiance11010;architecturert1ofjiance11010issignalreg:std_logic_vector(4downto0);beginprocess(clk)variablet1:std_logic_vector(4downto0);beginifclk'eventandclk='1'thenreg(0)=datain;reg(4downto1)=reg(3downto0);endif;t1:=t;ifreg=t1thenq='1';elseq='0';cq=reg;endif;endprocess;endrt1;基于实验发现序列一个一个输入比较麻烦所以设计如下任意十六位循环系列:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYjcISPORT(CLK,CLR,RESET:INSTD_LOGIC;B:instd_logic_vector(15downto0);q:outstd_logic);ENDENTITY;ARCHITECTUREONEOFjcISSIGNALA:STD_LOGIC;BEGINPROCESS(CLK,CLR)VARIABLEN:INTEGERRANGE16DOWNTO1;BEGINIFRESET='1'THENN:=1;ELSIFCLK'EVENTANDCLK='1'THENCASENISWHEN1=A=B(0);N:=N+1;WHEN2=A=B(1);N:=N+1;WHEN3=A=B(2);N:=N+1;WHEN4=A=B(3);N:=N+1;WHEN5=A=B(4);N:=N+1;WHEN6=A=B(5);N:=N+1;WHEN7=A=B(6);N:=N+1;WHEN8=A=B(7);N:=N+1;WHEN9=A=B(8);N:=N+1;WHEN10=A=B(9);N:=N+1;WHEN11=A=B(10);N:=N+1;WHEN12=A=B(11);N:=N+1;WHEN13=A=B(12);N:=N+1;WHEN14=A=B(13);N:=N+1;WHEN15=A=B(14);N:=N+1;WHEN16=A=B(15);N:=1;WHENOTHERS=NULL;ENDCASE;ENDIF;Q=A;ENDPROCESS;ENDARCHITECTURE;五、实验步骤1.建立工作库文件夹和编辑模块设计文件(1)在D盘下建立一个文件夹保存工程文件;(2)打开QuartusII,建立新的VHDL文件,在设计有顶层和底层文件时,在打开的页面下输入模块设计程序。并且生成可调用文件,输入完程序之后逐个编译,注意必须先设为顶层文件,逐个编译无错之后将模块转换为可调用元件。顶层原理图设计和工程编译,新建原理图文件,调用模块文件连接电路,完成顶层设计。新建工程并对工程进行全程编译。4.系统仿真(1)建立新的波形文件;(2)在波形编辑器窗口添加节点,通过Edit-EndTime来设定仿真结束时间,点击save保存;(3)通过Tools下的SimulatorTools项进行仿真,然后观察和分析输出波形。六、实验仿真波形图如下:A程序I仿真波形:1.根据aq右移变化可以看出序列发生器产生输出序列0111010011011010;2.A点可以看出,检测器检测串行信号11010,若检测到11010信号,ss则输出“1”;没有检测到,ss则输出“0”;程序II仿真波形:ABCDE1、由cq输出和datain不难看出,datain输入就是序列的输入,从而实现了任意模的输入。2、由ABCDE五点可以发现当t为不同序列时,程序检测的的系列也不同。程序可以检测不同的输入序列t。从而实现了不同系列的检测。程序III仿真波形:(1)(2)从仿真图(1)可知,当B输入不同序列时,产生的序列也不同从仿真图(2)可知,当B输入一个序列时,输出q无限循环右移输出这个序列5.引脚锁定和下载测试1、引脚锁定在Assigments菜单中选择Pins,打开界面后,在Location栏空白处双击鼠标,依次加入端口,引脚设置参照实验书。确定好引脚后,保存这些信息,然后再进行编译。七、硬件测试程序一、根据电路设计,EN置1,RST(电平2)和RST1置1,对各输入信号复位后,再置0。按CLK脉冲,每按一个CLK脉冲,LED8根据输出一个值,记录LED8的亮暗情况(1:灯亮,0:灯灭),对照与实验要求的序列:0111010011011010是否一致。