当前位置: 首页 > article >正文

FPGA——实现LED流水灯

文章目录

  • 一、Quartusll_18.1和VS Code软件的关联
  • 二、DE2-115的时钟电路
  • 三、流水灯的分层次设计
  • 四、总结

一、Quartusll_18.1和VS Code软件的关联

1.先打开Quartus II 软件,然后选择菜单栏“Tools”下的“Options…”。

在这里插入图片描述

2.点击“Options…”,在弹出的对话框中,选择“General”选项卡下的“Preferred Text Editor”,默认使用的编 辑器是“QuartusII Test Editor”。

在“Text editor:”栏选择“Custom”选项并在“Command-line”栏通过路径浏览按钮选择 VS Code的路径。路径定位到“Code. exe”启动文件,再在后缀上加入-g %f:%l,路径根据自己的VS Code路径修改(就是-g前面冒号中的路径)。然后再点击“OK”完成 Quartus II 18.1 与VS Code的关联。

在这里插入图片描述

二、DE2-115的时钟电路

DE2-115 包含一个生成 50MHz 频率时钟信号的有源晶体振荡器,另有一个时钟缓冲器用来将缓冲后的低抖动 50MHz 时钟信号分配给 FPGA。这些时钟信号用来驱动 FPGA 内的用户逻辑电路。开发板还包含两个 SMA 连接头,用来接收外部时钟输入信号到 FPGA 或者将 FPGA的时钟信号输出到外部。另外,所有这些时钟输入都连接到 FPGA 内部的 PLL 模块上,用户可以将这些时钟信号作为 PLL 电路的时钟输入。

DE2-115 板子上的时钟分配信息和 FPGA 芯片相关的引脚配置信息如下图所示。

在这里插入图片描述

所以1秒所需的时钟周期数为50000000次。

三、流水灯的分层次设计

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

top顶层模块

module led_top(
    input clk,
    input reset_n,
    input pause,
    output [5:0] led
);
// 顶层模块:实例化各子模块
wire clk_1hz;  // 分频时钟信号

clock_divider divider_inst(
    .clk(clk),
    .reset_n(reset_n),
    .clk_1hz(clk_1hz)
);

led_display display_inst(
    .clk(clk),
    .reset_n(reset_n),
    .pause(pause),
    .clk_1hz_en(clk_1hz),
    .led(led)
);
endmodule

分频模块

module clock_divider(
    input clk,
    input reset_n,
    output reg clk_1hz
);
// 分频模块:50MHz -> 1Hz
parameter MAX_COUNT = 26'd49_999_999; // 50MHz时钟分频

always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        clk_1hz <= 1'b0;
    end else begin
        if (counter >= MAX_COUNT) begin
            counter <= 26'd0;
            clk_1hz <= ~clk_1hz;
        end else begin
            counter <= counter + 1;
        end
    end
end

reg [25:0] counter;
endmodule

显示模块

module led_display(
    input clk,
    input reset_n,
    input pause,
    input clk_1hz_en,    // 来自分频模块的使能信号
    output reg [5:0] led
);
// 显示模块:包含状态机和输出控制
reg [2:0] state;
reg running;

// 状态机控制
always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        state <= 3'd0;
        running <= 1'b1;
    end else begin
        // 处理暂停按键
        if (pause) running <= ~running;
        
        // 状态转移(使用分频后的时钟使能)
        if (running && clk_1hz_en) begin
            state <= (state == 3'd5) ? 3'd0 : state + 1;
        end
    end
end

// LED输出控制(保持不变)
always @(*) 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;
        3'd5: led = 6'b100000;
        default: led = 6'b000000;
    endcase
end
endmodule

引脚连接配置图

在这里插入图片描述

烧录结果

FPGA——流水灯

四、总结

通过本次实验,初步了解到了计数器的思想,而且通过分层次化设计使实验更具有可视性。但是在本次实验中也存在不足,需要一直按着暂停键才能达到暂停的效果。所以,接下来我需要取研究如何实现按下一次实现暂停,再次按下又恢复流水灯效果。

参考资料

https://blog.csdn.net/Lee_tr/article/details/122487570

https://blog.csdn.net/crrrd/article/details/136227780

https://blog.csdn.net/LX567567/article/details/138727302


http://www.kler.cn/a/592514.html

相关文章:

  • iQOO手机投屏到Windows有两种方法,其中一种可远程控制
  • Claude是什么?适合哪些场景?
  • WindowsAD域服务权限提升漏洞
  • 【cf】交换
  • Redis高级结构-布隆过滤器
  • WEB攻防-PHP反序列化-字符串逃逸
  • 《量子门与AI神经元:计算世界的奇妙碰撞》
  • OpenAI Agents SDK 使用自定义的 OpenAI-Compatible API
  • MySQL性能优化,sql优化有哪些,数据库如何优化设计(二)
  • SVN简明教程——下载安装使用
  • C++优先级队列priority_queue、仿函数
  • LeetCode 解题思路 21(Hot 100)
  • JavaScript 金额运算精度丢失问题及解决方案
  • DAPO:一个开源的大规模大型语言模型LLM强化学习系统
  • 【初学者】请介绍一下线性与非线性的区别?
  • Android Compose 框架文本选择与编辑模块源码深度剖析(三)
  • 认知篇#4:YOLO评价指标及其数学原理的学习
  • Jetson Nano 三个版本(B01 4GB、Orin 4GB、Orin 8GB)本地部署Deepseek等大模型的测评
  • 零知识证明:区块链隐私保护的变革力量
  • 从关键词到权重:TF-IDF算法解析