[Verilog]有限状态机设计举例

news2024/11/16 11:30:19

有限状态机设计举例

       摘要:有限状态机(FSM)是许多数字系统中用来控制系统和数据流路径行为的时序电路。FSM的实例包括控制单元时序。 本实验介绍了两种类型的FSM(MealyMoore)的概念,以及开发此类状态机的建模方式。 请参阅Vivado教程,了解如何使用Vivado工具创建项目和验证数字电路。

一、实验目标

   在本次实验中,你将会学到:

  • 对 Mealy FSMs 建模
  • 对 Moore FSMs 建模

    1.1 Mealy FSM(米利型有限状态机)

           有限状态机(FSM)或称简单状态机用于设计计算机程序和时序逻辑电路。它被设想为抽象机器,可以处于有限数量的用户定义状态之一。机器一次只能处于一种状态; 它在任何给定时间所处的状态称为当前状态。 当由触发事件或条件启动时,它可以从一种状态改变为另一种状态; 这称为过渡。特定FSM由其状态列表和每个转换的触发条件定义。
           在现代社会中的许多设备中可以观察到状态机的踪影,这些设备根据发生的事件序列执行预定的动作序列。 简单的例子是自动售货机,当存放硬币的金额达到商品价格时分配产品;电梯在把乘客送达楼上后才会下降;交通灯按一定的时间改变信号来控制车流;以及需要输入一串正确的数字才能打开的组合锁。
           状态机使用两种基本类型建模–Mealy和Moore。 在Mealy机器中,输出取决于当前状态和当前输入。在Moore机器中,输出仅取决于当前状态。
           Mealy型状态机的一般模型由组合过程电路状态寄存器组成,组合过程电路生成输出和下一个状态,状态寄存器保存当前状态,如下图所示。状态寄存器通常建模为D触发器。状态寄存器必须对时钟边缘敏感。其他块可以使用always过程块或always过程块和dataflow建模语句的混合来建模;always过程块必须对所有输入敏感,并且必须为每个分支定义所有输出,以便将其建模为组合块。两段式Mealy机器可以表示为

  • 下面是奇偶校验校验机的状态图和相关模型:

module mealy_2processes(input clk, input reset, input x, 
  output reg parity
); 

  reg state, nextstate;
  parameter S0 = 0, S1 = 1;

  always @(posedge clk or posedge reset) begin	// always block to update state 
    if (!reset)
      state <= S0;
    else
      state <= nextstate;
  end

  always @(state or x) begin   // always block to compute both output & next_state
    parity = 1'b0; 
    case(state)
      S0: if(x) begin
            parity = 1; 
            nextstate = S1;
          end else begin
            nextstate = S0;
          end
      S1: if(x) begin
            nextstate = S0;
          end
          else begin
            parity = 1; 
            nextstate = S1;
          end
      default : nextstate = S0; 

    endcase

  end

endmodule
  • 三段式Mealy机器的图示及其建模如下:

module mealy_3processes(input clk, input reset, input x, 
  output reg parity
); 

  reg state, nextstate;
  parameter S0 = 0, S1 = 1;

  always @(posedge clk or posedge reset)  // always block to update state 
    if (reset)
      state <= S0;
    else
      state <= nextstate;

  always @(state or x)	begin             // always block to compute output 
    parity = 1'b0;
    case(state)
      S0 : if(x)  parity = 1; 
           else   parity = 0; 
      S1 : if(!x) parity = 1;
           elsle  parity = 0;
    endcase 
  end

  always @(state or x) begin             // always block to compute nextstate 
    nextstate = S0; 
    case(state)
      S0: if(x)  nextstate = S1; 
          else   nextstate = S0; 
      S1: if(!x) nextstate = S1; 
          else   nextstate = S0; 
    endcase
  end 

endmodule

       状态分配可以使用独热码(one – hot code),二进制编码,格雷码以及其他编码。通常,综合工具将确定状态分配的编码,但用户也可以通过更改综合属性来强制特定编码,如下所示。状态分配编码将对状态寄存器中使用的位数产生影响;独热编码使用最多的位数,但解码非常快,二进制编码使用最少的位数,但解码较长。

二、使用三段式Mealy状态机的实现一个序列检测器

 2.1 实验要求

       Mealy状态机有一个输入(ain)和一个输出(yout)。 当且仅当接收到的1的总数可被3整除时,输出为1(提示:0也算被3整除,但是,在复位周期中不把计数器归为0,复位信号过后把计数器归0——参考模拟波形时间= 200)。

       设计一个testbench并通过behavioral simulation验证模型。 使用SW15作为时钟输入,SW0作为输入,BTNU按钮作为电路的复位输入,LED7:LED4上的1s计数和作为yout输出的LED0。 完成设计流程,生成比特流,并将其下载到Basys3或Nexys4 DDR板。验证功能。

 2.1 实验步骤

  1. 打开Vivado并创建一个空工程并命名为lab10_1。

  2. 创建并添加使用SW15作为时钟输入,SW0作为输入,BTNU按钮作为电路的复位输入,LED7:LED4上的1s计数和作为yout输出的LED0。

  3. 编写仿真文件来验证代码的正确

  4. 在工程中添加适当的管脚约束的XDC文件,并加入相关联的管脚,使用SW15作为时钟输入,SW0作为输入,BTNU按钮作为电路的复位输入,LED7:LED4上的1s计数和作为yout输出的LED0。

  5. 综合,实现设计。

  6. 生成比特流文件,下载到Nexys4开发板上,验证功能。

    参考代码和分析

    module lab10_1(input clk, input rst, input ain, 
      output reg [3:0]count, output reg yout
    );
    
      parameter s0=0, s1=1,s2=2; reg [1:0] state, nextstate; 
    
      always@(posedge clk or posedge rst) begin 
        if(rst) begin 
          state <= s0; 
          count <= 4’b0; 
        end else begin 
          state <= nextstate; 
          if(ain) count <= count + 1; 
        end 
      end
    
     always@(*) begin
       yout = 0;
       case(state)
         s0 : if(!ain) yout=1;         
         s2 : if(ain)  yout=1;         
       endcase
     end
    
     always@(*) begin
       case(state)
         s0:if(ain)
         nextstate=s1;
         else
         nextstate=s0;
         s1:if(ain)
         nextstate=s2;
         else
         nextstate=s1;
         s2:if(ain)
         nextstate=s0;
         else
          nextstate=s2;
        endcase
      end  
    endmodule
     
    
    

       米利型(Mealy)的输出是和当前状态以及输入都相关的,所以这里是这样的情况。但是如果是摩尔型的话输入只与当前状态相关,之后也会有介绍。

       摩尔型有限状态机(Moore FSM)型有限状态机的一般模型如下所示。 其输出由状态寄存器块生成。 使用当前输入和当前状态确定下一状态。 这里的状态寄存器也使用D触发器建模。 通常,Moore机器使用三个块来描述,其中一个块必须是顺序的,另外两个块可以使用always块或always和dataflow建模结构的组合来建模。    

  • 以下是使用Moore型有限状态机实现的奇偶校验器的状态图。与之关联模型如下所示。

module moore_3processes(input clk, input reset, input x, 
  output reg parity
); 

  reg state, nextstate;
  parameter S0=0, S1=1;

  always @(posedge clk or posedge reset) begin	// always block to update state 
    if (reset)
      state <= S0;
    else
      state <= nextstate;
  end

  always @(state) begin	// always block to compute output 
    case(state)
      S0 : parity = 0; 
      S1 : parity = 1;
      default : parity = S0;
    endcase
  end

  always @(state or x)	begin // always block to compute nextstate 
    nextstate = S0; 
    case(state)
      S0: if(x)  nextstate = S1; 
          else   nextstate = S0; 
      S1: if(!x) nextstate = S1;
          else   nextstate = S0;
      default : nextstate = S0;
    endcase
  end

endmodule

       在本例中,输出块很简单,可以使用dataflow建模构造进行建模。 可以使用以下代码代替always块。 您还需要将输出类型从reg更改为wire。

assign parity = (state == S0) ? 1'b0: 1'b1;
#使用三段式Moore状态机的实现一个序列检测器 
#实验要求Moore状态机有一个输入(ain)和一个输出(yout)。 
#当且仅当接收到的1的总数可被3整除时,输出为1(提示:0也算被3整除,但是,在复位周期中不把计数器归为0,复位信号过后把计数器归0——参考模拟波形时间= 200)。
#设计一个testbench并通过behavioral simulation验证模型。 使用SW15作为时钟输入,SW0作为输入,BTNU按钮作为电路的复位输入,
#LED7:LED4上的1s计数和作为yout输出的LED0。 
#完成设计流程,生成比特流,并将其下载到Basys3或Nexys4 DDR板。验证功能。

 2.2 实验步骤

  1. 打开Vivado并创建一个空工程并命名为lab10_2。

  2. 创建并添加使用SW15作为时钟输入,SW0作为输入,BTNU按钮作为电路的复位输入,LED7:LED4上的1s计数和作为yout输出的LED0。

  3. 编写仿真文件来验证代码的正确

  4. 在工程中添加适当的管脚约束的XDC文件,并加入相关联的管脚,使用SW15作为时钟输入,SW0作为输入,BTNU按钮作为电路的复位输入,LED7:LED4上的1s计数和作为yout输出的LED0。

  5. 综合,实现设计。

  • 生成比特流文件,下载到Nexys4开发板上,验证功能。

    参考代码和分析

    module lab10_2( input clk, input rst, input ain, 
      output reg [3:0] count, output reg yout
    );
    
      parameter s0=0, s1=1,s2=2; 
      reg [1:0] state, nextstate; 
    
      always@(posedge clk or posedge rst) begin 
        if(rst) begin 
          state <= s0; 
          count <= 4’b0; 
        end else begin 
          state <= nextstate; 
          if(ain) count <= count + 1; 
        end 
      end 
    
      always@(*) begin 
        case(state) 
          s0: yout = 1; 
          default : yout = 0; 
        endcase 
      end 
    
      always@(*) begin 
        case(state) 
          s0 : if(ain) nextstate = s1;   
               else    nextstate = s0; 
          s1 : if(ain) nextstate = s2; 
               else    nextstate = s1;  
          s2 : if(ain) nextstate = s0; 
               else    nextstate = s2; 
        endcase 
      end 
    
    endmodule

    摩尔型相较米利型输出的状态只与输入相关

三、扩展实验内容

 3.1 扩展实验1 使用三段式Moore状态机或者Mealy状态机实现一个序列检测器。

       Moore状态机有两个输入(ain [1:0])和一个输出(yout)。 除非出现以下输入序列之一,否则输出将从0开始并保持为常量值:

  1. 输入序列ain [1:0] = 01,00使输出变为0
  2. 输入序列ain [1:0] = 11,00使输出变为1
  3. 输入序列ain [1:0] = 10,00使输出切换。

    实验要求

    打开Vivado并创建一个空工程并命名为lab10_kuozhan1。设计一个testbench(类似于下面显示的波形)并通过behavioral simulation验证模型。 使用SW15作为时钟输入,SW1-SW0作为ain [1:0]输入,BTNU按钮作为电路的复位输入,LED0作为yout输出。 完成设计流程,生成比特流,并将其下载到Basys3或Nexys4 DDR板。 验证功能。
    仿真示意图如下:

 3.2 扩展实验2

    使用ROM设计一个特定的计数计数器(下面列出的计数序列)来开发一个Mealy状态机。

  • 实验要求

       打开Vivado并创建一个空工程并命名为lab10_kuozhan2。设计一个testbench并通过behavioral simulation验证模型。 使用SW15作为时钟输入,BTNU按钮作为电路的复位输入,LED2:LED0作为计数器的计数输出。 完成设计流程,生成比特流,并将其下载到Basys3或Nexys4 DDR板。 验证功能。
计数序列是: 000, 001, 011, 101, 111, 010 (repeat) 000, …

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

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

相关文章

Codeforces Round #837 (Div. 2)

A. Hossam and Combinatorics 题目链接&#xff1a;Problem - A - Codeforces 样例输入&#xff1a; 2 5 6 2 3 8 1 6 7 2 8 3 2 10样例输出&#xff1a; 2 4题意&#xff1a;给定一个有n个元素的数组&#xff0c;然后让我们求出有多少对(i,j)满足|a[i]-a[j]|max|a[p]-q[q]…

Hudi学习01 -- Hudi简介及编译安装

文章目录Hudi简介Hudi概述Hudi特性Hudi使用场景Hudi编译安装安装Maven编译hudi修改pom文件修改源码兼容hadoop3解决spark模块依赖的问题hudi编译命令Hudi简介 Hudi概述 Apache Hudi (Hadoop Upserts Delete and Incremental) 是下一代流数据湖平台。Apache Hudi 将核心仓库和…

并发编程中用到的几种常见锁

没有加锁而造成的数据竞争 任务&#xff1a;使用10个线程&#xff0c;同时对一个count加100000&#xff1b;最后我们期望的结果是100000&#xff1b; 实验代码&#xff1a; #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <ti…

git项目 拉项目 提交 上传 保姆级教程

git 项目拉取提交 下载git https://git-scm.com/ 拉取代码 打开需要存代码的位置 右键 git bash打开git客户端 输入命令 git clone [复制的地址]上传代码 修改代码 方法一&#xff1a;命令行 打开对应的文件夹&#xff0c;右键打开git bash 拉取最新代码&#xff08;选…

React学习07-React扩展知识

setState setState更新状态的2种写法: setState(stateChange, [callback])------对象式的setState stateChange为状态改变对象(该对象可以体现出状态的更改)callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用 setState(updater, [callback])-…

代码随想录算法训练营第九天(字符串)| 28. 实现 strStr(),459.重复的子字符串

代码随想录算法训练营第九天&#xff08;字符串&#xff09;| 28. 实现 strStr()&#xff0c;459.重复的子字符串 28. 实现 strStr() 因为KMP算法很难&#xff0c;大家别奢求 一次就把kmp全理解了&#xff0c;大家刚学KMP一定会有各种各样的疑问&#xff0c;先留着&#xff0…

Qt编写雷达模拟仿真工具2-自定义QGraphicsItem按钮

一、前言 雷达模拟仿真工具&#xff0c;整体结构采用的QGraphicsView框架&#xff0c;场景需要设计一个可点击的自定义按钮出来&#xff0c;在QGraphicsView中一切基础元素点都是基于QGraphicsItem&#xff0c;在QGraphicsItem类中我们可以看到它不继承自QObject&#xff0c;那…

25万美金奖励章鱼加速器2022冬季获胜团队!

全长 1427 字&#xff0c;预计阅读 6 分钟 作者&#xff1a;MiX 2022年12月21日&#xff0c;章鱼加速器2022年冬季 Web3 创业营圆满落幕&#xff0c;61个入营项目中有5个脱颖而出&#xff0c;获得「章鱼未来之星」称号&#xff0c;排名不分先后&#xff0c;他们分别是&#xf…

第五章. 可视化数据分析图表—Seaborn图表(折线图,直方图,条形图,散点图)

第五章. 可视化数据分析图 5.7 Seaborn图表 Seaborn是一个基于Matplotlib的高级可视化效果库&#xff0c;偏向于统计图表&#xff0c;主要针对的是数据挖掘和机器学习中的变量特征选取&#xff0c;相比Matplotlib&#xff0c;他的语法相对简单&#xff0c;但是具有一定的局限性…

Windows下安装oracle19c

oracle 19c 不支持 Windows 7 和 Windows 8 以及 Windows Server 2008&#xff08;GetOverlappedResultEx function 函数不支持 win7&#xff09;&#xff0c;支持 Windows 8.1 以上及 Windows Server 2012 1.下载地址&#xff1a; https://www.oracle.com/database/technolo…

Gnoppix Linux 22.12 发布

导读基于 Kali Linux 的 Linux 滚动发行版 Gnoppix 22.12 带来了 GNOME 43、Linux 内核 6.0 和新的升级。作为传统的现场 CD 发行版 Knoppix 项目的继承者&#xff0c;Gnoppix Linux 是专门为渗透测试和反向工程而设计的。它为网页应用安全和数字权利保护进行了优化。除了对安全…

DNA甲基化重编程为红梨中光诱导的花青素生物合成提供了见解

期刊&#xff1a;Plant Science 影响因子&#xff1a;5.363 发表时间&#xff1a;2022 样本类型&#xff1a;果皮 客户单位&#xff1a;南京农业大学 凌恩生物客户南京农业大学吴俊团队发表在《Plant Science》上的文章“DNA methylatio…

【Ctfer训练计划】——(七)

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

【数据结构】LinkedList与链表

作者&#xff1a;✿✿ xxxflower. ✿✿ 博客主页&#xff1a;xxxflower的博客 专栏&#xff1a;【数据结构】篇 语录&#xff1a;⭐每一个不曾起舞的日子&#xff0c;都是对生命的辜负。⭐ 文章目录✿1.ArrayList的缺陷✿2.链表2.1链表的概念及结构2.2链表的模拟实现MySingleLi…

aws eks 集群container runtime升级容器管理工具的切换

参考资料 https://cloud-atlas.readthedocs.io/zh_CN/latest/kubernetes/debug/crictl.htmlhttps://zhuanlan.zhihu.com/p/562014518 container runtime Low-Level和High-Level容器运行时。runc、lxc、lmctfy、Docker&#xff08;容器&#xff09;、rkt、cri-o。每一个都是为…

springboot simple (12) springboot RabbitMQ

这里首先简单的介绍了RabbitMQ &#xff0c;然后实现了springboot集成RabbitMQ &#xff0c;包含两个工程&#xff1a; 1 Producer 生产者 2 Consumer 消费者 1 RabbitMQ 简介 AMQP &#xff1a;Advanced Message Queue&#xff0c;高级消息队列协议。 RabbitMQ 是一个由 Erl…

智能大屏兴起,酷开科技赋能营销战略!

随着科技的发展&#xff0c;智能大屏的功能与技术都在日新月异的快速更迭&#xff0c;年轻消费群体也对大尺寸智能大屏表现出了特别的偏爱&#xff0c;以前说到看视频、网上购物、阅读书籍时&#xff0c;人们第一时间就会想到手机&#xff0c;但随着智能大屏的出现&#xff0c;…

商用设计素材库,设计师必备。

免费、商用设计素材网站。 1、菜鸟图库 https://www.sucai999.com/?vNTYxMjky站内平面海报、UI设计、电商淘宝、免抠、高清图片、样机模板等素材非常齐全。还有在线抠图、CDR版本转换功能&#xff0c;能有效的为设计师节省找素材时间&#xff0c;提高工作效率。网站素材都能免…

LeetCode链表经典题目(二)

1. LeetCode203. 移除链表元素 2. LeetCode707.设计链表 3. LeetCode206. 反转链表 4. LeetCode24. 两两交换链表中的节点​ 5. LeetCode19. 删除链表的倒数第 N 个结点 6. LeetCode面试题 02.07. 链表相交 7. LeetCode142. 环形链表 II​ 1. LeetCode203. 移除链表元素 …

基于同豪的道路桥梁设计方案如何实现数字化交付(web发布)

0序&#xff1a; 当下有部分设计人员除了使用Revit、Microstation之外也使用过程的同豪软件进行道路桥梁的BIM建模。如何对同豪的BIM模型进行数字化交付呢&#xff1f; 1数据导出为FBX 具体导出过程可以参考&#xff1a; 数据的导出只要按步骤导出就行&#xff0c;非常简单…