LED闪烁


前言

本次实验用Artix-7开发板上的的 2 个 LED 灯实现两个 led 灯一起闪烁的实验现象


一、LED硬件介绍

在 A7开发板上有两个 LED 灯,可以通过输出到 LED 灯的电平控制LED 的亮和灭,编写相应的 Verilog 代码实现 LED 的闪烁。
在这里插入图片描述
由上图可知 LED 的阳极都接上了高电平,LED 灯的亮灭由 LED 阴极的电平决定,当驱动 LED 阴极的电平为 0 时 LED 亮,当驱动 LED 阴极的电平为 1 时LED灭。

二、Verilog 代码编写

1.代码如下

// 定义一个名为 flash_led 的模块,用于闪烁两个LED灯
module flash_led #
(
    // 设置一个参数 CNT_MAX,用于定义计数器的最大值
    parameter CNT_MAX=50_000_000
)
(
    input clk,          // 时钟信号输入
    input rst_n,         // 复位信号输入,低电平有效
    output reg[1:0] led  // 两个LED灯的输出
);

// 定义一个32位的计数器寄存器
reg[31:0]cnt;

// 当时钟信号上升沿到来或复位信号下降沿到来时触发
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        // 如果复位信号为低,则计数器清零
        cnt <= 'd0;
    end else if(cnt == CNT_MAX - 1'b1) begin
        // 如果计数器达到预定义的最大值减一,则计数器清零
        // 这里使用1'b1是为了确保减法操作的位数匹配
        cnt <= 'd0;
    end else begin
        // 否则,计数器递增
        cnt <= cnt + 1'b1;
    end
end

// 另一个 always 块,用于控制LED灯的闪烁
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        // 如果复位信号为低,则将LED灯置为初始状态,这里为全亮
        led <= 2'b11;
    end else if(cnt == CNT_MAX - 1'b1) begin
        // 如果计数器达到预定义的最大值减一,则切换LED灯的状态
        led <= ~led;
    end else begin
        // 否则,保持LED灯当前状态不变
        led <= led;
    end
end

endmodule

2.仿真代码如下

// 定义仿真时间单位和精度
`timescale 1ns / 1ps

// 定义测试模块 tb_flash_led
module tb_flash_led();
    // 定义测试模块中的信号
    reg clk;          // 定义时钟信号
    reg rst_n;        // 定义复位信号,低电平有效
    wire[1:0] led;    // 定义两个LED输出信号

    // 实例化待测试模块 flash_led,并传递参数 CNT_MAX
    flash_led #(
        .CNT_MAX(5000)  // 设置最大计数值
    )flash_led
    (
        .clk(clk),          // 连接时钟信号
        .rst_n(rst_n),      // 连接复位信号
        .led(led)           // 连接LED输出信号
    );

    // 第一个 initial 块,用于生成时钟信号
    initial begin
        clk = 1;  // 初始化时钟信号为高电平
        forever begin  // 创建一个永久循环,以产生连续的时钟信号
            #10 clk = ~clk;  // 每10纳秒翻转一次时钟信号
        end
    end
    
    // 第二个 initial 块,用于初始化复位信号并触发复位序列
    initial begin
        rst_n = 0;  // 初始化复位信号为低电平,启动复位
        repeat(20) @(posedge clk);  // 等待20个时钟周期
        rst_n = 1;  // 将复位信号置为高电平,结束复位
    end
    
endmodule

三、管脚分配

set_property PACKAGE_PIN N18 [get_ports {led[1]}]
set_property PACKAGE_PIN J19 [get_ports clk]
set_property PACKAGE_PIN M18 [get_ports {led[0]}]
set_property PACKAGE_PIN L18 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值