Verilog仿真——计数器74LVC161

任务

实现4位计数器74LVC161的程序设计与仿真

程序设计

Register is illegal in left-hand side of continuous assignment

assign语句不可对寄存器类型变量赋值

因此将进位信号TC去掉reg类型标识符

//filename:74LVC161.v
module counter_161(
	input CR_n,PE_n,CEP,CET,CP,
	input [3:0] D,
	output reg [3:0] Q,
	output TC
);
/*功能描述
计数器74LVC161
*/
/*端口描述
CR_n:清零信号,低电平有效,异步直接清零
PE_n:预置信号,低电平有效,当清零信号无效时,在时钟上升沿上升时,输出与预置输入数据相同
CEP,CET:使能端,当清零信号与预置信号无效时,电路处于计数状态
CP:时钟信号
D:输入信号
Q:输出信号
TC:进位信号,只有输出信号与CET全为1时,输出为1
*/
//进位信号
assign TC=CET&PE_n&(Q==4'b1111);
always@(negedge CR_n,posedge CP)begin
	if(~CR_n)
	//清零信号
		Q<=4'b0000;
	//不加else会如何?
	else if(CR_n&&CP)begin
	//时钟上升沿
		if(~PE_n)begin
		//预置信号
			Q<=D;
		end
		else if(CEP&&CET)begin
		//计数+1
			Q<=Q+4'b0001;
		end
	end
end
endmodule

仿真

//filename:tb_74LVC161.v
`timescale 1ns/1ns
module tb_74LVC161;
reg CR_n,PE_n,CEP,CET,CP;
reg [3:0] D;
wire [3:0] Q;
wire TC;
//实例化计数器74LVC161
counter_161 counter_161_inst(
.CR_n(CR_n),
.PE_n(PE_n),
.CEP(CEP),
.CET(CET),
.CP(CP),
.D(D),
.Q(Q),
.TC(TC)
);
//产生时钟信号
initial
	CP=1'b0;
always
	#1 CP=~CP;
initial
	$monitor($time,"\tD=%d,Q=%d",D,Q);
//测试
initial begin
	#1
	//预置为1111
	CR_n=1;PE_n=0;CEP=1;CET=1;D=4'b1111;
	#1
	//清零
	CR_n=0;PE_n=0;CEP=1;CET=1;D=4'b1111;
	#1
	//计数
	CR_n=1;PE_n=1;CEP=1;CET=1;D=4'b1111;
	#32
	$stop;
end
endmodule
  1. 预置为1111
  2. 清零
  3. 开始计数(时钟脉冲一直产生,因此只要开启计数即可:CEP&CET=1)

Leave a comment

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