赞
踩
状态设计原则:
(1)不能让状态机陷入死循环或者非预知的状态,在外界某种噪音干扰下,状态机能够迅速恢复到正常的状态。
(2)状态机设计要清晰易懂便于维护
状态描述方法:
进行状态机的描述时,要弄清楚需要设计几个状态,状态之间在什么条件下进行转换,每个状态如果有输出的话,那么输出是什么?
状态描述常见的有以下三种:
(1)一段式:整个状态机写到一个always模块里,在该模块中既描述状态转移,又描述状态的输入和输出;
(2)两段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
(3)三段式:这是最常使用的描述模式。本文以该描述为例。在两个always模块描述方法的基础上,使用三个always模块,一个always模块采用同步时序描述述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述输出状态,该模块采用组合或时序电路。
本例涉及七个状态的转换,这些灯标号自上到下,自左到右分别为0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16。
wire [15:0] pattern; enum bit [3:0] { //设置七个状态 STATE0=4'b0001, STATE1=4'b0010, STATE2=4'b0011, STATE3=4'b0100, STATE4=4'b0101, STATE5=4'b0110, STATE6=4'b0111, STATE7=4'b1000 } state, next_state; always_ff @(posedge clk, posedge reset) //异步复位 begin if(reset) state<=STATE0; else state<=next_state;//非阻塞赋值 end always@(state) //状态转换 begin : set_next_state case (state) STATE0:begin if(direction==0) next_state=STATE1; //以下均为阻塞赋值 else next_state=STATE4; end STATE1:begin if(direction==0) next_state=STATE2; else next_state=STATE5; end STATE2:begin if(direction==0) next_state=STATE3; else next_state=STATE6; end STATE3:begin if(direction==0) next_state=STATE0; else next_state=STATE7; end STATE4:begin if(direction==0) next_state=STATE0; else next_state=STATE5; end STATE5:begin if(direction==0) next_state=STATE1; else next_state=STATE6; end STATE6:begin if(direction==0) next_state=STATE2; else next_state=STATE7; end STATE7:begin if(direction==0) next_state=STATE3; else next_state=STATE4; end endcase end : set_next_state always@(state) //状态输出 begin : set_outputs case(state) STATE0:begin pattern<=16'b1_00_000_0000_000_00_1; end STATE1:begin pattern<=16'b0_11_000_0000_000_11_0; end STATE2:begin pattern<=16'b0_00_111_0000_111_00_0; end STATE3:begin pattern<=16'b0_00_000_1111_000_00_0; end STATE4:begin pattern<=16'b1_01_001_1111_001_01_1; end STATE5:begin pattern<=16'b1_10_100_1111_100_10_1; end STATE6:begin pattern<=16'b1_11_111_1001_010_00_1; end STATE7:begin pattern<=16'b1_11_111_1111_111_11_1; end endcase end : set_outputs /****** Internal signal assignment to output port *******/ assign L[15:0] = pattern;
第二部分设计时要注意考虑所有状态
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。