FPGA基于village的Moore状态机可乐机例子

注意:以下是本人学习笔记,仅供参考。如有问题可以留言指出,谢谢。

状态机分为:moore型和mealy型

Moore型状态机输出仅与现态变量有关;

Mealy型状态机不仅输出与现态变量有关,还与输入有关。

编写方法:

一段式(一个always):使用时序逻辑,及描述状态的转移,也描述状态的输出;

二段式(二个always):一段状态机使用时序逻辑描述状态的转移;

                                    第二段使用组合逻辑描述状态的输出。

三段式(三个always):第一段采用时序逻辑描述状态转移;

                                   第二段采用组合逻辑判断转移条件,描述状态转移规律;

                                   第三段描述状态输出(可以用时序逻辑,也可以用组合逻辑)。

独热码:特性是每个状态只有一个比特位是不同的,在综合过程中,综合器会将它识别成一个比较器,这个比较器只有一个比特位是不同的,也就是说综合器会对它优化,相当于把3个比特位的比较器变为了一个比特位的比较器。这样减少了组合逻辑的资源,付出的代价是把状态变量位宽比较多,在FPGA中组合逻辑资源比较少,寄存器资源比较多。(优化后的状态机可以保证在高速下运行)

二进制码:特性和独热码相反,

格雷码:属于两个的折中,相邻状态转换只有一个状态是发生反转的,这样能防止状态转换时由多条信号线传输延时造成的毛刺,也可以降低功耗。

总结:低速系统中,如果状态机中状态的个数小于4个用二进制码,如果是4到24个状态用独热码,大于24个状态使用格雷码。

高速系统中,不管有多少状态都推荐使用独热码。

(本次状态机应用的独热码)

编写程序:

module  moore_cocl
  (
  input           sys_clk,
  input           sys_rst_n,
  input        cast_bi,
  
  output   reg     cocl
  );
  
  parameter   IDLE = 3'b001,  //设置三个状态
              ONE  = 3'b010,
              TWO  = 3'b100;
              
  reg  [2:0]  current_state;  //目前状态
  
  
always@(posedge sys_clk or negedge sys_rst_n)
  if(sys_rst_n == 1'b0)
    current_state <= IDLE;
  else  case(current_state)
            IDLE: if(cast_bi == 1'b1)
                    current_state <= ONE;
                  else
                    current_state <= IDLE;
              
             ONE: if(cast_bi == 1'b1)
                    current_state <= TWO;
                  else
                    current_state <= ONE;
                    
             TWO: if(cast_bi == 1'b1)
                    current_state <= IDLE;
                  else
                    current_state <= TWO;
                    
            default: current_state <= IDLE;
            
          endcase
          
always@(posedge sys_clk or negedge sys_rst_n)
  if(sys_rst_n == 1'b0)
    cocl <= 1'b0;
  else if((current_state == TWO) && (cast_bi == 1'b1))
    cocl <= 1'b1;
  else
    cocl <= 1'b0;
    
  endmodule
    
    
    

 自我总结:编写状态机,先判断需要几个状态,来设置几个状态;

                    用时序逻辑的方法通过case语句编写状态机的几个状态选择;

                    最后通过状态来判断输出。(这里运用新二段式设计方法)

  

仿真代码:

`timescale 1ns / 1ns
module  tb_moore_cocl();
  reg       sys_clk;
  reg       sys_rst_n;
  reg       cast_bi;
  wire        cocl;
  
  initial
    begin
      sys_clk = 1'b1;
      sys_rst_n <= 1'b0;
      #20
      sys_rst_n <= 1'b1;
    end
    
always #20 sys_clk = ~sys_clk;

always@(posedge sys_clk or negedge sys_rst_n)
  if(sys_rst_n == 1'b0)
    cast_bi <= 1'b0;
  else
    cast_bi <= {$random} % 2;

moore_cocl  tb_moore_cocl
  (
  .sys_clk  (sys_clk),
  .sys_rst_n  (sys_rst_n),
  .cast_bi      (cast_bi),
  .cocl      (cocl)
  );
  
endmodule

仿真图像:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值