/* 实验名称:计数器验证 * 程序功能:每 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 |