/* 實驗名稱:計數器驗證 * 程序功能:每 500ms ,LED 狀態亮或滅一次 * 時鐘計算:50MHz 的時鐘頻率,那么時鐘周期就是 1/50Mhz = 0.02us == 20ns * 500ms = 500_000_000ns = 500_000_000ns/20ns = 25_000_000次 * 也就是說在 50MHz 的時鐘頻率下,累加 25000000 次就等于 500ms 的時間 */ module mytest(clk_50M, rst_n, led); input clk_50M; // 系統時鐘 50MHz input rst_n; // 全局復位,低電平復位 output reg led; // led 指示燈輸出 // 25000_000 => 0x17D7840 => 4*6+1 = 25位 reg[24:0] cnt; // 定義計數器寄存器 // 計數器程序塊 // always :對某些信號變化感興趣 // posedge: 表示 clk_50m 上升沿時會進入該程序塊 // negedge: 表示 rst_n 下降沿時會進入該程序塊 always@(posedge clk_50M or negedge rst_n) if(1'b0 == rst_n) // 當 rst_n 引腳為低電平時表示復位 cnt <= 25'd0; // 復位計數器的值 else if(25'd24_999_999 == cnt) // 由于 cnt 是從 0 開始計數,所以需要-1 cnt <= 25'd0; // 避免溢出 else cnt <= cnt + 1'b1; // 計數器計數(累加) // led 輸出程序塊 always@(posedge clk_50M or negedge rst_n) if(1'b0 == rst_n) // rst_n 復位時,點亮 led 不做其他事情 led <= 1'b1; else if(25'd24_999_999 == cnt) // 當計數器達到 500ms 時則翻轉一次 led 狀態 led <= ~led; else ; // rst_n 不是復位,同時計數器未滿,空語句,不做其他事情 endmodule |