1. 进制转换
1.1 十进制 to 二进制
- 正整数转二进制:除二取余,然后倒序排列,高位补零。
- 负整数转二进制:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。
- 小数转二进制:对小数点以后的数乘以 2,取整,剩余小数再乘以 2,直至小数部分为 0(有可能永远有小数,此时按需停止)
小数部分和整数部分互不影响,分开转换,最后合在一起即可。
1.2 二进制 to 十进制
- 整数二进制转十进制:高位补零(比如数据为 8 位),再确定是有符号还是无符号,若是有符号整数,当最高位是 0 为正数,1 为负数;
正整数,去除符号位,各个位数与对应 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 二进制和格雷码转换
- 二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是 0);
# 注意:这里边的i取值范围是0~N-1(N为位宽)
assign gray_value[ i ] = binary_value[ i ] ^ binary_value[ i + 1 ]; # 方式一
assign gray_value[ i ] = binary_value[ i ] ^ binary_value >> 1; # 方式二
- 格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值(这里指的是二进制相邻高位,可不是格雷码相邻高位哦!!!)异或,作为该位解码后的值(最左边一位依然不变).
# 注意:这里边的i取值范围是0~N-2(N为位宽)
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 优缺点
优点:状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑,译码简单,减少了毛刺产生的概率。
缺点:速度较慢,触发器资源占用较多,面积较大;