有限状态机

写RTL的时候,实现一个功能的时候有很多种方法

  1. 将系统划分为多个状态,状态之间有状态的转移,第一步,第二步......形成有限状态机
  2. 流水线技术设计,从输入到输出有多个步骤,多个步骤可以并行执行

    有限状态机,状态是有限的,比如8个状态,16个状态等,在进行设计的时候,状态机的状态不要太多,状态超过10个,就会造成设计复杂度和验证复杂度都变高.

有限状态机分类

  1. Moore FSM

    输出只与当前的状态有关,与输入没有关系
  2. Mealy FSM

    输出不仅与当前的状态有关,还与输入有关

Moore FSM-设计自动售货机

分析输入输出信号

  • 自动售货机,输入的就是硬币,输出的是饮料和找零 (确定输入,输出)

  • 假设饮料只有一种价格2.5元,输入的零钱只有一元和五角(两种状态,用1bit表示),找零的情况只有两种0元和5角(用1bit表示)(确定输出输出的状态,用几位的信号表示)

定义接口

  • 状态机要存储一些状态,肯定会有一些寄存器,会有时钟和复位信号

  • 在设计一个模块的时候,最先确定输入输出的端口和位宽以及时序

定义时序

  • 输入的一元和五角不能同时为1(确定输入的约束)

内部实现--画出状态转移图

要存储当前已经存储了多少钱,初始状态时0,可以收到1元和5角

  • IDLE就是当前系统是空闲状态,没有收到任何的投币

  • 这是一个Moore类型的有限状态机,输出只与当前的状态有关

    Moore有限状态机电路特点
  1. 输入与当前的状态有关,所以需要一个寄存器存储当前的状态
  2. 寄存器存储的状态输入给组合逻辑之后,进行输出
  3. 输入与当前的状态值,经过组合逻辑之后,输入给寄存器
  4. 时序清晰,输入和输出,没有一条直接的组合逻辑路径;如果输入经过组合逻辑,没有经过寄存器,直接输出,这样的设计不好;因为不知道周围环境的组合逻辑的时序是多少

Code

module drink_status_moore(
input clk,
input reset,
input half,
input one,
output out,
output cout
);
parameter [2:0] s0 = 3'b000,
s1 = 3'b001,
s2 = 3'b010,
s3 = 3'b011,
s4 = 3'b100,
s5 = 3'b101,
s6 = 3'b110; //定义6个状态
reg [2:0] curr_state; //当前状态 CS
reg [2:0] next_state; //下一个状态 NS reg定义的信号不一定是寄存器 //第一段:声明一个寄存器,state transfer
always @ (posedge clk ,negedge reset) begin
if(~reset)
curr_state <= s0; //这里时钟来了之后,就寄存器传输,寄存器功耗比较大,需要给寄存器传输添加条件
else
curr_state <= #1 next_state;
end
//第二段,根据条件写出中间状态转移
always @ (curr_state,half,one) begin
case(curr_state)
s0:begin
if(half) next_state = s1; //如果两个投币口,就会出现问题,一次投入可能为1.5元,所以要给输入添加约束
else if(one) next_state = s2; //文件和文件之间需要进行一些约束
else next_state = S0;
end
s1:begin
if(half) next_state = s2;
else if(one) next_state = s3;
else next_state = S1;
end
s2:begin
if(half) next_state = s3;
else if(one) next_state = s4;
else next_state = S2;
end
s3:begin
if(half) next_state = s4;
else if(one) next_state = s5;
else next_state = S3;
end
s4:begin
if(half) next_state = s5;
else if(one) next_state = s6;
else next_state = S4;
end
s5:begin
next_state = s0;
end
s6:begin
next_state = s0;
end
default: next_state = s0;
end
//第三段,写出输出
assign out = (curr_state == s5) || (curr_State = s6) ? 1:0;
assign cout = (curr_state == s6) ? 1:0;
endmodule

FSM 三段式的书写方式

mealy FSM-自动售货机

  • 相当于在当前状态,考虑之后输入的状态
  • 输入经过组合逻辑之后直接得到输出

module drink_status_moore(
input clk,
input reset,
input half,
input one,
output out,
output cout
);
parameter [2:0] s0 = 3'b000,
s1 = 3'b001,
s2 = 3'b010,
s3 = 3'b011,
s4 = 3'b100; //定义6个状态,变量名需要更加具有含义 reg [2:0] curr_state; //当前状态 CS
reg [2:0] next_state; //下一个状态 NS reg定义的信号不一定是寄存器 //第一段:声明一个寄存器,state transfer
always @ (posedge clk ,negedge reset) begin
if(~reset)
curr_state <= s0; //这里时钟来了之后,就寄存器传输,寄存器功耗比较大,需要给寄存器传输添加条件
else
curr_state <= #1 next_state;
end
//第二段,根据条件写出中间状态转移
always @ (*) begin
case(curr_state)
s0:begin
if(half) next_state = s1; //如果两个投币口,就会出现问题,一次投入可能为1.5元,所以要给输入添加约束
else if(one) next_state = s2; //文件和文件之间需要进行一些约束
else next_state = S0;
end
s1:begin
if(half) next_state = s2;
else if(one) next_state = s3;
else next_state = S1;
end
s2:begin
if(half) next_state = s3;
else if(one) next_state = s4;
else next_state = S2;
end
s3:begin
if(half) next_state = s4;
else if(one) next_state = s0;
else next_state = S3;
end
s4:begin
if(half) next_state = s0;
else if(one) next_state = s0;
else next_state = S4;
end
default: next_state = s0;
endcase
end
//第三段,写出输出
assign out = ((curr_state == s4) & (half | one)) ? 1:
((curr_state == s3) & (one)) ? 1 : 0;
assign cout = (curr_state == s4) & (one) ? 1 : 0;
endmodule

FSM有限状态机的设计步骤

  1. 接口定义(信号\位宽\约束)
  2. 状态定义和编码
  3. 状态转换图
  4. 按照三段式风格实现RTL代码
  5. 编写Testbench
  6. 使用QuestaSim进行编译和仿真
  7. 通过波形工具查看激励\状态信号和输出信号
  • Moore机输出只与当前状态有关
  • Mealy输出不仅与当前的状态有关,还与当前的输入有关



状态机的电路逻辑图

FSM要注意的问题

  1. case语句,要将所有的case列全
  2. 使用default语句还原状态;如果不写default,就需要写够所有可能

序列检测器

  • 输入就是1bit的x,输出的y也是1bity
  • 定义当前的状态,存储之前存储的序列是怎样的状态,初始为IDLE,中间状态可能会出现中间状态
  • IDLE在定义的时候,检测的序列是从1开始的,IDLE可以直接设计为初始值为1,中间状态出现01,10等不对的状态,可以取消掉





module seq(in,out,clk,reset,state);
input in;
input clk;
input reset;
output out;
output [2:0] state; reg [2:0] curr_state;
reg [2:0] next_state; parameter [2:0] s0 = 3'b000,
s1 = 3'b001,
s2 = 3'b010,
s3 = 3'b011,
s4 = 3'b100,
s5 = 3'b101,
s6 = 3'b110,
s7 = 3'b111; // 定义寄存器
always @ (posedge clk , negedge reset)
begin
if(~reset)
curr_state <= S0;
else
curr_state <= next_state;
end // 写状态转移
always @ (in,curr_state)
begin
case(curr_state)
s0 : begin
if(in == 0) next_state <= s0;
else next_state <= s1;
end
s1 : begin
if(in == 0) next_state <= s0;
else next_state <= s2;
end
s2 : begin
if(in == 0) next_state <= s0;
else next_state <= s3;
end
s3 : begin
if(in == 0) next_state <= s4;
else next_state <= s3;
end
s4 : begin
if(in == 0) next_state <= s5;
else next_state <= s1;
end
s5 : begin
if(in == 0) next_state <= s0;
else next_state <= s6;
end
s6 : begin
if(in == 0) next_state <= s7;
else next_state <= s2;
end
s7 : begin
if(in == 0) next_state <= s0;
else next_state <= s1;
end
default: next_state <= s0;
endcase
end // 输出
assign out = (curr_state == s7) ? 1 : 0 ;
endmodule

11-verilog-有限状态机的更多相关文章

  1. verilog语法学习目录

    verilog语法实例学习(1) Verilog中的注释 Verilog中的信号 标识符 信号的值 Verilog中的数字 Verilog中的参数 verilog语法实例学习(2) 线网类型 变量类型 ...

  2. 跟着我从零开始入门FPGA(一周入门XXOO系列)-1、Verilog语法

    (本连载共七部分,这是第一部分) 作者:McuPlayer2013   (EETOP FPGA版块版主) 原帖地址:http://bbs.eetop.cn/thread-385362-1-1.html ...

  3. Linux基础命令列表

    命令列表 A alias apt apt-get arp -n -s arping ab B bc basename bash -n -x bzip2 bunzip2 bzcat blkid brct ...

  4. IC设计基础

    一 前言 这一周连续两场线下面试,紧接着又是微信视频面试,从连续三天的面试中,收获颇丰! 存在的问题: 一是对项目细节模糊: 二是IC基础知识薄弱: 具体表现是,在面试过程中,如被问到DDR3和千兆以 ...

  5. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  6. verilog语法实例学习(11)

    同步时序电路的一般形式 时序电路由组合逻辑以及一个或多个触发器实现.一般的架构如下图所示:W为输入,Z为输出,触发器中存储的状态为Q.在时钟信号的控制下,触发器通过加在其输入端的组合逻辑输入,使得电路 ...

  7. Verilog学习笔记简单功能实现(三)...............同步有限状态机

    在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...

  8. 有限状态机FSM(自动售报机Verilog实现)

    有限状态机FSM(自动售报机Verilog实现) FSM 状态机就是一种能够描述具有逻辑顺序和时序顺序事件的方法. 状态机有两大类:Mealy型和Moore型. Moore型状态机的输出只与当前状态有 ...

  9. Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则

    因为大多数的FPGA内部的触发器数目相当多,又加上独热码状态机(one hot code machine)的译码逻辑最为简单,所以在FPGA实现状态机时,往往采用独热码状态机(即每个状态只有一个寄存器 ...

  10. verilog学习笔记(4)_有限状态机

    有限状态机: 有限状态机是由寄存器组和组合逻辑构成的硬件时序电路: - 其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态: - 究竟转 ...

随机推荐

  1. 初次认识 Git (v2.x)

    什么是版本控制? 版本控制,也称为源代码控制,是一种跟踪和管理软件代码变更的实践.版本控制系统是软件工具,可帮助软件团队管理源代码随时间推移而发生的变更.随着开发环境的加速,版本控制系统可以帮助软件团 ...

  2. NetSuite 开发日记 —— 事务处理行限制

    一.创建行限制 在 NetSuite 中处理事务时,一次可访问的记录.事务处理或数据行数限制为 10,000.除非另有说明,此限制适用于所有交易类型.超过 1,000 行可能会对 Netsuite 的 ...

  3. IIS通过ARR实现负载均衡

    一.实现整体方式介绍 项目中部署在windows服务器上的项目,需要部署负载均衡,本来想用nginx来配置的,奈何iis上有几个项目,把80端口和443端口占用了,nginx就用不了了(因为通过域名访 ...

  4. CUDA C编程权威指南:1-基于CUDA的异构并行计算

      什么是CUDA?CUDA(Compute Unified Device Architecture,统一计算设备架构)是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优点,主要用来 ...

  5. 神经网络入门篇:深度学习和大脑的关联性(What does this have to do with the brain?)

    深度学习和大脑的关联性 开始讲故事(手动狗头) 深度学习和大脑有什么关联性吗? 关联不大. 那么为什么会说深度学习和大脑相关呢? 当你在实现一个神经网络的时候,那些公式是你在做的东西,你会做前向传播. ...

  6. 架构解读丨Volcano作业资源预留设计原理

    摘要:本文重点讲解了基于v1.1.0的目标作业资源预留特性的设计和最佳实践.讲解过程中,全面介绍了特性设计过程中的考量因素和算法设计. 资源预留(Reservation)是批处理系统的一类常见需求,也 ...

  7. 跟我学Python图像处理丨5种图像阈值化处理及算法对比

    摘要:本篇文章主要讲解Python调用OpenCV实现图像阈值化处理操作,包括二进制阈值化.反二进制阈值化.截断阈值化.反阈值化为0.阈值化为0. 本文分享自华为云社区<[Python图像处理] ...

  8. centos8 nginx server root指向自定义目录如(/data/www),访问报403 404,所有文件用户组为root 权限为755

    centos8 yum 自定义安装的nginx,修改nginx默认默认目录,指向自定义的目录 /data/www,访问报404,所有文件用户组为root 权限为755 nginx 以user 为ngi ...

  9. Seal梁胜:近水楼台先得月,IT人员应充分利用AI解决问题

    2023年9月2日,由平台工程技术社区与数澈软件Seal联合举办的⌈AIGC时代下的平台工程⌋--2023平台工程技术大会在北京圆满收官.吸引了近300名平台工程爱好者现场参会,超过3000名观众在线 ...

  10. 治理效率提升77%!揭秘基于DataLeap实时健康分的最佳实践

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 某企业实时数仓团队通过数据收集.整合.计算和存储构建实时数据仓库,为企业提供快速.准确.可靠的实时数据分析和 ...