异步计数器(也称为ripple-through counter)的特点是每一位触发器的输出作为下一位触发器的时钟输入,因此计数速度会因为级联触发器的传播延迟而受到限制。这种计数器的最大工作频率通常低于同步计数器。
一、电路符号
输入信号:时钟信号clk,复位端rst。输出信号:计数输出端q[3..0]
二、设计代码
module yibu_cnt(q,clk,rst);
output [3:0] q;
input rst,clk;
reg[3:0]q;
reg[3:0]qn;
always @(posedge clk)
begin
if(!rst)
begin q[0]=0; qn[0]=1;end
else
begin q[0]=~q[0];qn[0]=~q[0];end
end
always@(posedge qn[0])
begin
if(!rst)
begin q[1]=0;qn[1]=1;end
else
begin q[1]=~q[1];qn[1]=~q[1];end
end
always@(posedge qn[1])
begin
if(!rst)
begin q[2]=0;qn[2]=1;end
else
begin q[2]=~q[2];qn[2]=~q[2];end
end
always@(posedge qn[2])
begin
if(!rst)
begin q[3]=0;qn[3]=1;end
else
begin q[3]=~q[3];qn[3]=~q[3];end
end
endmodule
三、仿真代码
module yibu_cnt_tb;
reg rst;
reg clk;
wire [3:0] q;
// 实例化被测试模块
yibu_cnt uut (
.q(q),
.clk(clk),
.rst(rst)
);
// 时钟信号生成
initial begin
clk = 0;
forever #10 clk = ~clk; // 产生一个周期为10ns的时钟信号
end
// 测试序列
initial begin
rst =1;
#10;
rst =0;
#10;
rst =1;
#300;
$finish;
end
initial begin
$monitor("Time = %t, rst = %b, clk = %b, q = %b", $time, rst, clk, q);
end
endmodule