FSM状态机仿真设计-如何查看状态

  我们平时使用Verilog进行状态机编码时,通常使用parameter对状态名进行定义,这样写Case语句的时候就不会对这一串10摸不着头脑。可是通常这样做的话,在Modelsim里看到的还是一串10,使排错非常困难,特别是在用OneHot编码的时候,就看到一串0中间的一个1 #_# 简直要疯掉。

Question: 我们可不可以像VHDL一样,在仿真的时候看到状态名字,而不仅仅是状态编码呢?

答案当然是可以的拉,事在人为嘛!

Solution1:
  另外定义一个reg: state_name,长度根据状态名称长度而改变(状态名称字符数x8);
  在每个状态执行的语句中加入state_name <= "IDLE"; 类似的一句语句;
  仿真时添加state_name进行观察,使用ASCII Radix。

Solution2:
使用如下语句:

`ifdef SIMULATION 
        parameter S_idle        = "idle  "; 
        parameter S_decode      = "decode"; 
        parameter S_start       = "start "; 
        parameter S_wait        = "wait  "; 
        parameter state_wid_msb = 47; 
`else 
        parameter S_idle        = 4'b0001; 
        parameter S_decode      = 4'b0010; 
        parameter S_start       = 4'b0100; 
        parameter S_wait        = 4'b1000; 
        parameter state_wid_msb = 3; 
`endif 

reg    [state_wid_msb:0] state; 

只要在仿真的时候`define SIMULATION就可以了。一样用ASCII Radix查看。

综合的原则为:

  1. 综合之前一定要进行仿真,仿真会暴露逻辑错误。如果不做仿真,没有发现的逻辑错误会进入综合器,使综合的结果产生同样的逻辑错误。 
  2. 每一次布线之后都要进行仿真,在器件编程或流片之前一定要进行最后的仿真。 
  3.  用Verilog HDL描述的异步状态机是不能综合的,应该避免用综合器来设计。在必须设计异步状态机时,建议用电路图输入的方法
  4. 状态机应该有一个异步或同步复位端,以便在通电时将硬件电路复位到有效状态。建议使用异步复位以简化硬件开销
  5. 时序逻辑电路建模时,用非阻塞赋值。用always块写组合逻辑时,采用阻塞赋值。不要在多个always块中为同一个变量赋值。
  6. always块中应该避免组合反馈回路。在赋值表达式右端参与赋值的信号都必须出现在敏感信号列表中,否则在综合时,会为没有列出的信号隐含地产生一个透明锁存器

 

转载于:https://www.cnblogs.com/woshitianma/archive/2013/01/21/2870022.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值