十進制計數器:
設計要求:
1、每當計數器值為4’b001時,自動回到4’b0000
2、每個時鍾沿計數器值加1
3、進位輸出carry應該與4'b1001同周期輸出
4、異步復位

module cnt10 ( clk, rst_n, carry, cnt ); input clk, rst_n; output carry; output [3:0] cnt; reg carry; reg [3:0] cnt; always @( posedge clk or negedge rst_n ) begin if ( ~rst_n ) begin cnt <= 4'b0000; end else if ( cnt == 4'b1001 ) begin cnt <= 4'b0000; end else begin cnt <= cnt + 4'b0001; end end always @(posedge clk or negedge rst_n) begin if(!rst_n) begin carry <= 1'b0; end else if(cnt == 4'b1000) begin carry <= 1'b1; end else carry<= 1'b0; end endmodule
測試程序:
`timescale 1ns/1ps module cnt10_tb(); reg clk, rst_n; wire carry; wire [3:0] cnt; always #10 clk = ~clk; cnt10 cnt10_tb( .clk(clk), .rst_n(rst_n), .carry(carry), .cnt(cnt) ); initial begin clk = 1'b0; rst_n = 1'b1; #10 rst_n = 1'b0; #10 rst_n = 1'b1; end endmodule
波形圖:
在這個十進制計數器中,唯一要注意的一點就是進位位carry變化的時刻,如果是為了使下一級能正確接收到前一級的進位位標識,要在計數到九時使進位位有效;如上圖波形所示。