任务
实现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
- 预置为1111
- 清零
- 开始计数(时钟脉冲一直产生,因此只要开启计数即可:CEP&CET=1)