基于verilog的有限状态机编程方式及研究

大三时候的一次大作业,前几天整理资料才发现

1 有限状态机的设计流程

⑴依据设计原则,确定采用Moore型状态机还是Mealy型状态机。
⑵分析设计要求,列出状态机的所有状态,并对每一个状态进行状态编码。
⑶根据状态转移关系画出状态图。
⑷根据所画的状态图,采用硬件描述语言对状态机进行描述。

2 有限状态机的状态编码选择

状态编码又称为状态分配,它确定维持状态所需的触发器的数量并影响实现下一个状态和输出时所用的组合逻辑的复杂度。因为每种方法都有自身的优点和缺点,在不同环境中选择不同的编码方式尤为重要。Verilog中常用的状态编码方式有二进制码,格雷(Gray)码和独热(One-hot)码。通过比较,可以发现二进制编码和格雷码是压缩状态编码,即所用的状态向量最短。但对于二进制编码,在状态寄存器进行状态转换时,如果状态从2’b2翻转到2’b3即从2’b01至2’b10这样会产生多个状态的翻转,实际应用中极易产生毛刺。而格雷码是针对二进制码这一缺点的优化。格雷码在变化时,利用了高位互补,低位相等的原则,实现了仅一位的改变,这样,格雷码在实际应用中减少了电路相邻物理信号线同时变化的情况,从而减少电路中的电噪声,这种编码方法适合面积较小又追求精确度的电路。若使用独热码,则X个状态就需要X个状态寄存器,这将使状态转换过程更加严谨,并且电路的容错性将更好。尽管使用了更多的触发器.但是由于状态解码简单,可以减少组合逻辑 。因此,独热码常常在硬件资源丰富的情况下(如FPGA中)使用。

3有限状态机的编程方式及其优缺点

(1)单进程式描述方式
         单进程式描述方式代码中只有一个always过程块。这种情况下,如果均采用非阻塞语句赋值,即所有功能都通过寄存器完成,电路不会产生毛刺。由于一段式的描述方法是为STATE 本身分配一个值,因此会引入一个周期的延时,在设计中需要通过“预计算”将其考虑在内。如果遇到状态较多的情况,编程本身极易出错,且代码冗长,维护不方便,因此,在任何情况下,都不推荐单进程式编程。

(2)双进程式描述方式

         双进程式描述方式代码中有两个always过程块。第一个过程块描述了状态的转移,第二个过程块描述了由输入确定的当前状态以及组合逻辑控制的输出。这种方式使FSM描述清晰简洁,易于附加时序约束,编译器优化效果明显,可以获得非常理想的速度和资源占用率,是目前使用最广泛的状态机描述风格。

(3)三进程式描述方式

      三进程式描述方式代码中有三个always过程块。它由当前状态及输入确定下一级状态和输出分开,将对输出的选择用单独的一个always过程块描述,从而将组合逻辑电路分离开,使电路不会产生毛刺,可靠性高,并且代码条理清晰,更易维护。

(4)条件语句的选择

      在电路的综合中,条件语句可以选择If-else语句或case语句。If-else语句有优先级的要求,而case语句没有。另外要注意,因为PLD在器件中集成了很多寄存器,与使用寄存器完成的设计相比,它是通过锁存器来完成。不仅逻辑复杂,而且性能也很差。所以,在使用条件语句时,要注意清除锁存器。对于case语句,应当把所有情况罗列完毕,并添加default语句以提高电路容错性。

例子

110序列检测器

module checker110(z,x,clk,rst);
parameter S0 = 2'b00,S1 = 2'b01,S2 = 2'b11,S3 = 2'b10;
output z;
input x,clk,rst;
reg [1:0]state,next_state;
reg z;
always @(posedge clk or negedge rst)
if(!rst) state <= S0;
else state <= next_state;
always @(state or x)
case(state)
S0: if(x) next_state = S1;
else next_state = S0;
S1: if(x) next_state = S2;
else next_state = S0;
S2: if(x) next_state = S2;
else next_state = S3;
S3: if(x) next_state = S1;
else next_state = S0;
default: next_state = S0;
endcase
always @(state or x)
case(state)
S0,
S1,
S2: z = 1'b0;
S3: z = 1'b1;
default:z = 0;
endcase
endmodule

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值