Verilog——任意模数计数器

任务

为实现篮球24s计时显示器,底层设计模块需要不同进制的计数器。调用之前设计的74LVC161,分别用反馈清零法与反馈置数法实现任意进制的计数器。

反馈清零法

程序设计

//filename:counterX.v
module counterX(
	input CR_n,PE_n,EN,CP,
	input [3:0] X,D,
	output [3:0] Q,
	output TC
);
/*功能描述
反馈清零法调用计数器74LVC161实现任意进制X的计数
*/
/*端口描述
CR_n:清零信号,低电平有效,异步直接清零
PE_n:预置信号,低电平有效,当清零信号无效时,在时钟上升沿上升时,输出与预置输入数据相同
EN:使能端,当清零信号与预置信号无效时,电路处于计数状态
CP:时钟信号
X:进制
D:输入信号
Q:输出信号
TC:进位信号,只有输出信号与CET全为1时,输出为1
*/
wire CR_n_161;
supply1 VCC;
supply0 GND;
//调用计数器74LVC161
counter_161 counter_161_inst(
.CR_n(CR_n_161),
.PE_n(PE_n),
.CEP(EN),
.CET(EN),
.CP(CP),
.D(D),
.Q(Q),
.TC(TC)
);
assign CR_n_161=(CR_n&&!(Q==X+1));
endmodule

仿真

//filename:tb_counterX.v
`timescale 1ns/1ns
module tb_counterX;
reg CR_n,PE_n,EN,CP;
reg [3:0] X,D;
wire [3:0] Q;
wire TC;
//实例化计数器counterX
counterX counterX_inst(
.CR_n(CR_n),
.PE_n(PE_n),
.EN(EN),
.CP(CP),
.X(X),
.D(D),
.Q(Q),
.TC(TC)
);
//产生时钟信号
initial
	CP=0;
always
	#1 CP=~CP;
initial begin
	#1
	//预置为1111
	CR_n=1;PE_n=0;EN=1;D=4'b1111;
	#1
	//清零
	CR_n=0;PE_n=0;EN=1;D=4'b1111;
	#1
	//计数
	CR_n=1;PE_n=1;EN=1;D=4'b1111;X=4'b0100;
	#32
	//清零
	CR_n=0;PE_n=0;EN=1;D=4'b1111;
	#1
	//计数
	CR_n=1;PE_n=1;EN=1;D=4'b1111;X=4'b1101;
	#32
	$stop;
end
endmodule

反馈置数法

程序设计

//filename:counterX2.v
module counterX2(
	input CR_n,EN,CP,
	input [3:0] X,
	output [3:0] Q,
	output TC
);
/*功能描述
反馈置数法调用计数器74LVC161实现任意进制X的计数
*/
/*端口描述
CR_n:清零信号,低电平有效,异步直接清零
PE_n:预置信号,低电平有效,当清零信号无效时,在时钟上升沿上升时,输出与预置输入数据相同
EN:使能端,当清零信号与预置信号无效时,电路处于计数状态
CP:时钟信号
X:进制
Q:输出信号
TC:进位信号,只有输出信号与CET全为1时,输出为1
*/
wire PE_n_161,TC_161;
wire [3:0]Q_161;
reg [3:0]D_161;
supply1 VCC;
supply0 GND;
//调用计数器74LVC161
counter_161 counter_161_inst(
.CR_n(CR_n),
.PE_n(PE_n_161),
.CEP(EN),
.CET(EN),
.CP(CP),
.D(D_161),
.Q(Q),
.TC(TC)
);
initial
	D_161=4'h0;
assign PE_n_161=~(Q==X);
endmodule	

仿真

//filename:tb_counterX2.v
`timescale 1ns/1ns
module tb_counterX2;
reg CR_n,EN,CP;
reg [3:0] X;
wire [3:0] Q;
wire TC;
//实例化计数器counterX
counterX2 counterX2_inst(
.CR_n(CR_n),
.EN(EN),
.CP(CP),
.X(X),
.Q(Q),
.TC(TC)
);
//产生时钟信号
initial
	CP=0;
always
	#1 CP=~CP;
initial begin
	//清零
	CR_n=0;EN=1;X=4'b1100;
	#1
	//计数
	CR_n=1;EN=1;X=4'b0011;
	#32
	$stop;
end
endmodule

Leave a comment

Your email address will not be published. Required fields are marked *