FPGA学习(二)——实现LED流水灯

server/2025/3/18 1:46:02/

FPGA学习(二)——实现LED流水灯

目录

  • FPGA学习(二)——实现LED流水灯
  • 一、DE2-115时钟源
  • 二、控制6个LED灯实现流水灯
    • 1、核心逻辑
    • 2、代码实现
    • 3、引脚配置
    • 4、实现效果
  • 三、模块化代码
    • 1、分频模块
    • 2、复位暂停模块
    • 3、顶层模块
  • 四、总结

一、DE2-115时钟源

DE2-115板子包含一个50MHz的石英晶体振荡器,通过一个时钟缓冲器产生3路抖动低的50MHz时钟信号送到FPGA的时钟输入引脚,如下图所示:

image-20250316165546564

因此可以计算出,时钟信号的周期T=1/(50*10^6)=20ns1s=10^9ns,则1秒所需的时钟周期数为N=10^9/20=50000000

所以cnt计数器从0计数到50000000-1时,表示1秒。

二、控制6个LED灯实现流水灯

1、核心逻辑

  • 时钟和复位信号的处理

    • 代码通过always块监听时钟信号clk的上升沿、复位信号rst_n的下降沿以及停止信号stop_n的下降沿。
    • 当复位信号rst_n为低电平时,计数器cnt被重置为0,并且LED灯的状态被设置为6'b000001,即第一个LED亮起
  • 按键停止信号的处理

    • 当按键停止信号stop_n为低电平时,计数器cnt和LED灯的状态led保持不变,即停止计数和LED状态的变化。
  • 计数器的计数逻辑

    • 如果复位信号和停止信号都无效(即rst_nstop_n都为高电平),计数器cnt开始计数。
    • 当计数器cnt达到50_000_000 - 1时(即1秒的时钟周期,时钟频率为50MHz),计数器cnt被重置为0,并且LED灯的状态led进行循环右移一位,实现流水灯效果。

2、代码实现

module LedBlink(input wire clk,       // 50MHz时钟输入input wire rst_n,     // 复位信号,低电平有效input wire stop_n,      //停止信号output reg [5:0] led  // 6个LED灯输出
);reg [25:0] cnt;       // 26位计数器,用于计数1秒周期// 计数器模块always @(posedge clk or negedge rst_n or negedge stop_n) begin // posedge是指clk的上升沿 negedge是指rst_n的下降沿if (!rst_n) begincnt <= 26'd0; // 复位时,计数器从0开始计数led <= 6'b000001; // 复位时,第一个LED亮endelse if (!stop_n) begincnt <= cnt;led <= led;end else if (cnt == 50_000_000 - 1) begin // 计数到50,000,000 - 1cnt <= 26'd0; // 重置计数器led <= {led[4:0], led[5]}; // 循环右移一位,保持流水灯效果end else begincnt <= cnt + 1; // 增加计数器endend 
endmodule

3、引脚配置

image-20250316170739928

4、实现效果

FPGA流水灯

三、模块化代码

1、分频模块

module clock(input wire clk,       // 50MHz时钟输入input wire rst_n,     // 复位信号,低电平有效output reg clk_1Hz    // 1Hz分频时钟输出
);reg [25:0] cnt;       // 26位计数器,用于计数1秒周期always @(posedge clk or negedge rst_n) beginif (!rst_n) begincnt <= 26'd0;          // 复位时,计数器清零clk_1Hz <= 1'b0;        // 复位时,1Hz时钟信号置低endelse if (cnt == 50_000_000 - 1) begin // 计数到50,000,000 - 1cnt <= 26'd0;           // 重置计数器clk_1Hz <= ~clk_1Hz;    // 翻转1Hz时钟信号endelse begincnt <= cnt + 1;         // 计数器递增endend
endmodule

2、复位暂停模块

module control(input wire clk_1Hz,   // 1Hz时钟输入input wire rst_n,     // 复位信号,低电平有效input wire stop_n,    // 停止信号,低电平有效output reg [5:0] led  // 6个LED灯输出
);always @(posedge clk_1Hz or negedge rst_n or negedge stop_n) beginif (!rst_n) beginled <= 6'b000001; // 复位时,第一个LED亮endelse if (!stop_n) beginled <= led;        // 停止时,LED状态保持不变endelse beginled <= {led[4:0], led[5]}; // 循环右移一位,实现流水灯效果endend
endmodule

3、顶层模块

module led(input wire clk,       // 50MHz时钟输入input wire rst_n,     // 复位信号,低电平有效input wire stop_n,    // 停止信号,低电平有效output wire [5:0] led // 6个LED灯输出
);wire clk_1Hz; // 1Hz时钟信号// 实例化时钟模块clock  u_clock(.clk(clk),.rst_n(rst_n),.clk_1Hz(clk_1Hz));// 实例化控制模块control u_control(.clk_1Hz(clk_1Hz),.rst_n(rst_n),.stop_n(stop_n),.led(led));
endmodule

四、总结

本次实验的核心目的在于通过实践操作,熟悉FPGA的开发流程,并通过编写Verilog代码来实现FPGA的流水灯效果,以此来练习和巩固Verilog编程的相关知识。实验关键点在于时钟和复位信号的处理: 理解时钟信号在数字设计中的重要性,以及如何使用复位信号来初始化和同步系统状态。计数器的设计: 学习如何利用计数器产生定时信号,以实现LED灯的顺序点亮。
,并通过编写Verilog代码来实现FPGA的流水灯效果,以此来练习和巩固Verilog编程的相关知识。实验关键点在于时钟和复位信号的处理: 理解时钟信号在数字设计中的重要性,以及如何使用复位信号来初始化和同步系统状态。计数器的设计: 学习如何利用计数器产生定时信号,以实现LED灯的顺序点亮。


http://www.ppmy.cn/server/175826.html

相关文章

DataWhale 大语言模型 - GPT和DeepSeek模型介绍

本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的核心技术。并且&#xff0c;课程…

记第一次跟踪seatunnel的任务运行过程四——getJobConfigParser().parse()的动作

前绪 记第一次跟踪seatunnel的任务运行过程三——解析配置的具体方法getLogicalDag 正文 书接上文 ImmutablePair<List<Action>, Set<URL>> immutablePair getJobConfigParser().parse(null);在前一篇文章中说到getLogicDag()方法的第一行&#xff08;如…

删除二叉搜索树中的节点

本文参考代码随想录 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 删除节点需要考虑多种情况&#xff1a; 没…

鸿蒙 @ohos.arkui.node

鸿蒙 ohos.arkui.node 在鸿蒙开发中&#xff0c;ohos.arkui.node 模块提供了一系列用于构建和管理自定义节点的 API。这些 API 组织在一起&#xff0c;方便开发者进行导出和使用。本文将详细介绍 ohos.arkui.node 模块的功能和使用方法。 一、模块功能概述 ohos.arkui.node 模…

大语言模型微调和大语言模型应用的区别?

大语言模型微调和大语言模型应用的区别&#xff1f; 1. 定义与目标 微调&#xff08;Fine-tuning&#xff09; 目标&#xff1a;调整预训练模型&#xff08;如GPT、LLaMA、PaLM&#xff09;的参数&#xff0c;使其适应特定任务或领域。 核心&#xff1a;通过额外的训练&#x…

Linux的部分常用基础指令

目录 1. ls 指令 2. pwd命令 3. cd 指令 4. touch 指令 5. mkdir指令 6. rmdir指令&&rm指令 7. rm命令可以同时删除文件或目录 8. man指令 9. cp指令 10. mv指令 11. cat 指令 12. more指令 13. less 指令 14. head指令 15. tail 指令 16. find 指令 17. whi…

【Java--数据结构】优先级队列( PriorityQueue)

一. 优先级队列 1.1 优先级队列的概念 优先级队列是一种特殊的队列&#xff0c;它在入队时会根据元素的优先级进行排序&#xff0c;优先级最高的元素排在队列的前面&#xff0c;出队时会优先出队优先级最高的元素。 1.2 优先级队列的区别 &#xff08;1&#xff09;与普通…

Spring Retry

1. Spring Retry 的工作原理 内部机制 Spring Retry 主要通过 AOP&#xff08;面向切面编程&#xff09;实现重试逻辑。以下是 Spring Retry 的内部工作流程&#xff1a; AOP 拦截器&#xff1a;当一个方法被标记为需要重试&#xff0c;并且该方法抛出了指定类型的异常时&am…