利用简单的有限状态机(FSM)来实现一个简单的LED流水灯
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说,除了输入部分和输出部分外,有限状态机还含有一组具有“记忆”功能的寄存器,这些寄存器的功能是记忆有限状态机的内部状态,它们常被称为状态寄存器。在有限状态机中,状态寄存器的的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑又可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。 以下是用FSM自由控制的led,
module led_test(clk,led_out);
input clk;
output reg[:] led_out; reg[:] state='b0000;
reg[:] timer='d0; parameter state_0='b0000;
parameter state_1='b0001;
parameter state_2='b0010;
parameter state_3='b0100;
parameter state_4='b1000; always@(posedge clk)
begin case(state) state_0:
if(timer>='d9999_9999)
begin
state<=state_1;
led_out<=state_1;
timer<='d0;
end
else
begin
state<=state;
led_out<=led_out;
timer=timer+'d1;
end state_1:
if(timer>='d9999_9999)
begin
state<=state_2;
led_out<=state_2;
timer<='d0;
end
else
begin
state<=state;
led_out<=led_out;
timer=timer+'d1;
end state_2:
if(timer>='d9999_9999)
begin
state<=state_3;
led_out<=state_3;
timer<='d0;
end
else
begin
state<=state;
led_out<=led_out;
timer=timer+'d1;
end state_3:
if(timer>='d9999_9999)
begin
state<=state_4;
led_out<=state_4;
timer<='d0;
end
else
begin
state<=state;
led_out<=led_out;
timer=timer+'d1;
end state_3:
if(timer>='d9999_9999)
begin
state<=state_4;
led_out<=state_4;
timer<='d0;
end
else
begin
state<=state;
led_out<=led_out;
timer=timer+'d1;
end state_4:
if(timer>='d9999_9999)
begin
state<=state_0;
led_out<=state_0;
timer<='d0;
end
else
begin
state<=state;
led_out<=led_out;
timer=timer+'d1;
end default:
state<=state_0; endcase
end endmodule 以下是用一个按键来控制LED流动的开始,当按下按键10s后LED会开始流动。
module practice(clk,key,led);
input clk; //时钟输入 50Mhz
input key; //按键
output reg[:] led; //4位LED
reg[:] count='d0; //一个计数器,如果编译软件不优化,将生成32个D触发器 reg[:] state='d0;
parameter state_0='d0;
parameter state_1='d1;
parameter state_2='d2;
parameter state_3='d3;
parameter state_4='d4; reg[:] key_count; //按键按下的时间控制寄存器 always@(posedge clk)
begin case(state)
state_0:
begin
if(key == 'b0)
key_count <= key_count + 'd1;
else
key_count <= 'd0;
if(key_count >= 'd49_999_999)
state <= state_1;
else
state <= state;
led <= 'b0000;
end state_1:
begin
led <= 'b0001;
if(count == 'd4999_9999)
begin
state <= state_2;//1秒后进入下一个状态
count <= 'd0;
end
else
begin
state <= state;
count <= count + 'd1;
end
end state_2:
begin
led <= 'b0010;
if(count == 'd9999_9999)
begin
state <= state_3;//1秒后进入下一个状态
count <= 'd0;
end
else
begin
state <= state;
count <= count + 'd1;
end
end state_3:
begin
led <= 'b0100;
if(count == 'd1_4999_9999)
begin
state <= state_4;//1秒后进入下一个状态
count <= 'd0;
end
else
begin
state <= state;
count <= count + 'd1;
end
end state_4:
begin
led <= 'b1000;
if(count == 'd1_9999_9999)
begin
state <= state_1;//1秒后进入下一个状态
count <= 'd0;
end
else
begin
state <= state;
count <= count + 'd1;
end
end default: //最好不要忘了写default,写别是组合逻辑使用case,不写会有大麻烦
state <= state_1; endcase
end
endmodule
利用简单的有限状态机(FSM)来实现一个简单的LED流水灯的更多相关文章
- 第一个FPGA工程—LED流水灯
这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- jmeter压力测试的简单实例+badboy脚本录制(一个简单的网页用户登录测试的结果)
JMeter的安装:在网上下载,在下载后的zip解压后,在bin目录下找到JMeter.bat文件,双击就可以运行JMeter. http://jmeter.apache.org/ 在使用jmeter ...
- 利用COOKIE保存历史浏览商品的一个简单思路
<?php //如是COOKIE 里面不为空,则往里面增加一个商品ID if (!empty($_COOKIE['SHOP']['history'])){ //取得COOKIE里面的值,并用逗号 ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- 鸿蒙系统应用开发之JS实现一个简单的List
在之前的文章鸿蒙应用开发之怎么更好的远程连接手表模拟器做调试里我运行了一个穿戴设备的应用,利用JS UI实现了一个最简单的HelloWorld. 今天我打算在智慧屏设备上利用豆瓣音乐的接口数据实现一个 ...
- 分享一个简单易用的RPC开源项目—Tatala
http://zijan.iteye.com/blog/2041894 这个项目最早(2008年)是用于一个网络游戏的Cache Server,以及一个电子商务的Web Session服务.后来不断增 ...
- (2)自己写一个简单的servle容器
自己写一个简单的servlet,能够跑一个简单的servlet,说明一下逻辑. 首先是写一个简单的servlet,这就关联到javax.servlet和javax.servlet.http这两个包的类 ...
- 使用PyQt5编写一个简单的GUI程序(pyside 有 pyside-uic 把ui文件转成py文件,pyside-rcc 把qrc文件转成 py文件导入就行了)
我做Python窗口界面编程时,经常使用PyQt进行设计.这里简单叙述一下使用PyQt5制作一个简单的图形界面的流程 PyQt的简介以及开发环境的搭建在此不多赘述. 1. 打开Qt Des ...
随机推荐
- Kali Linux安装AWVS漏扫工具
Acunetix是全球排名前三的漏洞发现厂商,其全称(Acunetix Web Vulnerability Scanner)AWVS是业内领先的网络漏洞扫描器,其被广泛赞誉为包括最先进的SQL注入和X ...
- element-ui组件dialog遇到form
Vue.js似乎成了一种潮流. UI框架element-ui也跟着成了一种潮流,不过得承认,至少我个人还是非常认可的,element-ui做的是真不错. 用到element-ui,那么在dialog中 ...
- Scala学习十三——集合
一.本章要点 所有集合都扩展自Iterable特质; 集合有三大类,分别为序列,集和映射; 对于几乎所有集合类,Scala都同时提供可变和不可变的版本; Scala列表要么是空的,要么拥有一头一尾,其 ...
- Jmeter4.0---- 修改jmeter源代码(18)
1.说明 jmeter本身功能很强大,但是在使用的时候我们会发现有些想法jmeter无法帮我们实现,这个时候就需要我们细节去修改一下它的源代码,来满足我们的需求. * 仅供参考 2.步骤 第一步: j ...
- vue.js devtools图标不亮
第一步:打开谷歌扩展程序 第二步:设置允许访问文件地址
- 浏览器本质上是解析器javascript
浏览器本质上是解析器.用于将符合W3C的标记序列解析并还原到编码人员希望用户看到的呈现状态.实际上,Word本身也可以看作是一个文档文件浏览器,acdsee是一个图像文件解析器(浏览器).HTML文件 ...
- vue组件常用传值
一.使用Props传递数据 在父组件中使用儿子组件 <template> <div> 父组件:{{mny}} <Son1 :mny="mny"&g ...
- Java基础加强-注解
/*注解(Annotation)*/(注解相当于一个特殊的类,注解类@interface A) 了解注解及java提供的几个基本注解 1. @SuppressWarnings 指示应该在注释元素(以及 ...
- 智能指针原理及实现(2)unique_ptr
只允许基础指针的一个所有者. 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr). 替换已弃用的 auto_ptr. 相较于 boost::s ...
- 调查问卷WebApp
1. 效果演示 2. 主要知识点 使用slot分发内容 动态组件 组件通信 实例的生命周期 表单 3. 遇到的问题 bus 通信 第一次 $on 监听不到 // 解决bus 第一次通信 $on 监听不 ...