計數器不僅能用於對時鐘脈衝計數,還可以用於分頻,定時,產生節拍脈衝序列以及進行數字運算等,分爲同步計數器和異步計數器,在同步計數器中,當時鍾脈衝的輸入時,觸發器的翻轉是同時發生的。而在異步計數中,觸發器的翻轉有先有後,不是同時發生的。
1.同步四位二進制加法計數器:
各觸發器的驅動方程:
T0 = 1;
T1 = Q0
T2 = Q0Q1
T3 = Q0Q1Q2
2.四位10進制的計數器
在四位二進制計數器的基礎上修改,當計算到1001時,則下一個clk狀態回到0000
驅動方程:
T0 = 1;
T1 = Q0Q3`
T2 = Q0Q1
T3 = Q0Q1Q2 + Q0Q3`
其verilog編程比較簡單:用一個always塊即可實現:
`timescale 1ns/10ps
module counter10(clk,rst,count);
input clk,rst;
output [3:0] count;
reg [3:0] q;
assign count = q;
always@(posedge clk)
begin
if(!rst)
q <= 0;
else if(q >= 4'd9)
q <= 0;
else
q <= q + 1;
end
endmodule
編寫一個testbench
module counter10_tb();
reg rst;
reg clk;
wire [3:0] count;
counter10 wt(.clk(clk),.rst(rst), .count(count));
initial
begin
rst <= 1;
clk <= 0;
#50 rst <= 0;
#1000 rst <= 1;
#2000 rst <= 0;
end
always
#10 clk = ~clk;
endmodule
通過vcs仿真:vcs add10 -R -gui +v2k
得到的波形: