[FPGA基础学习]实现流水灯与按键暂停

FPGA实现LED流水灯

1.vscode的安装和使用

vscode下载

Visual Studio Code - Code Editing. Redefined

vscode插件(Verilog-HDL/SystemVerilog)下载

image-20250315124141272

quartus绑定vscode

image-20250315122510088

image-20250315122531803

image-20250315122646581

2.用6个LED完成周期为1秒的跑马灯效果

流水灯模块设计

时钟输入

DE2-115开发板配备了一个固定的时钟源。该开发板内置了一个50MHz的晶振,这意味着开发板上有一个能够产生每秒50百万个周期信号的振荡器或时钟发生器,用于驱动FPGA(现场可编程门阵列)芯片

时钟周期

时钟周期是时钟信号的一个完整波形(从上升沿到下一个上升沿或下降沿到下一个下降沿)所需的时间,可以通过下面的公式计算:

image-20250312171741312

对于50MHz的时钟频率,时钟周期为20纳秒。

1s内点亮6个led,即等待前一个灯熄灭后1/6s=0.167s点亮下一个灯,所以代码编写如下

代码编写(计数器版本)
module led_test(input wire clk,     // 50MHz时钟输入input wire rst_n,   // 复位信号,低电平有效output reg [5:0] led // 6个LED灯的状态
);
​
// 计数器,计数1s需要50_000_000个时钟周期
reg [25:0] cnt; 
​
// 计数器模块
always @(posedge clk or negedge rst_n) beginif (!rst_n) begincnt <= 26'd0; // 复位时计数器归零end else if (cnt == 50_000_000 - 1) begin // 计满1秒后复位cnt <= 26'd0;end else begincnt <= cnt + 1'd1; // 使用非阻塞赋值end 
end 
​
// LED状态更新逻辑:每次触发时先清零所有LED
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginled <= 6'b000000; // 复位时关闭所有LEDend else begin// 默认保持当前状态(非阻塞赋值)led <= led;if (cnt == 8_333_333 - 1) beginled <= 6'b000001; // 点亮第一个LEDendelse if (cnt == 16_666_666 - 1) beginled <= 6'b000010; // 点亮第二个LEDendelse if (cnt == 25_000_000 - 1) beginled <= 6'b000100; // 点亮第三个LEDendelse if (cnt == 33_333_333 - 1) beginled <= 6'b001000; // 点亮第四个LEDendelse if (cnt == 41_666_666 - 1) beginled <= 6'b010000; // 点亮第五个LEDendelse if (cnt == 50_000_000 - 1) beginled <= 6'b100000; // 点亮第六个LEDendend 
end 
​
endmodule

我需要将现有的代码拆分为至少两个模块:一个计数器模块和一个LED控制模块,然后创建一个顶层模块来连接这两个模块

顶层模块

module led_test(input wire clk,input wire rst_n,output wire [5:0] led
);
// 连接计数器与LED控制器
wire [25:0] cnt_net;
​
counter counter_inst (.clk(clk),.rst_n(rst_n),.cnt(cnt_net)
);
​
led_controller led_ctrl_inst (.clk(clk),.rst_n(rst_n),.cnt_value(cnt_net),.led(led)
);
​
endmodule

LED控制模块 (led_controller.v)

module led_controller(input wire clk,input wire rst_n,input wire [25:0] cnt_value,output reg [5:0] led
);
// LED状态更新逻辑
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginled <= 6'b000000;end else beginled <= led; // 默认保持当前状态// 顺序点亮LED(每个LED间隔约1/6秒)case (1'b1)(cnt_value == 26'd8_333_332): led <= 6'b000001;(cnt_value == 26'd16_666_665): led <= 6'b000010;(cnt_value == 26'd24_999_998): led <= 6'b000100;(cnt_value == 26'd33_333_331): led <= 6'b001000;(cnt_value == 26'd41_666_664): led <= 6'b010000;(cnt_value == 26'd49_999_997): led <= 6'b100000;default: ;endcaseend
end
endmodule

计数器模块

module counter(input wire clk,input wire rst_n,output reg [25:0] cnt
);
// 计数1秒(50MHz时钟)
always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt <= 26'd0;else if (cnt == 26'd49_999_999) // 50M-1cnt <= 26'd0;elsecnt <= cnt + 1'b1;
end
endmodule
管脚绑定

使用的LEDR[0]~[5]这六个led灯来进行实验,LED引脚配置说明如下:

image-20250312163700788

管脚绑定如下:

image-20250315122405289

效果展示

flow_led

2.(选做)增加流水灯的按键暂停、按键恢复功能

使用按钮开关

DE2-115 提供了四个按钮开关,每个按钮开关都通过一个施 密特触发器进行了去抖动处理。四个施密特触发器的输出信 号,分别为KEY0、KEY1、KEY2、KEY3,直接连接到了Cyclone IV E FPGA。当按钮没有 被按下的时候,它的输出是高电平,按下去则给出一个低电平

image-20250312164218485

我选择KEY0做为复位按钮,KEY1作为控制led流水灯暂停的按钮

代码编写
module flow_led_pause(input         clk,       // 50MHz时钟input         rst_n,     // 异步复位(低有效)input         key_pause, // 暂停/继续按键(低有效)output reg [5:0] led     // 6位LED输出
);
​
// 参数定义
parameter CLK_FREQ = 50_000_000; // 50MHz时钟
parameter LED_INTERVAL = CLK_FREQ / 6; // 每个LED亮0.1667秒
​
// 主计数器(1秒周期)
reg [25:0] cnt;
wire cnt_max = (cnt == LED_INTERVAL - 1);
​
// 按键消抖(两级寄存器同步)
reg [1:0] key_sync;
always @(posedge clk or negedge rst_n) beginif (!rst_n) key_sync <= 2'b11;else key_sync <= {key_sync[0], key_pause};
end
wire pause_trig = (key_sync == 2'b10); // 下降沿检测
​
// 暂停标志
reg pause_flag;
always @(posedge clk or negedge rst_n) beginif (!rst_n) pause_flag <= 1'b0;else if (pause_trig) pause_flag <= ~pause_flag; // 按键切换状态
end
​
// LED状态计数器(0~5循环)
reg [2:0] led_state;
always @(posedge clk or negedge rst_n) beginif (!rst_n) begincnt <= 0;led_state <= 0;endelse if (!pause_flag) beginif (cnt_max) begincnt <= 0;led_state <= (led_state == 3'd5) ? 0 : led_state + 1;endelse cnt <= cnt + 1;end
end
​
// LED输出逻辑
always @(posedge clk or negedge rst_n) beginif (!rst_n) led <= 6'b000001; // 复位后LED0亮else if (!pause_flag) begincase (led_state)3'd0: led <= 6'b000001; // LED03'd1: led <= 6'b000010; // LED13'd2: led <= 6'b000100; // LED23'd3: led <= 6'b001000; // LED33'd4: led <= 6'b010000; // LED43'd5: led <= 6'b100000; // LED5default: led <= led;endcaseend
end
​
endmodule
管脚绑定

按钮开关配置说明如下:

image-20250312164415043

管脚绑定如下:

image-20250315140622394

效果展示

flow

参考链接:

vscode安装+配置+使用+调试【保姆级教程】

VSCode配置Verilog/SystemVerilog环境(二)插件安装

FPGA点亮led

led流水灯

FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TensorRT】TensorRT从安装到推理——Python 环境下 MobileNetV4 三分类任务

我想开发一个基于深度学习的分类小软件&#xff0c;逐渐了解到了TensorRT在模型推理速度上的优势&#xff0c;经过一下午资料的查找实现了将onnx模型转为TensorRT格式模型的推理及测试过程。将实现过程记录下来方便日后查看。 本文实验设备是MX350显卡 2G显存 一 、安装Tenso…

1.两数之和(Java)

1. 题目描述 LeetCode 1. 两数之和&#xff08;Two Sum&#xff09; 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回它们的索引。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 …

《深入探索 Python 数据分析:用 Pandas 高效处理与可视化大型数据集》

《深入探索 Python 数据分析:用 Pandas 高效处理与可视化大型数据集》 引言:从零到分析高手 数据是当代社会最宝贵的资源,而数据分析技能是现代职业人不可或缺的一部分。在数据科学的领域中,Python 已成为当之无愧的“首选语言”,其强大的生态系统和简洁的语法让人如虎添…

将树莓派5当做Ollama服务器,C#调用generate的API的示例

其实完全没这个必要&#xff0c;性能用脚后跟想都会很差。但基于上一篇文章的成果&#xff0c;来都来了就先简单试试吧。 先来看看这个拼夕夕上五百多块钱能达到的效果&#xff1a; 只要对速度没要求&#xff0c;那感觉就还行。 Ollama默认只在本地回环&#xff08;127.0.0…

python基础学习二(列表及字典的使用)

文章目录 列表列表的创建获取列表中的多个元素判断列表中元素是否存在列表元素的添加操作列表元素的删除操作列表元素的修改列表的排序列表生成式 字典字典的创建字典的常规操作字典的常用操作字典的视图操作字典元素的遍历字典的特点字典的生成式 列表 一个对象由id&#xff0…

Android设计模式之代理模式

一、定义&#xff1a; 为其他对象提供一种代理以控制对这个对象的访问。 二、角色组成&#xff1a; Subject抽象主题&#xff1a;声明真是主题与代理的共同接口方法&#xff0c;可以是一个抽象类或接口。 RealSubject真实主题&#xff1a;定义了代理表示的真实对象&#xff0c…

国外计算机证书推荐(考证)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)

文章目录 证书推荐1. 六西格玛 (6 Sigma)2. 亚马逊网络服务 (AWS)3. 美国生产与库存控制学会 (APICS)4. 内部审计师协会 (IIA)5. 微软 (Microsoft)6. 甲骨文 (Oracle)7. 项目管理协会 (PMI)8. 红帽 (Red Hat) 证书推荐 1. 六西格玛 (6 Sigma) 介绍&#xff1a;六西格玛是一种…

用mkdocs写文档#自动更新github-page

https://wuyisheng.github.io/blog 背景是上一篇博客 使用mkdocs&#xff0c;最后提及可以部署github page。这里说明下怎么自动部署。 当然&#xff0c;这篇博客主要的目的还是提供下github page的链接 &#xff1a;&#xff09; 我是这样做的&#xff1a; step 1: pip3 i…

QT五 文件系统,QFile,QfileInfo

总览 QIODevice&#xff1a;所有 I/O 设备类的父类&#xff0c;提供了字节块读写的通用操作以及基本接口&#xff1b;QFileDevice&#xff1a;Qt5新增加的类&#xff0c;提供了有关文件操作的通用实现。QFlie&#xff1a;访问本地文件或者嵌入资源&#xff1b;QTemporaryFile&a…

EF Core表达式树

文章目录 前言一、表达式树与委托的区别二、动态构建表达式树示例1示例2示例3高级技巧&#xff1a;表达式合并 三、ExpressionTreeToString安装方法基本用法支持的格式化风格 四、注意事项总结 前言 在 Entity Framework Core 中&#xff0c;表达式树&#xff08;Expression T…

NVM安装速通使用手册(Windows版)NVM管理node版本命令手册 NVM使用手册

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的命令行工具。通过nvm&#xff0c;你可以在同一台机器上安装和切换多个Node.js版本&#xff0c;非常适合开发和测试在不同Node.js版本上运行的应用程序 一、安装地址 1. 官方下载&#xff1a; &…

vLLM命令行使用方法详解

vLLM 是一个针对大语言模型(LLMs)优化的高效推理和服务库。以下是 vLLM 命令行工具的详细使用方法解析,涵盖常见场景和参数配置: 一、核心命令行工具 vLLM 提供两个主要的命令行入口: 启动 API 服务器 用于部署 HTTP/OpenAI 兼容的 API 服务: python -m vllm.entrypoint…

# 基于 OpenCV 的选择题自动批改系统实现

在教育领域&#xff0c;选择题的批改工作通常较为繁琐且重复性高。为了提高批改效率&#xff0c;我们可以利用计算机视觉技术&#xff0c;通过 OpenCV 实现选择题的自动批改。本文将详细介绍如何使用 Python 和 OpenCV 实现一个简单的选择题自动批改系统。 1. 项目背景 选择题…

python黑科技:无痛修改第三方库源码

需求不符合 很多时候&#xff0c;我们下载的 第三方库 是不会有需求不满足的情况&#xff0c;但也有极少的情况&#xff0c;第三方库 没有兼顾到需求&#xff0c;导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改&#xff0c;是我们将要遇到的一个难点…

第十三章:优化内存管理_《C++性能优化指南》_notes

优化内存管理 一、内存管理基础概念二、自定义分配器三、智能指针优化重点知识代码示例&#xff1a;智能指针性能对比 四、性能优化关键点总结多选题设计题答案与详解多选题答案设计题示例答案&#xff08;第1题&#xff09; 一、内存管理基础概念 重点知识 动态内存分配开销…

python笔记之函数

函数初探 python在要写出函数很简单&#xff0c;通过关键字def即可写出&#xff0c;简单示例如下 def add(a, b):return ab 以上即可以定义出一个简单的函数&#xff1a;接收两个变量a和b&#xff0c;返回a和b相加的结果&#xff0c;当然这么说也不全对&#xff0c;原因就是…

【服务器操作指南 - GPU 使用与文件传输】轻松掌握 GPU 状态查看和服务器文件传输技巧

0. 引言 在使用服务器时&#xff0c;高效管理 GPU 和文件传输是两项不可或缺的技能。 本指南旨在帮助您快速掌握服务器环境下的 GPU 使用状态监测方法&#xff0c;并简要介绍如何在服务器之间进行文件传输操作。 1. 查看服务器上的 gpu 使用状态 1.1 安装 gpustat 这条指令…

0330-YYYY-MM-DD格式日期比较大小

最简单的&#xff08;python&#xff09; from datetime import datetime def compare_time(time1,time2): time1_t datetime.strptime(time1,“%Y-%m-%d”) time2_t datetime.strptime(time2,“%Y-%m-%d”) if time1_t < time2_t: return time1_t elif time1_t > ti…

QFlightInstruments飞行仪表控件库

QFlightInstruments 是一个开源的飞行仪表控件库&#xff0c;专为基于 Qt 的应用程序设计。它提供了一系列仿真实飞机仪表的组件&#xff0c;适用于飞行模拟软件、航空电子系统或任何需要高仿真飞行仪表显示的项目。 主要功能 高仿真飞行仪表&#xff1a;包括空速表、高度表、…

VSCode 市场发现恶意扩展正在传播勒索软件!

在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店&#xff0c;但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已从商店中删除。 此外&#xff0c;ahban.cychelloworld 扩展于 2024 年 10 月…