每日工作记录——状态机的编码选择

复习面试题中,复习到了状态机的码制选择这里,以前根本没有关注过这个,一看才知道原来东西还是很多的,因此做一些记录。


状态机常用码二进制、格雷码和独热码。

二进制码就不用细说了,就是正常的顺序编码,四个状态的话就是

s_0 = 2'b00;
s_1 = 2'b01;
s_2 = 2'b10;
s_3 = 2'b11;


格雷码特点是相邻码元之间只有一位是不同的,四个状态的话就是
s_0 = 2'b00;
s_1 = 2'b01;
s_2 = 2'b11;
s_3 = 2'b10;


独热码的特点是只有一位是“1”其余都是“0”,四个状态的话就是
s_0 = 2'b0001;
s_1 = 2'b0010;
s_2 = 2'b0100;
s_3 = 2'b1000;

观察这些状态机的编码可以发现,二进制和格雷码占用的触发器资源比较少(位宽小啊),不过进行对比和跳转时候消耗的组合逻辑会比较多;而独热码的触发器资源占用比较多,不过组合逻辑消耗比较少。简单点想,在case里我们要确定state==s_1?那么对于二进制和格雷码来说需要对比两位,而对于独热码来说只需要看state[1]==1?就可以了,因此在组合逻辑资源上会有所节省,速度也会比二进制和格雷码更快(组合逻辑简化导致的路径时序缩短)。

二进制码与格雷码对比的话,格雷码跳转时候只有一个状态位发生跳转,可以有效的消除多条信号线由于传输延时或门延时所产生的毛刺,也可以减低功耗。不过此处有疑问,因为不一定是1-2-3-4这样跳转,也有可能是1-3-2-4这样跳转,格雷码也会出现多位跳转的情况,需要进一步查看资料。

因为独热码消占用的触发器比较多,而LUT和DFF是FPGA里最不缺的资源(大量触发器闲置),因此在FPGA编程时用独热码效果比较好。CPLD中组合资源较多时序资源较少,因此用格雷码或二进制码较好。IC设计中需要综合考虑,如果时序满足的情况下面积与速度综合看用格雷码比较好,因为独热码的资源会大大增加面积。

还有一点就是,在状态较少时用独热码效果好,状态多时格雷码效果好。

你可能感兴趣的:(杂七杂八)