WeiLin

Logo

End of Best.

View My GitHub

> Home
> Back

vlog_day1:进制与编码

by WeiLin

一、进制

设x为正数(最高位为符号位0),则:

x反码/x补码:x
-x反码:2^n-1-x
-x补码:2^n-x

小数的二进制表示:乘2,取整数部分作第1个bit,取小数部分再乘2,以此类推,直到小数为0(或达到精度要求)

0.675*2=1.25    ——1
0.25*2 = 0.5    ——0
0.5*2=1         ——1
(0.675)10=(0.101)2

小数的原/补码与整数一样,注意补码加1,是在小数的最低位加1:

(127.375)10=(0111_1111.011)2
(-127.375)10=(1111_1111.011)2/原码
(-127.375)10=(1000_0000.101)2/补码

二、编码

编码有很多,这里介绍比较简单的BCD码,其全称为Binary-Coded-Decimal,即用二进制编码十进制,所以BCD码是用4位2进制数表示0~9,也就是4-10译码器。

其有3种实现方式:1.移位;2.case语句;3.门结构。详细代码如下:

//BCD_decoder.v//
//BCD译码器,也就是4-10译码器
//3种方法:1.移位;2.case语句;3.门结构
module bcd_decoder(
    input [3:0] in,
    output[9:0] out
);

//方法1:1左移相应位
//assign out=1<<in;

//方法2:case语句
reg [9:0] out_reg;
always@(*)begin
    case(in)
        0:out_reg=10'b00_0000_0001;
        1:out_reg=10'b00_0000_0010;
        2:out_reg=10'b00_0000_0100;
        3:out_reg=10'b00_0000_1000;
        4:out_reg=10'b00_0001_0000;
        5:out_reg=10'b00_0010_0000;
        6:out_reg=10'b00_0100_0000;
        7:out_reg=10'b00_1000_0000;
        8:out_reg=10'b01_0000_0000;
        9:out_reg=10'b10_0000_0000;
        default:out_reg=10'b00_0000_0000;
    endcase
end
assign out=out_reg;

//方法3:门结构
// assign out[0]= ~in[3] & ~in[2] & ~in[1] & ~in[0];
// ...
// assign out[9]= in[3] & ~in[2] & ~in[1] & in[0];

endmodule
tags: verilog