1、通用二进制计数器设计一个二进制计数器(默认为 8 位计数器) ,具有加/减计数功能、异步复位、预制数功能代码如下:`define WIDTH 8module BinaryCounter(counter,clk,up_down,load,reset,din);output reg [`WIDTH-1:0] counter;input clk;input up_down; //1 为加计数,0 为减计数input reset;input load; //预置数,1 有效,din 输出到 counterinput [`WIDTH-1:0] din;always@(posedge clk or posedge reset)beginif(reset)counter<=0;else if(load)counter<=din;else if(up_down==1)counter<=counter+1;else if(up_down==0)begincounter<=counter-1;if(counter<1) counter<=0;endendendmodule测试程序如下: `define WIDTH 8module BinaryCounter_tb;reg clk,up_down,reset,load;reg [`WIDTH-1:0] din;wire [`WIDTH-1:0] counter;integer i;initialbeginclk=0;reset=1;#5 reset=0;#3000 $stop;end always #5 clk=~clk;/*always@(posedge clk)beginup_down={$random}%2;load={$random}%2;din={$random}%256;end*/initialbegin#5;for(i=0;i<256;i=i+3)begindin=i;#10;endendinitialbeginup_down=1;load=1;#20 load=0;#30 load=1;#30 load=0;end always #200 up_down=~up_down; BinaryCounter bcounter(.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、格雷码计数器代码如下:`define WIDTH 4module GrayCounter(gray,clk,rst_n);output [`WIDTH-1:0] gray;input clk;input rst_n;reg [`WIDTH-1:0] binary;always@(posedge clk or negedge rst_n)beginif(!rst_n)binary<=0;else if(binary<16)beginbinary<=binary+1;// binary<=(binary<16)?binary:0;endelsebinary<=0;endassign gray[0]=binary[0]^binary[1];assign gray[1]=binary[1]^binary[2];assign gray[2]=binary[2]^binary[3];assign gray[3]=binary[3];endmodule 测试程序如下:`define WIDTH 4module GrayCounter_tb;wire [`WIDTH-1:0] gray;reg clk;reg rst_n;initialbeginclk=0;rst_n=0;#10 rst_n=1;#1000 $stop;endalways #5 clk=~clk;/*always@(posedge clk)beginend*/GrayCounter gc(.gray(gray),.clk(clk),.rst_n(rst_n));endmodule波形图如下:图 3 格雷码计数器波形图(二进制数值) 图 3 格雷码计数器波形图(十进制数值)3、完成一个串并转换电路(8 位)的 Verilog 代码设计。
代码如下:module transform_cb(sclk,pclk,rst,ser_din,enable,p_dout);input sclk;input pclk;input rst;input enable;input ser_din;output [7:0] p_dout;reg [7:0] temp,pout_buf;reg [2:0] count;//integer i;always@(posedge sclk or negedge rst)beginif(!rst)begincount<=0;temp<=0;endelse if(count<=3'b111)begincount<=count+1;temp[0]<=ser_din;temp<=temp<<1;temp[7:0]<={temp[6:0],ser_din};endend always@(posedge pclk or negedge rst)beginif(!rst)pout_buf<=0;elsepout_buf<=temp;endassign p_dout=(enable)?pout_buf:8'bz;endmodule测试程序如下:module transform_cb_tb;reg sclk;reg pclk;reg rst;reg enable;reg ser_din;wire [7:0] p_dout;initialbeginsclk=0;pclk=0;rst=0;enable=0;#15 rst=1;enable=1;#15 enable=0;#20 enable=1;#50 enable=0;#50 enable=1;#1000 $stop;endalways #5 sclk=~sclk;always #40 pclk=~pclk;always@(posedge sclk)ser_din={$random}%2;transform_cb ps(.sclk(sclk),.pclk(pclk),.rst(rst),.ser_din(ser_din),.enable(enable),.p_dout(p_dout));endmodule 波形图如下:图 5 8 位串并转换电路波形图图 6 8 位串并转换电路波形图图 7 8 位串并转换电路波形图 图 8 8 位串并转换电路波形图从图中可以看出,0-15s、30s-50s 时 enable 无效,输出为三态;15s-30s、50s-100s 时 enable 有效,输出 8 位并行数据;在 200s、280s 、360s 可以看出,每到pclk 上升沿,同步输出一个并行 8 位数据。
4、设计交通灯控制器(有限状态机问题) 主干道上车很多,有最高优先级,默认主干道是绿灯亮;支路偶尔有车,有车时必须变绿灯,只要维持足够的时间,能让车通过即可;支路上只要不再有车,则支路绿灯变黄灯,然后变红灯;同时主干道亮绿灯;有一个传感器监视支路上是否有车,向控制器输入信号 X;X=1 表示有车,否则 X=0;代码如下:module traffic_light(clock,clear,x,hwy,cntry);input clock;input clear;input x;output reg[1:0] hwy; //主绿 hwy=2'b00,主黄 hwy=2'b01,主红hwy=2'b10;output reg[1:0] cntry; //支绿 cntry=2'b00,支黄 cntry=2'b01,支红cntry=2'b10;// reg [5:0] count; //计数器reg [1:0] state,nextstate;parameter hwy_green=2'b00,hwy_yellow=2'b01,cntry_green=2'b10,cntry_yellow=2'b11;always@(posedge clock or negedge clear)beginif(!clear)begin// count<=0;state<=hwy_green;end else begin// count<=count+1;state<=nextstate;endendalways@(x or state)//nextstate<=hwy_green;case(state)hwy_green:beginhwy<=2'b00;cntry<=2'b10;if(x)nextstate<=hwy_yellow;else nextstate<=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;else nextstate<=hwy_green;end endcase endmodule 测试程序如下:module traffic_light_tb;reg clock;reg clear;reg x;wire [1:0] hwy; wire [1:0] cntry; initialbeginclock=0;clear=0;x=0;#10 clear=1;#1000 $stop;end always #10 clock=~clock;always #50 x=~x;// always@(posedge clock)// x={$random}%2;/*initialbeginx=0;#20 x=1;#20 x=0;#20;end */traffic_light t_l(.clock(clock),.clear(clear),.x(x),.hwy(hwy),.cntry(cntry)); endmodule 波形图如下: 图 9 交通灯控制器结果图从图中可以看出,50s-100s 时 x=1,此时支路有车,状态应从主路绿灯、支路红灯变为主路黄灯、支路红灯,然。