FPGA实现LED流水灯(外加按键控制)

FPGA实现LED流水灯

一、实验要求

在DE2-115开发板上,用Verilog设计一个LED流水灯实验:用6个LED完成周期为1秒的跑马灯效果。

规范化要求:

1)安装VScode,在其中下载安装Verilog-HDL/SystemVerilog插件(实现Verilog代码的语法高亮/自动补全);

2)采用层次化设计,分别在VScdoe编程各代码文件,如top顶层模块(比如LedBlink.v)、分频模块(fenpin.v)、显示模块(display.v);

3)尽量采用计数器、状态机思想;

4)增加流水灯的按键暂停、按键恢复功能。

二、实验内容

1.下载VScode和配置verilog编程

VScode下载就从官网上下载就行,让后在扩展里搜索verilog
在这里插入图片描述
下载完后可以再下载个ctags并配置,参考VSCode中Ctags配置及下载链接。配置完后就可以写程序了。
在这里插入图片描述

2.实现跑马灯功能,并可以通过按键中断

fenpin.v代码

module fenpin (
    input       clk,
    input       rst_n,
    output reg  en
);
    parameter CLK_FREQ = 50_000_000; // 50MHz时钟
    parameter DIV_CNT  = CLK_FREQ - 1;
    
    reg [25:0] cnt;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 0;
            en  <= 0;
        end
        else begin
            en <= 0;
            if (cnt == DIV_CNT) begin
                cnt <= 0;
                en  <= 1;
            end
            else begin
                cnt <= cnt + 1;
            end
        end
    end
endmodule

display.v代码

module display (
    input        clk,
    input        rst_n,
    input        en,
    output reg [5:0] led
);
    reg [2:0] state;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            state <= 0;
            led   <= 6'b000001;
        end
        else if (en) begin
            case(state)
                3'd0: led <= 6'b000001;
                3'd1: led <= 6'b000010;
                3'd2: led <= 6'b000100;
                3'd3: led <= 6'b001000;
                3'd4: led <= 6'b010000;
                3'd5: led <= 6'b100000;
                default: led <= 6'b000001;
            endcase
            state <= (state == 3'd5) ? 3'd0 : state + 1;
        end
    end
endmodule

LedBlink_with_pause.v

module LedBlink_with_pause (
    input        clk,
    input        rst_n,
    input        pause_key,
    output [5:0] led
);
    wire en;
    wire pause;
    
    fenpin u_fenpin (
        .clk    (clk),
        .rst_n  (rst_n),
        .en     (en)
    );

    pause_ctrl u_pause (
        .clk    (clk),
        .rst_n  (rst_n),
        .key    (pause_key),
        .pause  (pause)
    );

    display u_display (
        .clk    (clk),
        .rst_n  (rst_n),
        .en     (en & ~pause),
        .led    (led)
    );
endmodule

module pause_ctrl (
    input        clk,
    input        rst_n,
    input        key,
    output reg   pause
);
    reg [19:0] cnt;
    reg [1:0]  key_sync;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            key_sync <= 2'b11;
            cnt      <= 0;
            pause    <= 0;
        end
        else begin
            key_sync <= {key_sync[0], key};
            
            if (key_sync[1]) begin // 按键未按下
                cnt <= 0;
            end
            else if (cnt < 20'hFFFFF) begin // 20ms消抖
                cnt <= cnt + 1;
            end
            else begin
                pause <= ~pause;
                cnt <= 0;
            end
        end
    end
endmodule

在VSCode中打开终端,在源文件目录下输入vlog *.v 编译该工作目录下的全部.v文件.(也可以输入vlog xxx.v文件单独编译对应的.v文件).
在这里插入图片描述
编译成功。

三、上板烧录(DE2-115)

打开quartus prime 并建立项目,选择EP4CE115F29C7,将刚才的三个.v文件复制到当前目录下,添加到工程中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
引脚配置
在这里插入图片描述
上板结果

流水灯+按键中断

三、总结

本次实验使用了VScode在进行verilog编程,能够更加清楚明白的显示出代码错误,好修改。也进行了流水灯的仿真,学习并使用了状态机和寄存器,也更加熟悉了FPGA开发流程,算是入门了。

参考链接:
1.如何在VSCode中优雅地书写Verilog
2.VSCode中Ctags配置及下载链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值