---恢复内容开始---
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灯常亮。