目录
一、框架
- 时延定义:延时时间单位和物理时间相关联
- 定义模块
module project_name ……………… endmodule
- 定义端口:时钟输入clk、复位输出rst_n(_n表示低电平有效)、流水灯输出led
- 定义变量:32位寄存器用于计数,可以达到较长的时间周期
二、逻辑
计数器和复位部分
- 当复位信号 为低电平时,计数器 被清零。
- 否则,当计数器 达到100000000时,它会被重新设置为0。
- 在其他情况下,计数器 递增1。
控制流水灯部分:
- 当复位信号 为低电平时,流水灯 被全部熄灭。
rst_n
led
- 否则,根据计数器 的值,流水灯 的状态会发生变化
- 通过计数器控制时间,从而实现了流水灯效果。每个流水灯的亮灭时间和顺序由计数器控制,周期性地循环展示不同的流水灯效果
三、语法
always @(posedge clk or negedge rst_n)
表示在时钟上升沿或复位信号下降沿触发- 计数器timer是寄存器类型的(reg),led输出也是reg类型的
四、完整代码
`timescale 1ns / 1ps
module led_test (
clk, // inputs clock
rst_n,
led // output led
);
//=============================================================
// PORT declarations
//=============================================================
input clk;
input rst_n;
output [3:0] led;
reg [31:0] timer;
reg [3:0] led;
always @(posedge clk or negedge rst_n)
begin
if (~rst_n)
timer <= 0;
else if (timer == 100000000) //计数器
timer <= 0;
else
timer <= timer + 1;
end
always @(posedge clk or negedge rst_n)
begin
if (~rst_n)
led <= 4'b0000;
else if (timer == 25000000) //计数 25000000, led2 亮
led <= 4'b0010;
else if (timer == 50000000) //计数 50000000, led3 亮
led <= 4'b0100;
else if (timer == 75000000) //计数 75000000, led4 亮
led <= 4'b1000;
else if (timer == 100000000) //计数 100000000, led1 亮
led <= 4'b0001;
end
endmodule