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

FPGA——FPGA状态机实现流水灯

一、引言

在FPGA开发中,状态机是一种重要的设计工具,用于处理具有时间顺序的事件。本文将详细介绍如何使用状态机实现一个LED流水灯的效果。

二、状态机概述

状态机(FSM)是一种行为模型,用于表示系统在不同状态下的行为以及状态之间的转移。在FPGA中,状态机通常用于控制复杂的流程。

2.1 分类

状态机主要分为两类:

  1. 摩尔(Moore)型状态机:输出只取决于当前状态。
  2. 米勒(Mealy)型状态机:输出取决于当前状态和输入条件。

2.2 写法

根据写法,状态机可以分为:

  1. 一段式:所有逻辑在一个always模块中。
  2. 二段式:状态转移和输出分别在两个always模块中。
  3. 三段式:状态转移、转移条件和输出分别在三个always模块中。

三、流水灯实现

本文采用二段式状态机实现LED流水灯。

3.1 顶层模块

顶层模块是整个设计的核心,它负责连接和协调各个子模块。在本设计中,顶层模块将分频模块、按键消抖模块和状态机模块有机地结合在一起,形成了一个完整的系统。

module top (input clk,input rst_n,        input KEY0,input KEY1,output [5:0] led
);wire en_1Hz;wire key0_debounced, key1_debounced;reg pause;wire fsm_rst_n;reg key1_debounced_prev;key_debounce u_key0_deb (.clk(clk),.rst_n(rst_n),.key_in(~KEY0),    .key_out(key0_debounced));key_debounce u_key1_deb (.clk(clk),.rst_n(rst_n),.key_in(~KEY1),    .key_out(key1_debounced));assign fsm_rst_n = ~key0_debounced;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginpause <= 1'b0;       key1_debounced_prev <= 1'b0;end else beginkey1_debounced_prev <= key1_debounced;if (key1_debounced_prev && !key1_debounced) beginpause <= ~pause;endendendclk_divider #(.CLK_FREQ(50_000_000),.OUT_FREQ(1)) u_clk_div (.clk(clk),.rst_n(rst_n),.en(en_1Hz));led_fsm u_led_fsm (.clk(clk),.rst_n(fsm_rst_n),.en(en_1Hz),.pause(pause),.led(led));
endmodule

3.2 分频模块

分频模块的作用是将FPGA的高频时钟信号转换为低频信号,以满足流水灯的时序要求。在本设计中,我们将50MHz的输入时钟分频为1Hz,使得流水灯的每个LED灯能够以1秒为间隔依次点亮。分频模块通过计数器实现,当计数器达到预设的最大值时,产生一个使能信号,触发状态机的状态转移。

module clk_divider #(parameter CLK_FREQ = 50_000_000,parameter OUT_FREQ = 1
) (input clk,input rst_n,output reg en
);localparam CNT_MAX = CLK_FREQ / OUT_FREQ - 1;reg [25:0] cnt;always @(posedge clk or negedge rst_n) beginif (!rst_n) begincnt <= 0;en <= 0;end else beginif (cnt == CNT_MAX) begincnt <= 0;en <= 1;end else begincnt <= cnt + 1;en <= 0;endendend
endmodule

3.3 按键消抖模块

按键消抖模块用于消除按键抖动的影响,确保按键信号的稳定性和可靠性。在实际应用中,机械按键在按下和释放瞬间会产生多次抖动,这可能导致误触发。消抖模块通过延时采样和状态判断,有效地滤除了抖动信号,为后续的逻辑处理提供了稳定的输入。

module key_debounce(input clk,input rst_n,input key_in,output reg key_out
);parameter DEBOUNCE_TIME = 1_000_000; reg [19:0] counter;reg key_reg;always @(posedge clk or negedge rst_n) beginif (!rst_n) begincounter <= 0;key_reg <= 1;key_out <= 1'b0;  end else beginkey_reg <= key_in;if (key_reg != key_in) begincounter <= 0;end else if (counter < DEBOUNCE_TIME) begincounter <= counter + 1;end else beginkey_out <= key_in;endendend
endmodule

3.4 流水灯状态机模块

状态机模块是流水灯设计的核心部分,它定义了流水灯的状态转移逻辑。在本设计中,我们定义了六个状态,每个状态对应一个LED灯的点亮。通过状态转移,实现流水灯的依次点亮效果。状态机的输出直接控制LED灯的亮灭,而状态的转移则由分频模块产生的使能信号触发。

module led_fsm6 (input clk,input rst_n,input en,input pause,        output [5:0] led
);parameter S_LED0 = 6'b000001;parameter S_LED1 = 6'b000010;parameter S_LED2 = 6'b000100;parameter S_LED3 = 6'b001000;parameter S_LED4 = 6'b010000;parameter S_LED5 = 6'b100000;reg [5:0] current_state, next_state;always @(posedge clk or negedge rst_n) beginif (!rst_n) begincurrent_state <= S_LED0;end else if (en && !pause) begin  current_state <= next_state;endendalways @(*) begincase (current_state)S_LED0: next_state = S_LED1;S_LED1: next_state = S_LED2;S_LED2: next_state = S_LED3;S_LED3: next_state = S_LED4;S_LED4: next_state = S_LED5;S_LED5: next_state = S_LED0;default: next_state = S_LED0;endcaseendassign led = current_state;
endmodule

四、运行结果

在实际运行中,流水灯按照预设的状态顺序依次点亮,每个LED灯亮起的时间间隔为1秒。通过按键KEY0可以复位流水灯,使其从第一个LED开始重新运行。通过按键KEY1可以暂停和继续流水灯的运行。
在这里插入图片描述

五、总结

本文详细介绍了如何使用FPGA状态机实现流水灯效果。通过状态机的设计,可以清晰地控制流水灯的状态转移,使整个系统更加稳定和易于维护。状态机的设计方法和实现过程对于其他复杂的FPGA项目也具有重要的参考价值。

相关文章:

FPGA——FPGA状态机实现流水灯

一、引言 在FPGA开发中&#xff0c;状态机是一种重要的设计工具&#xff0c;用于处理具有时间顺序的事件。本文将详细介绍如何使用状态机实现一个LED流水灯的效果。 二、状态机概述 状态机&#xff08;FSM&#xff09;是一种行为模型&#xff0c;用于表示系统在不同状态下的…...

晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包

晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 刷机工具版本请用2.2.0以上&#xff0c;导入固件后&#xff0c;刷机工具右侧两个擦除打勾&#xff0c;然后点开始。插上刷机神器&#xf…...

构建第一个ArkTS应用:Hello World之旅

# 构建第一个ArkTS应用&#xff1a;Hello World之旅 在鸿蒙应用开发的领域中&#xff0c;ArkTS语言为我们提供了强大而便捷的开发方式。今天&#xff0c;就让我们一起踏上构建第一个ArkTS应用——Hello World的奇妙旅程。 ## 一、创建ArkTS工程 1. 首先&#xff0c;我们要使用…...

第十五届单片机模拟考试III

题目 题目不长 &#xff0c;功能也不难&#xff0c;一道水题 按键功能 S4界面切换&#xff0c;S5 功能切换&#xff0c;在不同界面转换不同的功能&#xff0c;定义两个标志位记录即可。 S9复位&#xff0c;回到初始状态&#xff0c;记得界面也得回到初始的信号界面&#xff0…...

测试:正交法设计测试用例

目录 一、什么是正交法 二、利用正交表设计测试用例 正交法设计测试用例的步骤 一、什么是正交法 正交法的目的是为了减少测试用例的数量&#xff0c;让尽可能少的用例覆盖两两组合。认识正交表。 最简单的正交表是L4(2^3)&#xff0c;含意如下&#xff1a; “L”代表正…...

生成 SSH Key 并配置 GitHub/GitLab 详细教程

&#x1f511; 生成 SSH Key 并配置 GitHub/GitLab 详细教程 &#x1f7e2; 第 1 步&#xff1a;检查是否已有 SSH Key 在 Git Bash (Windows)、终端 (Linux/macOS) 运行以下命令&#xff1a; ls -al ~/.ssh&#x1f539; 可能的输出&#xff1a; 如果已有 SSH Key&#xf…...

[ctfshow web入门] web5

前置知识 引用博客&#xff1a;phps的利用 当服务器配置了 .phps 文件类型时&#xff0c;访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码&#xff0c;而不是执行它。.phps被作为辅助开发者的一种功能&#xff0c;开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …...

Qt基本框架(2)

本篇主要介绍如何设置窗口&#xff0c;以及在窗口中添加按钮 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt简单框架 2. 通过QMainWindow实现简单界面 QMainWindow是构建主窗口应用的核心类&#xff0c;通过合理设计…...

基于javaweb的SpringBoot图片管理系统图片相册系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

用HTML.CSS.JavaScript实现一个贪吃蛇小游戏

目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏&#xff0c;曾经风靡一时。今天&#xff0c;我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目&#xff0c…...

[特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数

在 Pandas 中&#xff0c;许多操作可以直接使用 Python 的比较运算符&#xff08;如 、!、>、< 等&#xff09;&#xff0c;而不需要调用 Pandas 的专门函数&#xff08;如 eq()、ne()、gt() 等&#xff09;。这些运算符在 Pandas 中已经被重载&#xff0c;代码更简洁。以…...

Java 实现插入排序:[通俗易懂的排序算法系列之三]

引言 大家好!欢迎继续关注我的排序算法系列。今天,我们要学习的是另一种非常基础且重要的排序算法——插入排序 (Insertion Sort)。 插入排序的思路非常贴近我们日常整理扑克牌的方式,理解起来相对自然。虽然它在最坏情况下的效率不高,但在某些特定场景下,它的表现甚至优…...

使用MATIO库写入MATLAB结构体(struct)数据的示例程序

使用MATIO库写入MATLAB结构体(struct)数据的示例程序 MATIO是一个用于读写MATLAB数据文件(.mat)的开源C库。下面是一个完整的示例程序&#xff0c;展示如何使用MATIO库创建一个包含结构体数据的MAT文件。 示例程序 #include <stdio.h> #include <stdlib.h> #inc…...

JVM——模型分析、回收机制

方法区&#xff1a;存储已被虚拟机加载的类元数据信息(元空间) 堆&#xff1a;存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存 虚拟机栈&#xff1a;虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…...

7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”

引言&#xff1a;当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份&#xff0c;每次对话都要求重复验证&#xff0c;引发大量投诉。引入LangChain 记忆系统后&#xff0c;客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储&#xff0c;教你构建符合…...

前后端分离下,Spring Boot 请求从发起到响应的完整执行流程

以下是前后端分离架构下&#xff0c;Spring Boot 请求从发起到响应的完整执行流程&#xff0c;结合你提出的所有问题&#xff0c;按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例&#xff1a; 一、前端发起请求&#xff08;步骤1-2&…...

【文献阅读】Vision-Language Models for Vision Tasks: A Survey

发表于2024年2月 TPAMI 摘要 大多数视觉识别研究在深度神经网络&#xff08;DNN&#xff09;训练中严重依赖标注数据&#xff0c;并且通常为每个单一视觉识别任务训练一个DNN&#xff0c;这导致了一种费力且耗时的视觉识别范式。为应对这两个挑战&#xff0c;视觉语言模型&am…...

【BFS最小步数】魔板题解

魔板题解 题目传送门 题目传送门 一、题目描述 Rubik先生发明了魔板的二维版本&#xff0c;这是一个有8个格子的板子&#xff0c;初始状态为&#xff1a; 1 2 3 4 8 7 6 5我们可以用三种操作来改变魔板状态&#xff1a; A&#xff1a;交换上下两行B&#xff1a;将最右边一…...

搭建K8S-1.23

0、简介 这里只用3台服务器来做一个简单的集群 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、关闭三个服务 &#xff08;1&#xff09;防火墙 systemctl stop firewalld &#xff08;2&#xff09;Selinux setenf…...

AOP在SpringBoot项目中的简单使用场景

SpringBoot AOP的简单使用 添加DTO添加controller(同包不同类)控制器1控制器2 AOP场景演示1. 对某package下的所有接口进行方法执行前逻辑校验新增切面&#xff0c;编写处理逻辑 2. 对某controller类下的所有接口进行方法执行前逻辑校验新增切面&#xff0c;编写处理逻辑 3. 对…...

windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片

windows如何安装wkhtmltoimage 给PHP使用 在Windows系统上安装wkhtmltoimage以便在PHP中使用&#xff0c;通常涉及到以下几个步骤&#xff1a; 下载wkhtmltoimage 首先&#xff0c;你需要从wkhtmltopdf的官方网站&#xff08; https://wkhtmltopdf.org/downloads.html &#xf…...

代码仓库使用git lfs上传模型文件

一 Git LFS是什么 它主要是用来处理大文件的&#xff0c;比如模型文件通常都很大&#xff0c;超过100MB的话&#xff0c;用普通的Git上传可能会出问题&#xff0c;所以必须用LFS。 二 具体步骤 Windows环境下使用Git LFS上传大模型文件到代码仓库&#xff1a; 2.1&#xff…...

AI比人脑更强,因为被植入思维模型【42】思维投影思维模型

giszz的理解&#xff1a;本质和外在。我们的行为举止&#xff0c;都是我们的内心的表现。从外边可以看内心&#xff0c;从内心可以判断外在。曾国藩有&#xff17;个识人的方法&#xff0c;大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪&#xff0c;我认为有四点&…...

Git 从入门到精通(开源协作特别版)

&#x1f9e0; Git 从入门到精通&#xff08;开源协作特别版&#xff09; ✅ 基础命令 &#x1f9f0; 高级用法 &#x1f6e0;️ 开源实战技巧 &#x1f30d; GitHub 社区协作 适合&#xff1a;从0开始 → 熟练开发者 → 参与/维护开源项目 &#x1f530; 第1章&#xff1a;…...

spring-cloud-alibaba-nacos-config使用说明

一、核心功能与定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生态中的核心组件之一&#xff0c;专为微服务架构提供动态配置管理能力。它通过整合 Nacos 的配置中心功能&#xff0c;替代传统的 Spring Cloud Config&#xff0c;提供更高效的配置集中化管理…...

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…...

vue3中ref、reactive的使用示例

ref 1、导入 import { ref } from "vue"; 2、定义 // 报告表格数据 const reportTableData ref<Report[]>([]); 3、赋值 // 获取报告信息 let result await reportDataByOuterApplyIdService(tableSelectedRow.value?.outerApplyId); reportTable…...

【嵌入式系统设计师】知识点:第2章 嵌入式系统硬件基础知识

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...

Vue2_Vue.js教程

目录 一、Vue.js安装 1、独立版本 2、CDN 方法 3、npm 方法 二、Vue Al编程助手 三、Vue.js目录结构 目录解析 四、Vue.js 起步 1.如何定义数据对象和方法并渲染进页面 五、Vue.js 模板语法 插值 文本_{{}} Html_v-html 指令 属性_v-bind (数据传输工具)指令 表…...

【工业场景】用YOLOv12实现饮料类别识别

饮料类别识别任务的意义在于帮助人们更快速地识别和区分不同类型的饮料&#xff0c;从而提高消费者的购物体验和满意度。对于商家而言&#xff0c;饮料类别识别可以帮助他们更好地管理库存、优化货架布局和预测销售趋势&#xff0c;从而提高运营效率和利润。此外&#xff0c;饮…...