前言
本次实验用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]