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