1、通用二进制计数器设计一个二进制计数器(默认为8位计数器),具有加/减计数功能、异步复位、预制数功能。代码如下:`defineWIDTH8moduleBinaryCounter(counter,clk,up_down,load,reset,din);outputreg[`WIDTH-1:0]counter;inputclk;inputup_down;//1为加计数,0为减计数inputreset;inputload;//预置数,1有效,din输出到counterinput[`WIDTH-1:0]din;always@(posedgeclkorposedgereset)beginif(reset)counter=0;elseif(load)counter=din;elseif(up_down==1)counter=counter+1;elseif(up_down==0)begincounter=counter-1;if(counter1)counter=0;endendendmodule测试程序如下:`defineWIDTH8moduleBinaryCounter_tb;regclk,up_down,reset,load;reg[`WIDTH-1:0]din;wire[`WIDTH-1:0]counter;integeri;initialbeginclk=0;reset=1;#5reset=0;#3000$stop;endalways#5clk=~clk;/*always@(posedgeclk)beginup_down={$random}%2;load={$random}%2;din={$random}%256;end*/initialbegin#5;for(i=0;i256;i=i+3)begindin=i;#10;endendinitialbeginup_down=1;load=1;#20load=0;#30load=1;#30load=0;endalways#200up_down=~up_down;BinaryCounterbcounter(.counter(counter),.clk(clk),.up_down(up_down),.load(load),.reset(reset),.din(din));endmodule波形图如下:图1二进制计数器波形图图2二进制计数器波形图从图像可看出,20s-50s为加计数,50s-80s时load=1,执行置数功能,80s-200s时up_down=1,为加计数,200s-280s时up_down=0,为减计数。2、格雷码计数器代码如下:`defineWIDTH4moduleGrayCounter(gray,clk,rst_n);output[`WIDTH-1:0]gray;inputclk;inputrst_n;reg[`WIDTH-1:0]binary;always@(posedgeclkornegedgerst_n)beginif(!rst_n)binary=0;elseif(binary16)beginbinary=binary+1;//binary=(binary16)?binary:0;endelsebinary=0;endassigngray[0]=binary[0]^binary[1];assigngray[1]=binary[1]^binary[2];assigngray[2]=binary[2]^binary[3];assigngray[3]=binary[3];endmodule测试程序如下:`defineWIDTH4moduleGrayCounter_tb;wire[`WIDTH-1:0]gray;regclk;regrst_n;initialbeginclk=0;rst_n=0;#10rst_n=1;#1000$stop;endalways#5clk=~clk;/*always@(posedgeclk)beginend*/GrayCountergc(.gray(gray),.clk(clk),.rst_n(rst_n));endmodule波形图如下:图3格雷码计数器波形图(二进制数值)图3格雷码计数器波形图(十进制数值)3、完成一个串并转换电路(8位)的Verilog代码设计。代码如下:moduletransform_cb(sclk,pclk,rst,ser_din,enable,p_dout);inputsclk;inputpclk;inputrst;inputenable;inputser_din;output[7:0]p_dout;reg[7:0]temp,pout_buf;reg[2:0]count;//integeri;always@(posedgesclkornegedgerst)beginif(!rst)begincount=0;temp=0;endelseif(count=3'b111)begincount=count+1;temp[0]=ser_din;temp=temp1;temp[7:0]={temp[6:0],ser_din};endendalways@(posedgepclkornegedgerst)beginif(!rst)pout_buf=0;elsepout_buf=temp;endassignp_dout=(enable)?pout_buf:8'bz;endmodule测试程序如下:moduletransform_cb_tb;regsclk;regpclk;regrst;regenable;regser_din;wire[7:0]p_dout;initialbeginsclk=0;pclk=0;rst=0;enable=0;#15rst=1;enable=1;#15enable=0;#20enable=1;#50enable=0;#50enable=1;#1000$stop;endalways#5sclk=~sclk;always#40pclk=~pclk;always@(posedgesclk)ser_din={$random}%2;transform_cbps(.sclk(sclk),.pclk(pclk),.rst(rst),.ser_din(ser_din),.enable(enable),.p_dout(p_dout));endmodule波形图如下:图58位串并转换电路波形图图68位串并转换电路波形图图78位串并转换电路波形图图88位串并转换电路波形图从图中可以看出,0-15s、30s-50s时enable无效,输出为三态;15s-30s、50s-100s时enable有效,输出8位并行数据;在200s、280s、360s可以看出,每到pclk上升沿,同步输出一个并行8位数据。4、设计交通灯控制器(有限状态机问题)。主干道上车很多,有最高优先级,默认主干道是绿灯亮;支路偶尔有车,有车时必须变绿灯,只要维持足够的时间,能让车通过即可;支路上只要不再有车,则支路绿灯变黄灯,然后变红灯;同时主干道亮绿灯;有一个传感器监视支路上是否有车,向控制器输入信号X;X=1表示有车,否则X=0;代码如下:moduletraffic_light(clock,clear,x,hwy,cntry);inputclock;inputclear;inputx;outputreg[1:0]hwy;//主绿hwy=2'b00,主黄hwy=2'b01,主红hwy=2'b10;outputreg[1:0]cntry;//支绿cntry=2'b00,支黄cntry=2'b01,支红cntry=2'b10;//reg[5:0]count;//计数器reg[1:0]state,nextstate;parameterhwy_green=2'b00,hwy_yellow=2'b01,cntry_green=2'b10,cntry_yellow=2'b11;always@(posedgeclockornegedgeclear)beginif(!clear)begin//count=0;state=hwy_green;endelsebegin//count=count+1;state=nextstate;endendalways@(xorstate)//nextstate=hwy_green;case(state)hwy_green:beginhwy=2'b00;cntry=2'b10;if(x)nextstate=hwy_yellow;elsenextstate=hwy_green;endhwy_yellow:beginhwy=2'b01;cntry=2'b10;if(x)nextstate=cntry_green;elsenextstate=hwy_green;endcntry_green:beginhwy=2'b10;cntry=2'b00;if(x)nextstate=cntry_green;elsenextstate=cntry_yellow;endcntry_yellow:beginhwy=2'b10;cntry=2'b01;if(x)nextstate=cntry_green;elsenextstate=hwy_green;endendcaseendmodule测试程序如下:moduletraffic_light_tb;regclock;regclear;regx;wire[1:0]hwy;wire[1:0]cntry;initialbeginclock=0;clear=0;x=0;#10clear=1;#1000$stop;endalways#10clock=~clock;always#50x=~x;//always@(posedgeclock)//x={$random}%2;/*initialbeginx=0;#20x=1;#20x=0;#20;end*/traffic_lightt_l(.clock(clock),.clear(clear),.x(x),.hwy(hwy),.cntry(cntry));endmodule波形图如下:图9交通灯控制器结果图从图中可以看出,50s-100s时x=1,此时支路有车,状态应从主路绿灯、支路红灯变为主路黄灯、支路红灯,然后再变为主路红灯、支路绿灯,100s-150s时x=0,之路无车通过,默认状态主路绿灯、支路红灯。