您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 2013级编码训练模板
西北工业大学《编码训练》实验报告学院:软件与微电子学院班级14021302学号:2013303524姓名:蒋雨岑专业:微电子科学与工程时间:2015年12月1、编写一个自动售货机VerilogHDL模型(20分)1)售货机出售15美分的饮料。2)投币器只接受5分和1角硬币。3)必须提供适当数目的零钱,投币器不找钱。实验要求:1)定义状态,并画出状态转换图,解释设计思路;2)使用VerilogHDL语言完成设计;3)编写testbench,并使用modelsim进行仿真;4)分析仿真结果。1)定义状态,并画出状态转换图,解释设计思路自动售货机的状态定义:初始状态(IDLE):未投币A状态:已投入五分硬币B状态:已投入一角硬币状态转移图如下:由图可得:从初始状态投入五分的硬币进入状态A,此时out=0,表示无饮料输出;若投入一角硬币,进入状态B,此时out=0,无饮料输出;状态A同样有两个跳转,当状态A输入一角时,有饮料输出,且回到初始状态;本售货机不包括找零功能,因此不存在状态B到A的转换;并且当输入为零时各自保持现有状态。在设计代码时,输入信号经过一段时间后(在一个时钟周期内)要归零,否则会一直有货物输出。(既可在测试代码中实现,也可在源代码中实现。)2)使用VerilogHDL设计的源代码如下:moduleautosall(datain,dataout,rst,clock);inputdatain,rst,clock;outputdataout;regdataout;reg[1:0]state;wire[1:0]datain;parameterIdle=2'b11,A=2'b00,B=2'b01;always@(posedgeclock)beginif(!rst)beginstate=Idle;dataout='b0;endelsecase(state)Idle:if(datain==A)beginstate=A;dataout=0;endelseif(datain==B)beginstate=B;dataout=0;endelsebeginstate=state;dataout=0;endA:if(datain==A)beginstate=B;dataout=0;endelseif(datain==B)beginstate=Idle;dataout=1;endelsebeginstate=state;dataout=0;endB:if(datain==A)beginstate=Idle;dataout=1;endelseif(datain==B)beginstate=Idle;dataout=1;endelsebeginstate=state;dataout=0;enddefault:state=Idle;endcaseendendmodule3)编写testbench测试代码如下:moduletop;regclock;reg[1:0]coin;regreset;wirebottle;autosallY(coin,bottle,reset,clock);initial$display(coin=%b,clock=%b,reset=%b,bottle=%b,coin,clock,reset,bottle);initialbeginclock=0;coin=0;reset=0;#50reset=1;@(negedgeclock);#80coin=1;#40coin=0;#80coin=1;#40coin=0;#80coin=1;#40coin=0;#180coin=1;#40coin=0;#80coin=2;#40coin=0;#180coin=2;#40coin=0;#80coin=2;#40coin=0;#180coin=2;#40coin=0;#80coin=1;#40coin=0;#80$finish;endalwaysbegin#20clock=~clock;endendmodule4)分析仿真结果仿真结果图如下:测试代码采用输入脉冲的形式,否则会一直出现饮料。由仿真图形可得:连续投入三个五分硬币,在投入第三个硬币的时钟上升沿会出现一瓶饮料;投入一个五分,一个一角会出现一瓶饮料;投入两个一角的会出现一瓶饮料,但不找零,而且会把里面剩的钱清空。2、设计PCM30基群帧同步电路(40分)该PCM30机群系统结构如下:输入输出信号说明:DATA:输入串行码流,速率为2.04Mb/S;CLK:输入时钟,频率为2.04MHz;/FLOSS:输出失步信号,低电平有效。电路功能说明:1.输入码流DATA,速率为2.04Mb/S;每帧256bit,其中前8bit为帧同步码;偶数帧的帧同步码为10011011,奇数帧的帧同步码为110XXXXX(X为任意值)。2.系统初始状态为失步态,失步信号FLOSS输出低电平,电路在输入码流里逐比特搜寻同步码,当搜寻到第一个偶帧同步码后,电路转为逐帧搜寻,当连续三帧均正确地搜寻到同步码后,系统状态转为同步态,失步信号输出高电平;否则电路重新进入逐比特搜寻状态。3.系统处于同步态后,当连续四帧检出的同步码均错误,则系统转为失步态,失电路时序说明:1)输入信号DATA与CLK的时序关系2)同步过程时序与DATA的帧结构定时电路同步搜索DATACLKFLOSS实验要求:1)定义状态,并画出状态转换图,解释设计思路;2)使用VerilogHDL语言完成设计;3)编写testbench,并使用modelsim进行仿真;4)分析仿真结果。1)定义状态,并画出状态转换图,解释设计思路实验设计思路就是在失步状态下先进行逐比特搜索,直到发现第一个偶同步标志,然后进行逐帧搜索,当下一奇帧同步后,继续搜索的偶帧也同步后,进入了同步状态,只要有一个不同步就会立即转入逐比特搜索;所以需要设置一个标志位,记录是第几次偶同步,第二次后就会由失步转入同步状态。在同步之后进行逐帧搜索,要实现连续四帧出错后由同步转入失步状态,否则依然是同步状态,这里实现过程是每经过一次帧检测后会将设置的失步标志位加一,当此标志位大于4之后就会由同步进入失步状态,而在同步过程中对任何一帧的检测通过后就会将标志位清零。此外,要设置一个计数器,以实现逐帧扫描。状态转换图:状态的转换实现了逐比特的奇偶校验,对同步后帧同步位的检测依然可以应用所写的状态,只需要设置一些标志位(p)即可,由于奇偶的帧同步位的位数不一致,所以设置了一个中间信息计数位。各标志位解释如下:O:检验是否连续四次失同步h:奇偶校验区分位m:失步到同步转换区分第几次偶同步n:等效FLOSSp:按帧或比特搜索标志位t:用于区分o是否被赋1值count:中间信息位计数2)使用Verilog语言完成设计modulepcm(x,clk,rst,FLOSS,state,count,o);inputx,clk,rst;outputFLOSS;output[3:0]state;output[8:0]count;output[2:0]o;reg[3:0]state;regFLOSS='b0,h='b0,m='b0,n='b0,p='b0,t='b0;reg[2:0]o=3'b0;reg[8:0]count=9'd0,counter=9'd4;parameterID=4'd0;parameterA=4'd1;parameterB=4'd2;parameterC=4'd3;parameterD=4'd4;parameterE=4'd5;parameterF=4'd6;parameterG=4'd7;parameterI=4'd8;parameterJ=4'd9;parameterK=4'd10;always@(posedgeclk)beginif(o=4&&t!=1)begino=0;n=0;endif(o=5)begino=0;n=0;endendalways@(posedgeclk)beginif(p==0&&FLOSS==1)counter=counter-1;if(counter==0)p=1;if(p==1&&count!=255)begincount=count+1;endif(count==255)begincount=0;p=0;o=o+1;if(o%2==1)beginstate=ID;counter=3;h=0;endelsebeginstate=I;counter=8;h=1;endendif(h==0&&p==0)begincasex(state)ID:if(x==1)beginstate=A;endA:if(x==0)beginstate=B;endelsebeginstate=A;endB:if(x==0)beginstate=C;endelsebeginstate=A;endC:if(x==1)beginstate=D;endelsebeginstate=ID;endD:if(x==1)beginstate=E;endelsebeginstate=ID;endE:if(x==0)beginstate=F;endelsebeginstate=A;endF:if(x==1)beginstate=G;endelsebeginstate=B;endG:if(x==1)beginp=1;count=8;state=I;o=0;if(FLOSS==1)begint=0;endelsebeginh=1;if(m==1)beginn=1;endelsebeginn=0;endendendelsebeginstate=B;enddefault:state=ID;endcaseendelseif(h==1&&p==0)beginm=0;casex(state)I:if(x==1)beginstate=J;endelsebeginstate=ID;endJ:if(x==1)beginstate=K;endelsebeginstate=ID;endK:if(x==0)beginstate=ID;p=1;count=3;o=1;if(FLOSS==1)begint=1;endelsebeginm=1;h=0;endendelsebeginstate=ID;enddefault:h=0;endcaseendendalways@(posedgeclk)if(n==1)beginFLOSS=1;endelsebeginFLOSS=0;endendmodule3)编写testbenchmodulefcm_Top;regclk;reg[675:0]data;wireFLO;wirex;assignx=data[675];always#10clk=~clk;always@(posedgeclk)data={data[674:0],data[675]};initialbeginclk=0;data='b1011_1111_0111_1011_1111_10011011_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11110000_11010000_11110000_11110000_11110000_11110000_111100
本文标题:2013级编码训练模板
链接地址:https://www.777doc.com/doc-3003448 .html