【FPGA——基础篇】换个方式理解有限状态机

一、状态机概述

有限状态机通常是由寄存器组和组合逻辑组成时序电路,根据当前状态和输入信号可以控制下一个状态的跳转,有限状态机在电路中通常是作为控制模块,作为整个电路模块的核心而存在,它主要包括两大类:Mealy型状态机和Moore型状态机。

Mealy型状态机:其组合逻辑的输出不仅与当前状态有关,还与输入有关。

如下图所示:

 Moore型状态机:其组合逻辑的输出只与当前的状态有关。

如下图所示:

 

        状态机的编码方式主要包括:二进制码(Binary),格雷码(gray),独热码(one hot)

比如说当前工作四个状态的话,其编码方式如下表1所示:

 

二进制        

格雷码

独热码

S0

00

00

0001

S1

01

01

0010

S2

10

11

0100

S3

11

10

1000

       格雷码相对于二进制码而言,在状态跳转的时候,只有单比特翻转,它的功耗相对比较低,该部分后面的异步FIFO章节会重点讲到。独热码相对于格雷码或者二进制码而言,它增加了两个寄存器来表示状态,但是它会更节省组合逻辑电路,因为它在比较状态的时候,只需要比较一个比特位,那么其电路的速度和可靠性就会增加。

 

二、状态机设计实例分析

      应用场景:编写一个自动售货机,功能如下:

      共有三种纸币入口,分别支持10元,20元,50元。货物售价为80元。需要支持找钱功能(注意,找钱有两种情况, 90元和100元;而110元和120元的情况不符合实际应用场景,所以不存在找钱的情况)。

      分析:一共有十一种状态:每种状态对应当前售货机已接受的金额,当金额达到80,90,100的时候售货机会输出货物,当金额为80时,不找零,当金额为90,100的时候要找零,零钱分别为10,20。

根据分析画出如下的状态转化图:

       状态机的RTL以及仿真的testbench代码链接:https://pan.baidu.com/s/1dKcwhzNS60Sw-7-UYXqyAQ 

       提取码:9khq 

       在testbench里面模拟了三种情形:输入为80,90,100的三种情况

仿真的testbench如下图:

输入信号:

ten_inst为1表示输入10,twenty_inst为1表示输入20,fifty_inst为1便是输入50。

输出信号:

out_inst为1表示要输出货物;

charge_inst为0,表示不找零,为2‘b11,表示找零20,为2‘b01表示找零10。

参考链接:https://mp.weixin.qq.com/s/Gn5G5EnK6af-0IaJ9g3JMA

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用状态机编写的Binary-to-Gray代码(VHDL): ``` library ieee; use ieee.std_logic_1164.all; entity binary_to_gray is port ( binary_in : in std_logic_vector(3 downto 0); gray_out : out std_logic_vector(3 downto 0) ); end binary_to_gray; architecture Behavioral of binary_to_gray is type state_type is (s0, s1, s2, s3); signal current_state, next_state : state_type; begin process(current_state, binary_in) begin case current_state is when s0 => gray_out <= binary_in; next_state <= s1; when s1 => gray_out <= binary_in xor (binary_in(1) & binary_in(0) & binary_in(3)); next_state <= s2; when s2 => gray_out <= binary_in xor (binary_in(2) & binary_in(1) & binary_in(0)); next_state <= s3; when s3 => gray_out <= binary_in xor (binary_in(3) & binary_in(2) & binary_in(1)); next_state <= s0; end case; end process; process(current_state) begin case current_state is when s0 => current_state <= s1; when s1 => current_state <= s2; when s2 => current_state <= s3; when s3 => current_state <= s0; end case; end process; next_state <= s0 when current_state = s3 else next_state; process(current_state, next_state) begin if current_state /= next_state then current_state <= next_state; end if; end process; end Behavioral; ``` 这个代码使用了一个状态机来实现Binary-to-Gray的转换。在每个时钟周期中,状态机会根据当前状态和输入的Binary值计算出输出的Gray值,并将状态更新为下一个状态。最终的Gray值将在下一个时钟周期中输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值