首页 > 技术文章 > 001 数电 (1) : 数制和码制

linford 2021-07-03 13:10 原文

一. 数制转换

1. 二进制和十进制互转

(1)二 - 十:2的n次方

 

 

 (2)十 - 二(整数):除2取余,从下到上。

(3)十 - 二(小数):乘2取整,从上到下。

 

 

2. 二进制和十六进制互转

(1)二 - 十六:4个1位

 

 

 (2)十六 - 二:1位4个

二. 原码, 反码, 补码

1.  概念

原码:

         新增最高位为符号位,0正1负,其余位不变。

反码:

         正数的反码是其本身

         负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

补码:

         正数的补码就是其本身       

         负数的补码是在其原码的基础上, 符号位不变,其余位为反码加一。

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

2. 有符号数加减运算

  • (1)先扩位,结果位 = max(a,b)+ 1;
  • (2)符号位写两遍,数字为变补码;
  • (3)结果值超过的进位舍去;

3. 有符号数乘除法运算

  • (1)先扩位,结果位 = a + b + 1;
  • (2)符号位相与放到最高位;
  • (3)数字位进行乘除运算;
a[3:0] + b[3:0] = {a[3] & b[3], a[2:0] * b[2:0]} = c[6:0](位数为3+3+1=7)

 

三. 常见编码

1. 十进制代码

2. 格雷码(循环码)

什么是格雷码?

  在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码反射码。格雷码(Gray Code)又称Grey Code、葛莱码、格莱码、戈莱码、循环码、反射二进制码、最小差错码等。

 

为什么要使用格雷码?

  格雷码是一种具有反射特性和循环特性的单步自补码,其循环和单步特性消除了随机取数时出现重大错误的可能,其反射和自补特性使得对其进行求反操作也非常方便。格雷码属于一种可靠性编码,它在相邻间转换时,只有一位产生变化,它大大减少了一个状态到另一个状态时逻辑的混淆,因此格雷码在通信和测量技术中得到广泛应用。

 

格雷码有哪些特点?

(1)格雷码具有反射特性;

(2)格雷码具有循环特性;

(3)格雷码是一种准权码;

(4)格雷码相邻的码组间仅有一位不同;

(5)格雷码从编码形式上杜绝了逻辑冒险的发生;

(6)卡诺图是按格雷码来画的;

(7)格雷码不是一种二进制;(易错)

 

格雷码和独热码的区别

  独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。

 

二进制转格雷码

  Gray = (bin>>1) ^ bin;(右移一位后和自身异或)

 

3. ASCII码

4. 独热码

独热码和二进制码的优缺点比较:

二进制码、格雷码使用最少的触发器,但是消耗较多的组合逻辑(用于译码);

独热码则正好相反,因为状态比较时仅需要比较一位,从而在一定程度上简化了译码逻辑。

虽然在表示同样的状态时,独热码占用较多的位,也就是消耗较多的触发器,但这些额外的触发器占用面积可与译码电路省下来的面积相抵消。

 

在CPLD更多的提供组合逻辑,而FPGA提供更多的触发器资源,所以在CPLD中更多的使用二进制、格雷编码,在FPGA中更多使用独热编码。

一般的,对于小型设计(状态数小于4)使用二进制编码,当状态数处于4-24之间时,宜采用独热码编码,而大型状态机(状态数大于24)使用格雷码更高效。

四. 有限状态机中独热码与格雷码的比较

 有限状态机编码时采用格雷码和采用独热码的选择

格雷码:相邻之间只变1bit,编码密度高。
独热码:任何状态只有1bit为1,其余皆为0,编码密度低。
比如说,表示4个状态,那么状态机寄存器采用格雷码编码只需要2bit:00(S0),01(S1),11(S2),10(S3);
               采用独热码需要4bit:0001(S0),0010(S1),0100(S2),1000(S3)。

所以很明显采用格雷码可以省2bit寄存器。难理解的是,为什么独热码更节省组合逻辑:其实很简单。
例一:
        假如我们要在代码中判断状态机是否处于某状态S1,对于格雷码的状态机来说,代码是这样的:assign S1 = (STATUS==2'b01);对于独热码来说,代码是这样的就行:assign S1=STATUS[1];所以独热码的译码非常简单。
例二:
        考虑最简单的跳变,当A为1时,状态机会从S0跳到S1:。采用格雷码写:STATUS[1:0] <= (STATUS==2'h00) & A ? 2'h01 : 2'h00;采用独热码写:STATUS[1] <= STATUS[0] & A;

        有人怀疑这里的逻辑,认为只check独热码的一个bit有问题。当然是没问题的,0110,0011等编码属于不care的编码,在卡诺图化简中,不care的编码可以与其余的有效编码合并化简。实际上综合器也会这么做,所以独热码非常容易化简。
         假如说S0跳到S1条件为A;S1跳到S2条件为B;S2跳到S3条件为C;S3跳到S0条件为D;那么整个状态机化简之后代码就是:
          STATUS[0] <= STATUS[3] & D;
          STATUS[1] <= STATUS[0] & A;
          STATUS[2] <= STATUS[1] & B;
          STATUS[3] <= STATUS[2] & C;

五. 总结

对于小型设计(状态数小于4)使用二进制编码,

当状态数处于4-24之间时,宜采用独热码编码,

而大型状态机(状态数大于24)使用格雷码更高效。

独热码适合写条件复杂但是状态少的状态机;
格雷码适合写条件不复杂但是状态多的状态机。

 

六. 参考资料:

1.阎石. 数字电子技术基础(第5版)[M]. 高等教育出版社, 2006.

2.https://blog.csdn.net/qq_40124902/article/details/106989330

3.https://www.cnblogs.com/xianyufpga/p/13189950.html

4.微信公众号 数字ICer 《“ 一网打尽 ” 二进制、格雷码、独热码编码方式》

 

推荐阅读