/* 實驗名稱:計數(shù)器驗證 * 程序功能:每 500ms ,LED 狀態(tài)亮或滅一次 * 時鐘計算: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; // 系統(tǒng)時鐘 50MHz input rst_n; // 全局復(fù)位,低電平復(fù)位 output reg led; // led 指示燈輸出 // 25000_000 => 0x17D7840 => 4*6+1 = 25位 reg[24:0] cnt; // 定義計數(shù)器寄存器 // 計數(shù)器程序塊 // always :對某些信號變化感興趣 // posedge: 表示 clk_50m 上升沿時會進入該程序塊 // negedge: 表示 rst_n 下降沿時會進入該程序塊 always@(posedge clk_50M or negedge rst_n) if(1'b0 == rst_n) // 當(dāng) rst_n 引腳為低電平時表示復(fù)位 cnt <= 25'd0; // 復(fù)位計數(shù)器的值 else if(25'd24_999_999 == cnt) // 由于 cnt 是從 0 開始計數(shù),所以需要-1 cnt <= 25'd0; // 避免溢出 else cnt <= cnt + 1'b1; // 計數(shù)器計數(shù)(累加) // led 輸出程序塊 always@(posedge clk_50M or negedge rst_n) if(1'b0 == rst_n) // rst_n 復(fù)位時,點亮 led 不做其他事情 led <= 1'b1; else if(25'd24_999_999 == cnt) // 當(dāng)計數(shù)器達到 500ms 時則翻轉(zhuǎn)一次 led 狀態(tài) led <= ~led; else ; // rst_n 不是復(fù)位,同時計數(shù)器未滿,空語句,不做其他事情 endmodule |