您好,欢迎访问三七文档
实验课程名称序列信号检测器姓名:殷富有学号:GS12062448院系:ComputerschoolofNUDT专业:微电子一、实验目的1.熟悉使用VerilogHdl语言;2.熟悉使用Modelsim、DesignCompiler、Ise等工具;3.掌握用VerilogHdl语言实现状态机的方法;4.利用状态机设计一个序列检测器。二、实验要求设计序列信号检测器,具体要求:当检出输入码流为10011110或11011010时输出检出信号为1,否则为0,同时输出检出该码流的个数(最大计数值可不超过255,否则给出计数溢出信号为1,要求验证时输入码流来自Sequence.txt文件,在testbench中使用系统函数读入,并把输出的信息写入Outcome.txt文件,输出信息包括在什么时候,哪个码流,第几次被检测)。三、实验原理图3.1序列检测器顶层原理图序列检测器在数据通讯,雷达和遥测等领域中用与检测同步识别标志。它是一种用来检测一组或多组序列信号的电路,一旦检测到所需信号就输出高电平,这在数字通信领域有广泛的应运。1.检测码流10011110的设计步骤首先,划分8个状态s0、s1、s2、s3、s4、s5、s6、s7;画出状态转换图如图3.2所示。图3.2检测码流10011110的状态转换图画出状态转换表如表3.3所示。表3.3检测码流10011110的状态转换表次态Sn+1次态Sn+1现态SnA=0A=1现态SnA=0A=1S0S0S1S1S2S1S2S0S3S3S0S4S4S2S5S5S2S6S6S2S7S7S2S02、检测码流11011010的设计步骤首先,划分8个状态ss0、ss1、ss2、ss3、ss4、ss5、ss6、ss7;画出状态转换图如图3.4所示。图3.4检测码流11011010的状态转换图画出检测码流11011010的状态转换表如表3.5所示。表3.5检测码流11011010的状态转换表次态Sn+1次态Sn+1现态SnA=0A=1现态SnA=0A=1SS0SS0SS1SS1SS2SS0SS2SS3SS2SS3SS0SS4SS4SS0SS5SS5SS6SS2SS6SS0SS7SS7SS0SS2四、程序设计1.接口说明类型名称位宽描述备注inputclk1标准时钟信号,周期为10nsinputrst1同步复位信号,低有效维持有效至少两个时钟周期inputData_in1一个2进制的输入数据outputY_9e1检测到码流10011110的输出信号,高有效持续一个时钟周期outputY_da1检测到码流11011010的输出信号,高有效持续一个时钟周期outputNum_9e8检测到码流10011110的次数outputNum_da8检测到码流11011010的次数outputErr_9e1检测到码流10011110的次数超过255次,高有效outputErr_da1检测到码流11011010的次数超过255次,高有效2.检测码流10011110的VerilogHdl源代码always@(posedgeclk)begin//进程1检测码流10011110if(!rst)begin//同步复位Y_9e=1'b0;Err_9e=1'b0;Num_9e=8'd0;stage0=s0;endelsebegincase(stage0)//10011110s0:if(Data_in==0)beginstage0=s0;Y_9e=1'b0;endelsebeginstage0=s1;//检测到1跳转到洗衣状态Y_9e=1'b0;ends1:if(Data_in==0)begin//10stage0=s2;//检测到0跳转到下一状态Y_9e=1'b0;endelsebegin//11stage0=s1;//检测到1等待下一个值Y_9e=1'b0;ends2:if(Data_in==0)begin//100stage0=s3;//检测到0跳转到下一状态Y_9e=1'b0;endelsebegin//101stage0=s1;//检测到1跳转到状态1Y_9e=1'b0;ends3:if(Data_in==0)begin//1000stage0=s0;//检测到0跳转到状态0Y_9e=1'b0;endelsebegin//1001stage0=s4;//检测到1跳转到下一状态Y_9e=1'b0;ends4:if(Data_in==0)begin//10010stage0=s2;//检测到0跳转到状态2Y_9e=1'b0;endelsebegin//10011stage0=s5;//检测到1跳转到下一状态Y_9e=1'b0;ends5:if(Data_in==0)begin//100110stage0=s2;//检测到0跳转到状态2Y_9e=1'b0;endelsebegin//100111stage0=s6;//检测到1跳转到下一状态Y_9e=1'b0;ends6:if(Data_in==0)begin//1001110stage0=s2;//检测到0跳转到状态2Y_9e=1'b0;endelsebegin//1001111stage0=s7;//检测到1跳转到下一状态Y_9e=1'b0;ends7:if(Data_in==0)begin//10011110stage0=s0;//检测到0跳转到状态0继续检测下一个码流Y_9e=1'b1;//检测到一个码流Num_9e=Num_9e+1'b1;//检测到一个码流Num_9e累加一次$display(Num_serial1:Num_9e=%dcounts.,Num_9e);//显示检测到的序列,并输出检测到的次数$display(Num_serial1_time:time=%dns.,10*cnt);//显示检测到的时间if(Num_9e=255)beginNum_9e=8'd0;Err_9e=1'b1;//高有效保持一个时钟endelsebeginErr_9e=1'b0;//没溢出保持低电平endendelsebegin//10011111stage0=s1;//检测到1跳转到状态1Y_9e=1'b0;enddefault:beginstage0=s0;Y_9e=1'b0;Err_9e=1'b0;Num_9e=8'd0;endendcaseendend3.检测码流11011010的VerilogHdl源代码always@(posedgeclk)begin//进程2检测码流11011010if(!rst)begin//同步复位Y_da=1'b0;Err_da=1'b0;Num_da=8'd0;stage1=ss0;//状态0endelsebegincase(stage1)ss0:if(Data_in==0)begin//0stage1=ss0;Y_da=1'b0;endelsebegin//1stage1=ss1;//检测到1跳转到下一个状态Y_da=1'b0;endss1:if(Data_in==0)begin//10stage1=ss0;//检测到0跳转到状态0Y_da=1'b0;endelsebegin//11stage1=ss2;//检测到1跳转到下一状态Y_da=1'b0;endss2:if(Data_in==0)begin//110stage1=ss3;//检测到0跳转到下一状态Y_da=1'b0;endelsebegin//111stage1=ss2;//检测到1等待检测下一个值Y_da=1'b0;endss3:if(Data_in==0)begin//1100stage1=ss0;//检测到0跳转到状态0Y_da=1'b0;endelsebegin//1101stage1=ss4;//检测到1跳转到下一状态Y_da=1'b0;endss4:if(Data_in==0)begin//11010stage1=ss0;//检测到0跳转到状态0Y_da=1'b0;endelsebegin//11011stage1=ss5;//检测到1跳转到下一状态Y_da=1'b0;endss5:if(Data_in==0)begin//110110stage1=ss6;//检测到0跳转到下一状态Y_da=1'b0;endelsebegin//110111stage1=ss2;//检测到1跳转到状态ss2Y_da=1'b0;endss6:if(Data_in==0)begin//1101100stage1=ss0;//检测到0跳转到状态0Y_da=1'b0;endelsebegin//1101101stage1=ss7;//检测到1跳转到下一状态Y_da=1'b0;endss7:if(Data_in==0)begin//11011010stage1=ss0;//跳转到状态0继续下一个码流检测Y_da=1'b1;//检测到一个码流11011010置1保持一个时钟周期Num_da=Num_da+1'b1;//检测到一个码流Num_da累加一次$display(Num_serial2:Num_da=%dcounts.,Num_da);//显示检测到的序列,并输出检测到的次数$display(Num_serial2_time:time=%dns.,10*cnt);//显示检测到的时间if(Num_da=255)beginNum_da=8'd0;Err_da=1'b1;//高有效超过255个置1保持一个时钟endelsebeginErr_da=1'b0;endendelsebegin//11011011stage1=ss2;//检测到1跳转到状态ss2Y_da=1'b0;enddefault:beginY_da=1'b0;Err_da=1'b0;Num_da=8'd0;stage1=ss0;endendcaseendend4.Testbench源代码`timescale10ns/1ns//时间单位moduleseq_test;//测试激励模块regclk,rst,Data_in;wireY_9e,Y_da,Err_9e,Err_da;wire[7:0]Num_9e,Num_da;parameterNum_serial1=10011110;parameterNum_serial2=11011010;reg[10:0]i;regmem[0:4095];//位宽1bit,深度为4096的存取器integerfp_write;sequenceDUT(.clk(clk),.rst(rst),.Data_in(Data_in),.Y_9e(Y_9e),//元件例化.Y_da(Y_da),.Err_9e(Err_9e),.Err_da(Err_da),.Num_9e(Num_9e),.Num_da(Num_da));initial$readmemb(Sequence.txt,mem);//读文本Sequence.txt的数据加载到mem存取器中地址0开始always#5clk=~clk;//产生系统时钟initialbegin//初始化块fp_write=$fopen(Outcome.txt);clk=0;rst=1;#40rst=0;#40rst=1;#800000$stop;$fclose(fp_write);//必须放到停止函数之后endinitialbegin//加载数据块for(i=0;i4095;i=i+1)begin@(posedgeclk);//加载数据时钟同步Data_in=mem[i];endendalways@(posedgeclk)begin//写文件if(Y_9e||Y_da)begin$fdisplay(fp_write,Num_serial1=10011110:%dcounts,time:%dn
本文标题:序列信号检测器论文
链接地址:https://www.777doc.com/doc-7317431 .html