计数器例子

---恢复内容开始---

LED,每500ms,状态闪烁依次,及每隔500MS,灯亮或灭一次;

系统时钟为50MHZ,其对应周期为20ns。(T=1/F=1/(50_000_000=2×10^(-8)s)

500ms=500_000_000ns/20ns=25_000_000;

创建工程counter

程序如下:

module counter(clk50m,rst_n,led);

input clk50m,rst_n;//系统时钟与全局复位,低电平复位

output reg led;

reg[24:0]cnt;//定义计数寄存器,25_000_000转换为16进制需要25位

always@(posedge clk50m or negedge rst_n)//3-8译码器是组合逻辑,计数器是时序逻辑。

//计数器计数进程

if(rst_n==1'b0)

cnt<=25'd0;

else if (cnt==25'd24_999_999)//25_000_000-1的结果。

cnt<=25'd0;

else

cnt<=cnt+1'b1;

//led显示状态

always@(posedge clk50m or negedge rst_n)

if (rst_n==1'b0)

led <=1'b1; //复位键按下去的时候灯保持常亮

else if (cnt==25'd24_999_999)

led <=~led;

else

led<=led; 

endmodule

编写testbench

`timescale 1ns/1ns

`define clock_period 20  //定义时钟周期

module counter_tb;

reg clk;

reg rst_n;

wire led;

counter counter0(

.clk50m(clk),

.rst_n(rst_n),

.led(led)

);

initial clk = 1;

always #(`clock_period/2) clk = ~clk;      //

initial begin

rst_n = 1'b0;

#(`clock_period *200);

rst_n = 1'b1;

#2000000000;//led是一秒的周期亮灭,因此仿真时间要大于1s,所以定义为2s

$stop;

end

endmodule

前仿结果:可以看出每隔500ms,LED又一次跳变。

设置引脚:

全运行烧写程序,

实验现象:开发板LED灯以1s为周期闪烁,按下按键(rst_n=0),LED灯常亮。

原文地址:https://www.cnblogs.com/fcfc940503/p/10412354.html