【盘古100Pro+开发板实验例程】FPGA学习 | 基于紫光 FPGA 的键控 LED 流水灯

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(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 == 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值