0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog状态机+设计实例

FPGA学习笔记 来源:FPGA学习笔记 作者:FPGA学习笔记 2024-02-12 19:07 次阅读

verilog中状态机的一种很常用的逻辑结构,学习和理解状态机的运行规律能够帮助我们更好地书写代码,同时作为一种思想方法,在别的代码设计中也会有所帮助。

一、简介

在使用过程中我们常说的是有限状态机(Finite-State Machine,FSM),简称为状态机,表示在有限个状态以及这些状态之间的转移和动作等行为的数学模型。

二、分类

在verilog中常使用的状态机可以分为两类,分别是Moore(摩尔)状态机和Mealy(米利)状态机。两种状态机的主要区别在于****Moore状态机的输出只与当前状态有关,与当前输入无关;Mealy状态机的输出不仅与当前状态有关,还与当前的输入信号有关

三、设计实例

在状态机设计的过程中推荐使用三段式设计,下面是三段式状态机的基本结构:

(1)状态机第一段,时序逻辑,非阻塞赋值,传递状态机的状态

(2)状态机第二段,组合逻辑,阻塞赋值 ,根据当前状态和当前输入, 确定下一个状态机的状态

(3)状态机第三段,时序逻辑,非阻塞赋值,确定输出信号

下面介绍一个简单的状态机设计实例:一个学生,一周七天周一到周五需要上学,单周周六巩固复习这一周的知识,周日出去玩;双周周六周日出去玩。可以得到状态转移图如下:
image.png

设计代码如下:

`timescale 1ns / 1ps
 ​
 module FSM(
     input        clk,
 input        rst_n,
 input  [2:0] week,
 input        odd_even,
 output [1:0] activity
 );
 ​
 parameter learn = 2'd0;
 parameter review= 2'd1;
 parameter play  = 2'd2;
 ​
 reg [1:0] st_cur;
 reg [1:0] st_next;
 ​
 always @ (posedge clk or negedge rst_n)begin //Update the current status
     if(!rst_n)begin
     st_cur <= learn;
 end
 else begin
     st_cur <= st_next;
 end
 end
 ​
 always @(*)begin //Determine the next status
     case(st_cur)
     learn:
     case(week)
     3'd5: begin
     if(odd_even)
     st_next = review;
     else
     st_next = play;
                 end
     3'd6:begin
         st_next = play;
 end
 3'd7:begin
         st_next = learn;
 end
 default:st_next = learn;
 endcase
 review: st_next = play;
 play  :
     case(week)
     3'd7: st_next = learn;
 default:    st_next = play;
 endcase
 default: st_next = st_next;
 endcase
 end
 ​
 reg [1:0] activity_r;
 ​
 always @(posedge clk or negedge rst_n)begin //Output signal
     if(!rst_n)
     activity_r <= 2'd0;
 else
         activity_r <= st_next;
 end
 ​
 assign activity = activity_r;
 ​
 endmodule

仿真代码如下:

`timescale 1ns / 1ps
 ​
 module FSM_tb;
     reg        clk;
 reg        rst_n;
 reg  [2:0] week;
 reg        odd_even;
 wire [1:0] activity;
 initial begin
     clk      <= 1'b0;
     rst_n    <= 1'b0;
     odd_even <= 1'b0;
     week     <= 3'd1;
     #10
     rst_n <= 1'b1;
 end
 always #10
     clk = ~clk;
 always @(posedge clk)begin
     week <= week + 3'd1;
     if(week == 3'd7)begin
         odd_even <= ~odd_even;
         week     <= 3'd1;
     end
 end
 ​
 FSM fsm_inst(
     .clk(clk),
     .rst_n(rst_n),
     .week(week),
     .odd_even(odd_even),
     .activity(activity)
 );
 
 endmodule

仿真结果如下图所示:

image.png

对状态机的理解需要大量的实际操作,孰能生巧,在我学习的过程中老师曾要求我们用状态机写 万年历 ,对于感兴趣的同学来说也可以进行尝试。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110113
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27542
收藏 人收藏

    评论

    相关推荐

    状态机编程实例-状态表法

    上篇文章,使用嵌套switch-case法的状态机编程,实现了一个炸弹拆除小游戏。本篇,继续介绍状态机编程的第二种方法:状态表法,来实现炸弹拆除小游戏的状态机编程。
    的头像 发表于 06-20 09:05 2077次阅读
    <b class='flag-5'>状态机</b>编程<b class='flag-5'>实例</b>-<b class='flag-5'>状态</b>表法

    状态机编程实例-面向对象的状态设计模式

    本编介绍了状态机编程的第3种方法——面向对象的状态设计模式,通过C++的继承特性,以及类指针,实现炸弹拆除小游戏中的状态机功能。
    的头像 发表于 06-28 09:04 1524次阅读
    <b class='flag-5'>状态机</b>编程<b class='flag-5'>实例</b>-面向对象的<b class='flag-5'>状态</b>设计模式

    verilog状态机问题

    波形仿真时verilog 写的状态机被综合掉,编译没有错误,状态转移也没错,什么原因可能导致这种问题呢。
    发表于 10-05 11:31

    状态机实例(VHDL源代码)

    状态机实例(VHDL源代码):
    发表于 05-27 10:27 59次下载
    <b class='flag-5'>状态机</b><b class='flag-5'>实例</b>(VHDL源代码)

    状态机举例

    状态机举例 你可以指定状态寄存器和状态机状态。以下是一个有四种状态的普通状态机。 // Th
    发表于 03-28 15:18 987次阅读

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 0次下载

    基于有限状态机的工控系统软件设计

    本文详 细论述了高速状态机的错步问题以及控制层中状态机状态划分问题,结合具体的应用实例,给出了基于状态机的实现方法。
    发表于 03-22 15:48 3次下载

    有限状态机的建模与优化设计

    本文提出一种优秀 、高效的 Verilog HDL 描述方式来进行有限状态机设计 介绍了 有限状态机的建模原则 并通过一个可综合的实例 验证了 该方法设计的有限
    发表于 03-22 15:19 1次下载

    状态机概述 如何理解状态机

    本篇文章包括状态机的基本概述以及通过简单的实例理解状态机
    的头像 发表于 01-02 18:03 1w次阅读
    <b class='flag-5'>状态机</b>概述  如何理解<b class='flag-5'>状态机</b>

    使用verilog HDL实现状态机8位流水灯的程序和工程文件免费下载

    本文档的主要内容详细介绍的是使用verilog HDL实现状态机8位流水灯的程序和工程文件免费下载。
    发表于 10-16 16:20 23次下载
    使用<b class='flag-5'>verilog</b> HDL实现<b class='flag-5'>状态机</b>8位流水灯的程序和工程文件免费下载

    FPGA:状态机简述

    本文目录 前言 状态机简介 状态机分类 Mealy 型状态机 Moore 型状态机 状态机描述 一段式
    的头像 发表于 11-05 17:58 7410次阅读
    FPGA:<b class='flag-5'>状态机</b>简述

    Verilog设计过程中状态机的设计方法

    “本文主要分享了在Verilog设计过程中状态机的一些设计方法。 关于状态机 状态机本质是对具有逻辑顺序或时序顺序事件的一种描述方法,也就是说具有逻辑顺序和时序规律的事情都适用
    的头像 发表于 06-25 11:04 2619次阅读

    如何在Verilog中创建有限状态机

    本文描述了有限状态机的基础知识,并展示了在 Verilog 硬件描述语言中实现它们的实用方法。
    的头像 发表于 04-26 16:20 3429次阅读
    如何在<b class='flag-5'>Verilog</b>中创建有限<b class='flag-5'>状态机</b>

    Verilog状态机的类型

    有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
    的头像 发表于 06-01 15:23 1884次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>状态机</b>的类型

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 9600次阅读