目录
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,