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

跟着我从零开始入门FPGA(一周入门系列)第六天

6、有限状态机

状态机,只要C代码写过2年的人,估计无人不识君,稍微复杂的逻辑都可以借助状态机来简化问题。

为了方便,我们使用前面用过的一个例子,来说明状态机的应用,也就是说我们前面已经有意无意的用过状态机了。

我们以SPI的Slave接口,为例,来说明状态机的使用


为了简化问题
1、我们没有把信号同步到本地时钟
2、把其他信号同步到SCK
3、我们把SPI暂时按照单向来分析

下面,我们分析SPI通讯
1、nCS高电平时候,总线是空闲的
2、nCS低电平时传输数据
3、满了8个bit,凑够了一个字节,要保存当前已经收到的字节,并准备收下一个;

nCS高电平的时候,我们称之为idel态(IDEL)
接受0~7逐个bit的时候,称之为bit接受态(BIT_RECV)
收满一个字节,称之为字节转存态(BYTE_SAVE)

 

 model SlaveSPI(input nCS, input SCK, input MOSI, output MISO);

parameter IDEL = 0,
          BIT_RECV = 1,
          BIT_SAVE = 2;

    reg[3:0]    bitcnt;
    reg[7:0]    shift_in;   //写入
    reg[7:0]    shift_out;  //读出

    reg[7:0]    data;

    reg[1:0]    state;
    reg[1:0]    next_state;

    always @(*)
    begin
        case(state)
        IDEL:
            if(nCS==1'b1)
                next_state = IDEL;
            else
                next_state = BIT_RECV;
        BIT_RECV:
            if(nCS==1'b0)
            bgein
                if(bitcnt<4'h8)
                    next_state = BIT_RECV;
                else
                    next_state = BYTE_SAVE;
            end
            else
                next_state = IDEL;
        BYTE_SAVE:
            if(nCS==1'b0)
                next_state = BIT_RECV;
            else
                next_state = IDEL;
        defalut:
            next_state = IDEL;
        endcase
    end


    always @(posdge SCK)
        if(nCS)
            bitcnt=0;
        else
            state = next_state


    always @(posdge SCK)
        case(state)
        BIT_RECV:
            begin
                bitcnt <= bitcnt+4'h1;
                shift_in <= {shift_in[6:0], MOSI};
            end
        BYTE_SAVE:
            begin
                bitcnt <= 4'h0;
                data <= deshift_in;
            end
        endcase
   
我用了所谓的三段式,来描述这个状态机,用了3个always语句
第一个always用来描述状态转移的条件
第二个always用来描述状态转移
第三个always用来描述状态机的输出,也就是状态机实际要干的活


与前面帖子(同步和异步设计)中的SPI代码相比,是不是冗长了很多。
冗长,并不代表着脱裤子放屁,自找麻烦。您难道没有反显,代码很容易读懂了吗?

没错,这就是空间换时间的策略,我们写更长的代码来增强可分析性。

状态机的代码撰写一般不复杂,复杂的是状态机的构建过程,这个过程中,我们要分析
实际遇到的各个情况,同时把状态机进行优化,某些状态进行合并,某些状态去掉。
  
有人问,为何某些状态要去掉?
这要说下FSM的来头了,有限状态机,是有限的状态机。
自然界实际的状态机,往往起状态的数量,是非常大的,直接建模使用简直是劳民伤财。
而且,现实的往往是无限的状态机,这根本无法用于工程实现,所以有限状态机就横空出世了。

正如,软件算法中的DAG(Directed Acyclic Graph)有向无环图,比纯粹的图有实用价值。
二叉树,比多叉树,也更容易实现。

越说,软件和FPGA越近了。可谓是天下大势,分久必合,合久必分。

相关文章:

跟着我从零开始入门FPGA(一周入门系列)第六天

6、有限状态机状态机&#xff0c;只要C代码写过2年的人&#xff0c;估计无人不识君&#xff0c;稍微复杂的逻辑都可以借助状态机来简化问题。为了方便&#xff0c;我们使用前面用过的一个例子&#xff0c;来说明状态机的应用&#xff0c;也就是说我们前面已经有意无意的用过状态…...

2023最新JVM面试题汇总进大厂必备

JVM 面试题汇总 1.什么是 JVM&#xff1f;它有什么作用&#xff1f; 答&#xff1a;JVM 是 Java Virtual Machine&#xff08;Java 虚拟机&#xff09;的缩写&#xff0c;顾名思义它是一个虚 拟计算机&#xff0c;也是 Java 程序能够实现跨平台的基础。它的作用是加载 Java 程…...

Cocoa-presentViewController

presentViewController:animator: 将一个viewController以动画方式显示出来 当VCA模态的弹出了VCB&#xff0c;那么VCA就是presenting view controller&#xff0c;VCB就是presented view controller presentViewController 相较于addSubView 直接作为subView就是不会出现一…...

Vue Mixins

Vue Mixins 详解 Vue.js 是一个非常流行的 JavaScript 框架&#xff0c;它提供了一系列的工具来简化 Web 应用程序的开发。其中一个非常有用的工具就是 Mixins。 什么是 Mixins&#xff1f; Mixins 是一种 Vue.js 组件复用的方法&#xff0c;它允许您将一组组件选项合并到一…...

Django-版本信息介绍-版本选择

文章目录1.如何获取Django1.1.选项1:获取最新的正式版本1.2.选项2:获取4.2的beta版1.3.选项3:获取最新的开发版本2.得到之后3.支持版本4.选择版本1.如何获取Django Django在BSD许可下是开源的。我们建议使用最新版本的Python 3。支持Python 2.7的最新版本是Django 1.11 LTS。请…...

写给交互设计新手的信息架构全方位指南

目录什么是信息架构&#xff1f;通用方法日常工作可以关注的大神常用工具相关书籍什么是信息架构&#xff1f;信息架构是一个比众多其他领域更难定义的领域。内容策划由内容策划师来完成&#xff0c;交互设计由设计师来完成&#xff0c;而信息架构的完成与它们不同&#xff0c;…...

15、主从复制,gtid,并行复制,半同步复制,实操案例,常用命令,故障处理

主从复制,gtid,并行复制,半同步复制,实操案例,常用命令,故障处理 1.认识主从复制1.1 主从复制原理深入讲解1.2 主从复制相关参数1.3.主从复制架构部署1.4从库状态详解1.5 .过滤复制2 .gtid复制2.1 什么是GTID?2.2 GTID主从配置2.5 gtid维护2.4 GTID的特点2.3 工作原理2.4 g…...

【C语言】实现文件内容映射转移

有两个文件&#xff08;QA&#xff0c;与QB&#xff09;。 文件A是经过了字母映射加密的文本&#xff08;将英文字母一一映射成了另一个&#xff09;&#xff0c; 文件B是字母映射的关系表&#xff08;格式如A-c;B-R;…,其中前一个字母为加密前的&#xff09;&#xff0c;编写程…...

html css输入框获得焦点、失去焦点效果

input输入框获得焦点、失去焦点效果 废话shao shuo ! 直接看效果图&#xff0c;好吧&#xff01; 效果图&#xff1a; code: <!DOCTYPE html> <html> <head><title></title><meta charset"utf-8" /><style type"text…...

Spark Streaming

第1章 SparkStreaming 概述1.1 Spark Streaming 是什么Spark 流使得构建可扩展的容错流应用程序变得更加容易。**Spark Streaming 用于流式数据的处理。**Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter、ZeroMQ 和简单的 TCP 套接字…...

[kubernetes]-k8s通过psp限制nvidia-plugin插件的使用

导语&#xff1a; k8s通过psp限制nvidia-plugin插件的使用。刚开始接触psp 记录一下 后续投入生产测试了再完善。 通过apiserver开启psp 静态pod会自动更新 # PSP(Pod Security Policy) 在默认情况下并不会开启。通过将PodSecurityPolicy关键词添加到 --enbale-admission-plu…...

简单易懂又非常牛逼的Spring源码解析,推断构造与bean的实例化

简单易懂又非常牛逼的Spring源码解析&#xff0c;推断构造与bean的实例化原理解析实例化bean的入口工厂方法实例化推断构造初次筛选二次筛选bean的实例化代码走读实例化bean的入口createBeanInstance方法内部的流程推断构造初次筛选二次筛选bean的实例化总结往期文章&#xff1…...

Win11的两个实用技巧系列清理磁盘碎片、设置系统还原点的方法

Win11如何清理磁盘碎片?Win11清理磁盘碎片的方法磁盘碎片过多&#xff0c;会影响电脑的运行速度&#xff0c;所以需要定期清理&#xff0c;这篇文章将以Win11为例&#xff0c;给大家分享的整理磁盘碎片方法相信很多用户都会发现&#xff0c;随着电脑使用时间的增加&#xff0c…...

嵌入式 STM32 红外遥控

目录 红外遥控 NEC码的位定义 硬件设计 软件设计 源码程序 红外遥控 红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;容易实现等显著的特点&#xff0c;被诸多电子设备特别…...

【java web篇】使用JDBC操作数据库

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

华为OD机试题,用 Java 解【最小步骤数】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

JAVA中 throw 和 throws 的区别含案例

JAVA中 throw 和 throws 的区别含案例 在 Java 中&#xff0c;throw 和 throws 是两个关键字&#xff0c;它们用于处理异常。 throw 关键字用于抛出一个异常对象。一旦抛出异常&#xff0c;程序将停止执行当前方法的剩余代码&#xff0c;并尝试寻找与该异常匹配的 catch 块来…...

基于SpringCloud的可靠消息最终一致性05:保存并发送事务消息

在有了分布式事务的解决方案、项目的需求、骨架代码和基础代码,做好了所有的准备工作之后,接下来就可以继续深入了解「核心业务」了。 在前面了解分布式事务时,可靠消息最终一致性方案的流程图是这样的: 图三十一:可靠消息最终一致性 整个的流程是: 1、业务处理服务在事务…...

SQL语句大全(详解)

SQL前言1 DDL1.1 显示所包含的数据库1.2 创建数据库1.3 删除数据库1.4 使用数据库1.4.1 创建表1.4.2 查看表的结构1.4.3 查看当前数据库下的所有表1.4.4 基础的增删改查1.4.4.1 删除表1.4.4.2 添加列1.4.4.3 修改表名1.4.4.4 修改数据类型1.4.4.5 修改列名和数据类型2 DML2.1 给…...

视频营销活动中7个常见的错误

如今&#xff0c;越来越多的企业在社交媒体平台上开展视频营销活动。与其他传统营销策略不同&#xff0c;视频营销可以为企业带来更多的销售机会。随着越来越多的视频社交媒体平台的出现&#xff0c;营销人员更应该抓住这个机会。但在开始视频创作之前&#xff0c;您需要有一个…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...