利用简单的有限状态机(FSM)来实现一个简单的LED流水灯

  有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。  有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说,除了输入部分和输出部分外,有限状态机还含有一组具有“记忆”功能的寄存器,这些寄存器的功能是记忆有限状态机的内部状态,它们常被称为状态寄存器。在有限状态机中,状态寄存器的的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑又可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。

以下是用FSM自由控制的led,   module led_test(clk,led_out);
    input clk;
    output reg[3:0] led_out;

    reg[3:0] state=4‘b0000;
    reg[31:0] timer=32‘d0;

    parameter state_0=4‘b0000;
    parameter state_1=4‘b0001;
    parameter state_2=4‘b0010;
    parameter state_3=4‘b0100;
    parameter state_4=4‘b1000;

    always@(posedge clk)
    begin

      case(state)

       state_0:
        if(timer>=32‘d9999_9999)
           begin
              state<=state_1;
               led_out<=state_1;
               timer<=32‘d0;
           end
        else
           begin
                  state<=state;
                  led_out<=led_out;
                  timer=timer+32‘d1;
           end

           state_1:
        if(timer>=32‘d9999_9999)
           begin
              state<=state_2;
               led_out<=state_2;
               timer<=32‘d0;
           end
        else
           begin
                  state<=state;
                  led_out<=led_out;
                  timer=timer+32‘d1;
           end

        state_2:
        if(timer>=32‘d9999_9999)
           begin
              state<=state_3;
               led_out<=state_3;
               timer<=32‘d0;
           end
        else
           begin
                  state<=state;
                  led_out<=led_out;
                  timer=timer+32‘d1;
           end

    state_3:
        if(timer>=32‘d9999_9999)
           begin
              state<=state_4;
               led_out<=state_4;
               timer<=32‘d0;
           end
        else
           begin
                  state<=state;
                  led_out<=led_out;
                  timer=timer+32‘d1;
           end

            state_3:
        if(timer>=32‘d9999_9999)
           begin
              state<=state_4;
               led_out<=state_4;
               timer<=32‘d0;
           end
        else
           begin
                  state<=state;
                  led_out<=led_out;
                  timer=timer+32‘d1;
           end

    state_4:
        if(timer>=32‘d9999_9999)
           begin
              state<=state_0;
               led_out<=state_0;
               timer<=32‘d0;
           end
        else
           begin
                  state<=state;
                  led_out<=led_out;
                  timer=timer+32‘d1;
           end

           default:
           state<=state_0;

      endcase
    end

endmodule

以下是用一个按键来控制LED流动的开始,当按下按键10s后LED会开始流动。
module practice(clk,key,led);
    input  clk;          //时钟输入 50Mhz
    input  key;    //按键
    output reg[3:0] led;   //4位LED
    reg[31:0] count=32‘d0;          //一个计数器,如果编译软件不优化,将生成32个D触发器

     reg[2:0] state=3‘d0;
     parameter state_0=3‘d0;
     parameter state_1=3‘d1;
     parameter state_2=3‘d2;
     parameter state_3=3‘d3;
     parameter state_4=3‘d4;

     reg[31:0] key_count;    //按键按下的时间控制寄存器

     always@(posedge clk)
     begin

     case(state)
     state_0:
     begin
     if(key == 1‘b0)
     key_count <= key_count + 32‘d1;
     else
     key_count <= 32‘d0;
     if(key_count >= 32‘d49_999_999)
     state <= state_1;
     else
     state <= state;
     led <= 4‘b0000;
     end

      state_1:
       begin
       led <= 4‘b0001;
       if(count == 32‘d4999_9999)
       begin
       state <= state_2;//1秒后进入下一个状态
       count <= 32‘d0;
       end
       else
      begin
      state <= state;
      count <= count + 32‘d1;
      end
      end

      state_2:
       begin
       led <= 4‘b0010;
       if(count == 32‘d9999_9999)
       begin
       state <= state_3;//1秒后进入下一个状态
       count <= 32‘d0;
       end
       else
      begin
      state <= state;
      count <= count + 32‘d1;
      end
      end

      state_3:
       begin
       led <= 4‘b0100;
       if(count == 32‘d1_4999_9999)
       begin
       state <= state_4;//1秒后进入下一个状态
       count <= 32‘d0;
       end
       else
      begin
      state <= state;
      count <= count + 32‘d1;
      end
      end

      state_4:
       begin
       led <= 4‘b1000;
       if(count == 32‘d1_9999_9999)
       begin
       state <= state_1;//1秒后进入下一个状态
       count <= 32‘d0;
       end
       else
      begin
      state <= state;
      count <= count + 32‘d1;
      end
      end

     default: //最好不要忘了写default,写别是组合逻辑使用case,不写会有大麻烦
     state <= state_1;

    endcase
end
endmodule 
时间: 2024-12-11 15:06:28

利用简单的有限状态机(FSM)来实现一个简单的LED流水灯的相关文章

第一个FPGA工程—LED流水灯

这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始入门FPGA开发了. 1.1.1.电路说明 1.1.2.新建工程 第一步:从开始菜单启动Quartus II 13.1(64 bit) ,如下图. 第二步:菜单栏选择File->New Project Wizard,新建工程. 第三步:弹出新建工程对话框,点击Next,下一步. 第三步:如下图,依次

在Linux下利用替换函数(exec函数家族)写一个简单的myshell

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <unistd.h> void swap(char **p,char **q) { char *tmp=*p; *p=*q; *q=tmp; } int main(int argc,char *argv[]) { pid_t id; while(1){ printf(&

jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)

JMeter的安装:在网上下载,在下载后的zip解压后,在bin目录下找到JMeter.bat文件,双击就可以运行JMeter. http://jmeter.apache.org/ 在使用jmeter前要先下载jdk包,配置java环境.(参见Java环境配置教程) 配置完成后在运行窗口检查一下java -version确定java环境配置完成. 一.利用badboy进行自动脚本录制 下载BadboyInstaller-2.2.5.exe 并安装 下载地址:http://download.csd

利用node的http模块创建一个简单的http服务器

成功搭建node环境后,利用node.js的http请求创建一个简单的HTTP服务器. 1.在你的项目的文件夹创建一个app文件,同时在文件夹app中创建app.js的node.JS文件.用任意编辑器都可以 2.在终端打开node app.js 指令,输入正确后悔看到屏幕上面输出信息:Server running at http://127.0.0.1:1337,表明已经成功启用本地的1337的接口http服务器 3.打开任意的浏览器,输入server服务器地址:http://127.0.0.1

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe. 假设 Visual Studio 2005 的安装路径为“D:\Program

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)

[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe. 假设 Visual Studio 2005 的安装路径为“D:\Program

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器  大 | 中 | 小  [ 2011-3-30 08:40 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.zyan.cc/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 L

使用PyQt5编写一个简单的GUI程序

我做Python窗口界面编程时,经常使用PyQt进行设计.这里简单叙述一下使用PyQt5制作一个简单的图形界面的流程 PyQt的简介以及开发环境的搭建在此不多赘述. 1.       打开Qt Designer,新建一个Dialog Without Buttons 2.       从左侧的Widget Box拖入一个Label,一个Text和一个Button 3.       双击控件可以改变其上的文本 4.       保存文件,命名为test.ui 5.       使用pyuic5将.u

Python学习第三天(一个简单制作导入模块)

Python一个简单的模块制作和导入 一个简单的模块 [[email protected] python]# cat my.py name = 'I am wuang!' 导入模块 >>> import my >>> print my.name I am wuang! 直接导入模块属性名字 >>> from my import name >>> print name I am wuang!