【FPGA基础学习】状态机思想实现流水灯

目录

    • 一、用状态机实现LED流水灯
      • 1.状态机思想简介
        • 1. 1基本概念
        • 1.2.核心要素
        • 1.3分类与模型
      • 2.LED流水灯
    • 二、CPLD与FPGA
        • 1.技术区别
        • 2.应用场景
        • 3.设计选择建议
    • 三、HDLbits组合逻辑题目

一、用状态机实现LED流水灯

1.状态机思想简介

1. 1基本概念

​ 状态机(Finite State Machine, FSM)是一种用于描述系统行为及其状态转换的数学模型。它将系统抽象为有限个状态,并通过事件触发实现状态间的迁移,同时可能伴随特定的动作。其核心思想是“基于状态的逻辑控制”,适用于具有明确阶段性和条件依赖性的系统

1.2.核心要素

​ 现态(Current State):系统当前所处的状态。

​ 事件(Event):触发状态迁移的条件(如用户输入、传感器信号等)

​ 动作(Action):状态迁移时执行的操作(如开启设备、发送数据等)

​ 次态(Next State):事件触发后系统将进入的新状态

1.3分类与模型

​ Moore型:输出仅由当前状态决定(如交通信号灯的红绿灯切换)

​ Mealy型:输出由当前状态和输入共同决定(如网络协议中的应答机制)

​ 确定型(DFA):每个状态对同一事件有唯一迁移路径

​ 非确定型(NFA):同一事件可能触发多个迁移路径,需额外逻辑处理

2.LED流水灯

核心代码如下:

module led_flow(input clk,          // 50MHz时钟input rst_n,        // 复位信号(低有效)output reg [7:0] led
);// 状态定义(8个状态)localparam [2:0] S0=0, S1=1, S2=2, S3=3, S4=4, S5=5, S6=6, S7=7;reg [2:0] state;reg [24:0] cnt;wire en = (cnt == 25'd24_999_999); // 分频使能// 分频计数器always @(posedge clk or negedge rst_n) beginif (!rst_n) cnt <= 0;else if (en) cnt <= 0;else cnt <= cnt + 1;end// 状态机主逻辑always @(posedge clk or negedge rst_n) beginif (!rst_n) beginstate <= S0;led <= 8'b00000001; // 初始状态S0点亮LED0endelse if (en) begincase(state)S0: begin led <= 8'b00000010; state <= S1; end  //S0→S1(第2个LED亮)S1: begin led <= 8'b00000100; state <= S2; end  //S1→S2(第3个LED亮)S2: begin led <= 8'b00001000; state <= S3; end  //S2→S3(第4个LED亮)S3: begin led <= 8'b00010000; state <= S4; end  //S3→S4(第5个LED亮)S4: begin led <= 8'b00100000; state <= S5; end  //S4→S5(第6个LED亮)S5: begin led <= 8'b01000000; state <= S6; end  //S5→S6(第7个LED亮)S6: begin led <= 8'b10000000; state <= S7; end  //S6→S7(第8个LED亮)S7: begin led <= 8'b00000001; state <= S0; end  //S7→S0(第1个LED亮,循环)default: state <= S0;                          // 默认回到初始状态endcaseendend
endmodule

仿真文件编写:

`timescale 1ns / 1ps
module led_flow_tb;// 输入信号reg clk;          // 50MHz时钟reg rst_n;        // 复位信号(低有效)// 输出信号wire [7:0] led;   // LED输出// 实例化被测模块led_flow uut (.clk(clk),.rst_n(rst_n),.led(led));// 1. 生成50MHz时钟initial beginclk = 0;forever #10 clk = ~clk; // 周期20ns(50MHz)end// 2. 控制复位信号initial beginrst_n = 0;    // 初始复位有效#100;         // 保持100ns复位rst_n = 1;    // 释放复位#2000000000;  // 仿真运行2秒(覆盖多个状态循环)$finish;      // 结束仿真end// 3. 监视信号变化initial begin$monitor("Time=%tns | State=%d | LED=%b", $time, uut.state, led);end
endmodule

仿真:

因为我流水灯的周期太长了,没有办法显示全,所以调整分频

  wire en = (cnt == 25'd4_999_999); // 分频使能

image-20250404151421478

image-20250404151441645

image-20250404151501721

image-20250404151525754

image-20250404151552046

image-20250404151608280

image-20250404151624518

image-20250404151647958

可以看到仿真结果符合预期

引脚绑定:

image-20250404113908512

实现效果:

led 流水灯状态机思想

二、CPLD与FPGA

1.技术区别
特性CPLDFPGA
架构基于乘积项(Product Term)结构,逻辑块较大基于查找表(LUT)结构,逻辑单元粒度小
资源规模较小(通常<10万门)较大(可达数百万门)
时序特性延时均匀,可预测性强延时依赖布局布线,需时序约束优化**7
编程方式非易失性(EEPROM/Flash),无需外部配置易失性(SRAM),需外部存储器加载配置
功耗静态功耗低,适合低功耗场景动态功耗高,适合高性能计算
重构灵活性配置固定,不支持动态重构支持实时动态重构
2.应用场景
  • CPLD

    • 控制密集型系统:如接口转换(UART转SPI)、简单状态机、工业控制逻辑
    • 低功耗场景:电池供电设备,需长期稳定运行
    • 快速原型验证:中小规模逻辑的快速实现
  • FPGA

    • 数据密集型系统:图像处理、高速通信(如PCIe)、数字信号处理(DSP)

    • 复杂算法加速:深度学习推理、加密解密算法

    • 可重构计算:航天电子设备需在轨更新功能

3.设计选择建议
  • 若需简单逻辑控制且对成本敏感,选CPLD

  • 若需高性能并行处理或动态重构,选FPGA

三、HDLbits组合逻辑题目

HDLBits(点击进入练习) 是一个专注于 Verilog硬件描述语言(HDL)学习和实践 的在线平台,由多伦多大学开发,旨在通过小型电路设计习题帮助用户:夯实Verilog基础、理解数字电路设计思想(例如状态机设计、时序约束优化等关键概念)、衔接实际项目(平台题目与FPGA开发中的常见模块,如FIFO、接口控制器,高度相关)

题目1:简单电路B

image-20250403213936883

module top_module ( input x, input y, output z );assign z = ~(x ^ y);
endmodule

题目2:Two gates

image-20250403212658031

module top_module (input in1,input in2,input in3,output out);assign out=(~(in1^in2))^in3;
endmodule

题目3:7420chip

image-20250403213030426

module top_module ( input p1a, p1b, p1c, p1d,output p1y,input p2a, p2b, p2c, p2d,output p2y );assign p1y=~(p1a&p1b&p1c&p1d);assign p2y=~(p2a&p2b&p2c&p2d);
endmodule

题目4:真值表

image-20250403215220173

module top_module( input x3,input x2,input x1,  // three inputsoutput f   // one output
);wire and1 = (~x3 & x2 & ~x1);wire and2 = (~x3 & x2 & x1);wire and3 = (x3 & ~x2 & x1);wire and4 = (x3 & x2 & x1);assign f = and1 | and2 | and3 | and4;
endmodule

题目5:加法器

image-20250403220105291

 module top_module (input [3:0] x, input [3:0] y, output [4:0] sum);assign sum = x + y;
endmodule

参考链接:

百度词条CPLD与FPGA

CPLD与FPGA的用途及其区别

百度百科状态机

聊一聊状态机

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

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

相关文章

CSS语言的游戏AI

CSS语言的游戏AI探讨 随着技术的飞速发展&#xff0c;游戏行业也在不断地革命和演变。游戏中的人工智能&#xff08;AI&#xff09;作为一种重要的设计元素&#xff0c;其复杂性和智能程度对游戏的体验、玩法和整体表现都有着深远的影响。近年来&#xff0c;CSS&#xff08;Ca…

docker配置redis容器时配置文件docker-compose.yml示例

1.配置数据节点&#xff08;主从节点&#xff09; version: 3.7 services:master:image: redis:5.0.9container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: redis:5.0.9container_name: redis-slave1restart: a…

【WPF】IOC控制反转的应用:弹窗但不互相调用ViewModel

全称&#xff1a;Inversion of Control&#xff0c;控制反转 场景&#xff1a;A页面需要调用B/C页面等&#xff0c;防止直接在VM中新建别的页面实例&#xff0c;使用IOC设计架构&#xff1b; 创建Service&#xff0c;在Service中实现页面的实例创建和定义页面输入输出参数。 在…

MySQL学习笔记十五

第十七章组合查询 17.1组合查询 MySQL允许执行多个查询&#xff08;多条SELECT语句&#xff09;&#xff0c;并将结果作为单个查询结果集返回。这些组合查询通常称为并&#xff08;union&#xff09;或复合查询&#xff08;compound query&#xff09;。 以下几种情况需要使…

【MySQL】安装

下载 MySQL :: MySQL Downloads 安装 mysql 验证

ffpyplayer+Qt,制作一个视频播放器

ffpyplayerQt&#xff0c;制作一个视频播放器 项目地址FFmpegMediaPlayerVideoWidget 项目地址 https://gitee.com/chiyaun/QtFFMediaPlayer FFmpegMediaPlayer 按照 QMediaPlayer的方法重写一个ffpyplayer # coding:utf-8 import logging from typing import Unionfrom PySide…

Spring Boot 国际化配置项详解

Spring Boot 国际化配置项详解 1. 核心配置项分类 将配置项分为以下类别&#xff0c;便于快速定位&#xff1a; 1.1 消息源配置&#xff08;MessageSource 相关&#xff09; 控制属性文件的加载、编码、缓存等行为。 配置项作用默认值示例说明spring.messages.basename指定属…

拍摄的婚庆视频有些DAT的视频文件打不开怎么办

3-12 现在的婚庆公司大多提供结婚的拍摄服务&#xff0c;或者有一些第三方公司做这方面业务&#xff0c;对于视频拍摄来说&#xff0c;有时候会遇到这样一种问题&#xff0c;就是拍摄下来的视频文件&#xff0c;然后会有一两个视频文件是损坏的&#xff0c;播放不了&#xff0…

【力扣hot100题】(073)数组中的第K个最大元素

花了两天时间搞明白答案的快速排序和堆排序。 两种都写了一遍&#xff0c;感觉堆排序更简单很多。 两种都记录一下&#xff0c;包括具体方法和易错点。 快速排序 class Solution { public:vector<int> nums;int quicksort(int left,int right,int k){if(leftright) r…

【亲测】Linux 使用 Matplotlib 显示中文

文章目录 安装中文字体在Matplotlib中使用该字体来显示中文 在 Linux 系统中使用 Matplotlib 绘制图表时&#xff0c;如果需要显示中文&#xff0c;可能会遇到中文字符显示为方块或者乱码的问题。这是因为Matplotlib 默认使用的字体不支持中文。本文手把手带你解决这个问题。 …

Redis Java 客户端 之 SpringDataRedis

SpringDataRedis SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis集成模块就叫做SpringDataRedis&#xff0c; 官方地址&#xff1a;https://spring.io/projects/spring-data-redis 特性&#xff1a; 提供了对不同Redis客户端…

数字化转型:重构生存逻辑,不止系统升级

数字化转型不过是升级系统&#xff0c;砸了钱、耗了力&#xff0c;却没达到预期&#xff0c;竞争力也没提升。实际上&#xff0c;数字化转型是对企业生存逻辑的彻~底重构&#xff0c;关乎商业模式、运营流程等方方面面。​ 很多企业觉得数字化转型是 IT 部门的事&#xff0c;只…

C语言队列的实现

目录 ​编辑 &#xff08;一&#xff09;队列的定义,初始化及创建结点 &#xff08;二&#xff09;入队和出队&#xff0c;以及取队头队尾的数据 (三)销毁队列 队列是指只允许在一端进行插入数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先…

mapbox进阶,使用本地dem数据,加载hillshade山体阴影图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️hillshade 山体阴影图层 api1.3.1 ☘️…

量子纠错码实战:从Shor码到表面码

引言&#xff1a;量子纠错的必要性 量子比特的脆弱性导致其易受退相干和噪声影响&#xff0c;单量子门错误率通常在10⁻~10⁻量级。量子纠错码&#xff08;QEC&#xff09;通过冗余编码测量校正的机制&#xff0c;将逻辑量子比特的错误率降低到可容忍水平。本文从首个量子纠错…

10. git switch

基本概述 git switch是 Git 2.23 版本之后新增的命令&#xff0c;专门用于切换分支&#xff0c;目的是替代 git checkout 中与分支操作相关的功能&#xff0c;使命令语义更清晰、更安全。 基本用法 1.切换到已有分支 git switch <branch-name>常用选项 1.从当前分支…

LeetCode 热题 100 堆

215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 **k** 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 …

PIXOR:基于LiDAR的3D检测模型解析

目录 1、前言 2、PIXOR介绍 2.1. 什么是PIXOR&#xff1f; 2.2. PIXOR如何工作&#xff1f; 3、表现和应用 3.1、PIXOR的性能表现 3.2、PIXOR的应用场景 3.3、PIXOR的局限性与挑战 4. PIXOR的未来展望 5. 结语 1、前言 自动驾驶技术正以前所未有的速度发展&#xff…

Vue中权限控制的方案

文章目录 源码&#xff1a;一、页面级1.1、路由守卫1.2、动态路由 二、按钮级别2.1、通过v-if来判断2.2、通过组件包裹的方式来判断2.3、通过自定义指令的方式 三、接口级别 源码&#xff1a; https://gitee.com/liu-qiang-yyds/sysPermission 一、页面级 1.1、路由守卫 前端…

【OSG学习笔记】Day 1: OSG初探——环境搭建与第一个3D窗口

什么是 OSG&#xff1f; 全称&#xff1a;OpenSceneGraph&#xff08;开源场景图&#xff09; 定位&#xff1a;一个基于 C/OpenGL 的高性能开源3D图形开发工具包&#xff0c;专注于实时渲染和复杂场景管理。 核心思想&#xff1a;通过 场景图&#xff08;Scene Graph&#xf…