本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com)
1. 实验简介
实验目的:
通过按键控制 8 个 LED 灯按顺序依次点亮和熄灭。
实验环境:
Window11
PDS2022.2-SP6.4
硬件环境:
MES2L676-100HP
2. 实验原理
通常的时,分,秒的计时进位大家应该不陌生;
、1 小时=60 分钟=3600 秒,当时针转动 1 小时,秒针跳动 3600 次;
在数字电路中的时钟信号也是有固定的节奏的,这种节奏的开始到结束的时间,我们通常称之为周期(T)。

在数字系统中通常关注到时钟的频率,那频率与周期的关系如下:
f = 1/T
在 100K 板卡上单端时钟有一个 27MHZ 的时钟。
所以其周期约为 37.037ns。而在我们 FPGA 的设计中,我们的 always 块通常都是在时钟的上升沿时对数据 进行赋值,因此我们可以定义一个变量,每到时钟的上升沿就让该变量+1,让其变成一个计数器,该变量每加 1 就表示经过了 37.037ns,那如果要定时 1s 的话,只需要让其计数到 26999999 即可,因为从 0 开始计数,所以计 数到 26999999 即可,此时就是一秒了。以此类推,13499999 就是 0.5s。

图为开发板上 8 个 LED 灯的原理图。
控制 0.5s 更换一次 LED 灯状态,使 LED 灯呈现流水灯现象,可以每 0.5s 依次点亮一个 LED 灯。(高电平用 1 表示,低电平用 0 表示)

故只需要定义一个变量,让其在时钟上升沿达到时就+1,计数到 13500000-1 即可,此时就是 0.5S。
3. 接口列表
| 端口 | I/O | 位宽 | 描述 |
| CNT_MAX | Parameter | 26 | 计数的最大值,修改定时的时间。 |
| clk | input | 1 | 系统时钟,27MHZ |
| key | input | 1 | 按键信号 |
| rst_n | input | 1 | 复位信号,低有效 |
| led[7:0] | output | 8 | led 灯控制信号 |
4. 工程说明
5. 代码模块说明
`timescale 1ns/1ns
`define UD #1
module key_led_test
#(
parameter CNT_MAX = 26'd13_500_000
)
(
input clk,
input rstn,
input key,
output [7:0] led
);
//==============================================================================
// reg and wire
reg [25:0] led_light_cnt = 26'd0;
reg [7:0] led_status = 8'b0000_0001;
// time counter
always @(posedge clk) begin
if (!rstn)
led_light_cnt <= `UD 26'd0;
else if (led_light_cnt == CNT_MAX-1)
led_light_cnt <= `UD 26'd0;
else
led_light_cnt <= `UD led_light_cnt + 26'd1;
end
// led status change
always @(posedge clk) begin
if (!rstn)
led_status <= `UD 8'b0000_0001;
else if (led_light_cnt == CNT_MAX-1 && key)
led_status <= `UD {led_status[6:0], led_status[7]};
else if (led_light_cnt ==

1384

被折叠的 条评论
为什么被折叠?



