Verilog实现状态机与状态机经典示例——序列检测器、自动饮料售卖机

目录

1.状态机原理与三段式状态机

2.状态机示例

2.1自动饮料售卖机/卖报机

2.2序列检测器


1.状态机原理与三段式状态机

MOORE 与 MEALEY 状态机的特征?
Moore 状态机的输出仅与当前状态值有关, 且只在时钟边沿到来时才会有状态变化。次态=f(现状,输入),输出=f(现状)
Mealy 状态机的输出不仅与当前状态值有关, 而且与当前输入值有关。次态=f(现状,输入),输出=f(现状,输入)
描述同一个事务,mealy的状态更少。

通用mealy三段式状态机(建议实际工程中采用的结构)

//------采用独热码或格雷码或其他方式编码状态
parameter IDLE = ...
parameter S0 = ...
...
reg [x:0] curr_state;
reg [x:0] next_state;

//------每个时钟只产生一次状态变化
always @(posedge clk or  posedge asy_rst)
begin
    if(asy_rst)    curr_state <= IDLE ;
    else           curr_state <= next_state;    
end

//------产生的下一状态的组合逻辑
always @(*)
begin
    next_state = 'bx;
    case(curr_state)
        IDLE:  if(输入) next_state = S0 ;else...;
        S0:    if(输入) next_state = ...;
        ...
        default:       next_state = ...;
    endcase
end
/************************时序或组合二选一***********************/
//------时序逻辑输出(比组合逻辑延时一个时钟)
always@(posedge clk or posedge asy_rst)
begin
    if(asy_rst)out<= ...;
    else
    case(curr_state)
        sO: if(...) out <= ...;
        sO: if(...) out <= ...;
        default: out <= ...;
    endcase
end
//------组合逻辑输出 采用 assign 或always
always @(*)
begin
    if(asy_rst)out = ...;
    else
    case(curr_state)
        sO: if(...) out  = ...;
        sO: if(...) out  = ...;
        default: out  = ...;
    endcase
end
/***********************************************************/

2.状态机示例

2.1自动饮料售卖机/卖报机

题目:商品是5分钱,只能投3种硬币:1分,2分,5分,考虑找零。

思路1:采用状态机,共分为5个状态,S0-S4代表已经投入的钱,画出状态转换图(略),采用三段式mealy状态机。

思路2:(更简单)不采用状态机,直接对输入的钱进行加法运算,多余5分就输出和找零,同时将内部加法器清零。

另一个版本:用Verilog实现接受0.5元,1元的可乐售卖机,单价2.5元,考虑找零和出货。

module auto_sell_better#(
parameter I_WD = 4 , O_WD = 4
)(
input clk,
  • 20
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值