zoukankan      html  css  js  c++  java
  • 001 数电 (1) : 数制和码制

    一. 数制转换

    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 《“ 一网打尽 ” 二进制、格雷码、独热码编码方式》

  • 相关阅读:
    编程之美:位运算应用集萃
    【总结系列】互联网服务端技术体系:高性能之缓存面面观
    【总结系列】互联网服务端技术体系:高性能之并发(Java)
    【总结系列】互联网服务端技术体系:高性能之数据库索引
    【总结系列】互联网服务端技术体系:可扩展之数据分区
    一道关于二叉树的字节面试题的思考
    python基础之range()函数和random模块
    记录下第一次参加leetcode 周赛
    几种方法实现“反转字符串”
    c# 自动更新程序
  • 原文地址:https://www.cnblogs.com/linford/p/14966095.html
Copyright © 2011-2022 走看看