【基础知识】~ 进制转换、补码、格雷码、BCD码、独热码

1. 进制转换

1.1 十进制 to 二进制

  1. 正整数转二进制:除二取余,然后倒序排列,高位补零。
  2. 负整数转二进制:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。
  3. 小数转二进制:对小数点以后的数乘以 2,取整,剩余小数再乘以 2,直至小数部分为 0(有可能永远有小数,此时按需停止)

小数部分和整数部分互不影响,分开转换,最后合在一起即可。

1.2 二进制 to 十进制

  1. 整数二进制转十进制:高位补零(比如数据为 8 位),再确定是有符号还是无符号,若是有符号整数,当最高位是 0 为正数,1 为负数;
    正整数,去除符号位,各个位数与对应 2 次幂相乘,最后求和。
    负整数,去除符号位,减一,取反,再换算,记得添加整数的负号。
  2. 小数二进制十进制:各个位数与对应 2 的负次幂相乘,最后求和。

2. 原码、反码和补码

2.1 定义

计算机中的有符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有**符号位**和**数值位**两部分,符号位都是用 0 表示“正”,用 1 表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。

2.2 采用补码运算具有如下两个特征

1)因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。
2)两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

补码有两个好处

1)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。)
2)加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。

3. 格雷码

3.1 定义

格雷码(Gray code),又叫循环二进制码或反射二进制码。
在数字系统中只能识别 0 和 1,各种数据要转换为二进制代码才能进行处理。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的 3 转换成 4 时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。格雷码常用于通信,FIFO 或者 RAM 地址寻址计数器中。

3.2 二进制和格雷码转换

  1. 二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是 0);
# 注意:这里边的i取值范围是0~N-1N为位宽)
assign gray_value[ i ] = binary_value[ i ] ^ binary_value[ i + 1 ];  # 方式一
assign gray_value[ i ] = binary_value[ i ] ^ binary_value >> 1;      # 方式二
  1. 格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值(这里指的是二进制相邻高位,可不是格雷码相邻高位哦!!!)异或,作为该位解码后的值(最左边一位依然不变).
# 注意:这里边的i取值范围是0~N-2N为位宽)
assign binary_value[n-1]    = gray_value[n-1]; 
assign binary_value[ i ] = gray_value[ i ] ^ binary_value[ i + 1 ];

3.3 优缺点

优点:属于压缩状态编码,使用的触发器位数少;相邻状态变换时,仅一位发生改变,电噪声小,转换速度较快;
缺点:译码复杂,没有固定大小,很难直接进行比较大小和算术运算,需要转换为自然二进制码来判断。

3.4 牛刀小试

格雷码计数器

`timescale 1ns/1ns

module gray_counter(
   input   clk,
   input   rst_n,

   output  reg [3:0] gray_out
);
    reg [4:0] binary;
    //counter
    always @ (posedge clk or negedge rst_n) begin 
        if(!rst_n) begin
            binary <= 5'b0;
        end
        else begin
           binary <= binary + 1'b1; 
        end
    end
    
    wire [3:0] binary_out = binary[4:1];
    //binary to gray
    always @ (*) begin
        gray_out[3]= binary_out[3];
        gray_out[2]= binary_out[3] ^ binary_out[2];
        gray_out[1]= binary_out[2] ^ binary_out[1];
        gray_out[0]= binary_out[1] ^ binary_out[0];
    end
endmodule

这个题有点问题哈!写完之后提交发现每两个时钟周期他才会加一。那咋办?那就增加一位呗,最低位每增加两次,次高位加一,哦了!!!这个题大家看一下思想就行。

4. BCD码

4.1 定义

BCD 码(Binary-Coded Decimal),用 4 位二进制数来表示 1 位十进制中的 0~9 这 10 个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。

5. 独热码

5.1 定义

独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为 1,其他全为 0 的一种码制。通常,在通信网络协议栈中,使用八位或者十六位状态的独热码。
例如,有 6 个状态的独热码状态编码为:000001,000010,000100,001000,010000,100000。

5.2 优缺点

优点:状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑,译码简单,减少了毛刺产生的概率。
缺点:速度较慢,触发器资源占用较多,面积较大;

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值