二进制转换成十进制BCD码(加3移位法)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⼆进制转换成⼗进制BCD码(加3移位法)
“原来的⼆进制数⼗⼏位,则左移时就要左移⼏位”
"⼆进制数调整BCD码的⽅法是将⼆进制码左移8次,每次移位后都检查低四位LSD+3是否⼤于7,如是则加3,否则不加,⾼4位MSD作同样处理"⼀、为什么左移8次
原寄存器是存⼆进制数的,新寄存器是存⼗进制数的,当然要左移8次,把数据全部移进去。
但这⾥要注意两件事,第⼀,如果只安排⼀个字节作⼗进制寄存器,原数据要⼩于 64H(即100)。
第⼆,由于新寄存器是⼗进制的,要随时调整。
⼆、检查半字节+3 是否⼤于 7,是,则 +3
在 51 系列⾥有⼗进制调节指令(半字节⼤于 9,则加 6,应该不难理解),PIC ⾥没有,只好采取变通的⽅法。
检查半字节+3 是否⼤于 7,也就是检查半字节是否⼤于 4。
因为,如果⼤于 4(⽐如 5、6),下⼀步左移就要溢出了,所以加 3,等于左移后的加 6,起到⼗进制调节的作⽤。
那为什么要绕个圈⼦去检测半字节+3 是否⼤于 7 呢?这样程序编起来会简练⼀些。
⼀个例⼦
假如有⼀个⼋位⼆进制数255,我把他转255的⼗进制数
0 1111 1111 原数
1 0000 0001 ;左移⼀次
2 0000 0011 ; 左移⼆次
3 0000 0111 ;左移三次,检查低四位+3>7?
3.1 0000 1010 ;⼤于7,加3进⾏调整
4 0001 0101 ;左移四次, 检查低四位+3>7?
4.1 0001 1000 ;⼤于7,加3进⾏调整
5 0011 0001 ;左移五次
6 0110 0011 ;左移六次,检查⾼四位+3>7?
6.1 1001 0011 ;⼤于7,加3进⾏调整
7 1 0010 0111 ;左移七次,检查低四位+3>7?
7.1 1 0010 1010 ;⼤于7,加3进⾏调整
8 10 0101 0101 ;左移⼋次(得到BCD码255)
附上Verilog代码:
//17位⼆进制数转BCD码(基本思想是逢⼗进1)
module BIN_BCD_4 (CLK, A, BW, BQ, BB, BS, BG);
input CLK;
input [16:0]A; //⼆进制输⼊数据
output [3:0]BW, BQ, BB, BS, BG;//BCD数据输出寄存器
reg [3:0]BW, BQ, BB, BS, BG;
integer I;
reg [19:0]TEMP;
reg [16:0]C;
always @ (posedge CLK)
begin
C=A;
TEMP=0;
for (I=1; I<17; I=I+1)
begin
{TEMP, C}={TEMP[18:0], C, 1'b0};//左移⼀位 if (TEMP[3:0]>4'b0100)
begin
TEMP[3:0]=TEMP[3:0]+3; // >4则加3
end
if (TEMP[7:4]>4'b0100)
begin
TEMP[7:4]=TEMP[7:4]+3;
end
if (TEMP[11:8]>4'b0100)
begin
TEMP[11:8]=TEMP[11:8]+3;
end
if (TEMP[15:12]>4'b0100)
begin
TEMP[15:12]=TEMP[15:12]+3;
end
if (TEMP[19:16]>4'b0100)
begin
TEMP[19:16]=TEMP[19:16]+3;
end
{BW, BQ, BB, BS, BG}={TEMP[18:0], A[0]}; end
end
endmodule。