計數器的Verilog實現(時序邏輯)


//計數器
//led每500ms狀態翻轉一次
//系統時鍾為50m,對應周期為20ns,
//500ms=500_000_000ns(ms μs ns) /20  =  25_000_000次 
module counter(clk50m, rst_n, led_out);    

    input clk50m;    //系統時鍾 50M
    input rst_n;    //全局復位,n表示低電平復位
    
    output reg led_out;    //led輸出
    
    reg [24:0]cnt;        //定義計數器寄存器
    
    //時序邏輯常用寫法,以時鍾上升沿和復位下降沿為敏感信號
    //計數進程
    always@(posedge clk50m or negedge rst_n) 
    if(rst_n == 1'b0)
        cnt <= 25'd0;
    else if (cnt == 25'd24_999_999)
        cnt <= 25'd0;
    else 
        cnt <= cnt + 1'b1;
        
    //led輸出進程控制
    always@(posedge clk50m or negedge rst_n)
    if(rst_n == 1'b0)
        led_out <=1'b1;
    else if (cnt == 25'd24_999_999)
        led_out <= ~led_out;        //按位取反0-1  1-0
    
endmodule

 

`timescale 1ns/1ns
`define clock_period 20        //宏定義一個時鍾參數20ns,方便更改代碼時鍾參數
module counter_tb;
    
    //兩個激勵信號源
    reg clk1;
    reg rst_n1;
    
    wire led_out1;

    counter u1(
    .clk50m(clk1), 
    .rst_n(rst_n1), 
    .led_out(led_out1)
    );
    
    initial clk1 = 1;
    
    //代碼中時鍾為20ns,這里延時半個周期是為了湊整個周期的信號變化
    always #(`clock_period/2) clk1 = ~clk1;    //調用宏定義的參數
    
    initial begin
        rst_n1 = 1'b0;
        #(`clock_period * 200);
        rst_n1 = 1'b1;
        #2000_000_000    //延時2s
        $stop;
    end
    
endmodule

電路視圖:

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM