二进制转8421BCD码——移位加三法

1.简介

二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。

2.移位加三法

移位加三法实现过程:从二进制的高位开始向BCD寄存器中移入二进制数据,依次经过BCD寄存器的个、十、百等位,直到所有的二进制数移入到BCD寄存器中。每次移位,判断个、十、百等是否大于4,若大于则对应位加3,否则不变。例如:(11110011)转BCD,对应十进制为243,故BCD表示为(0010_0100_0011)。移位过程如下:
在这里插入图片描述
需要注意的是最后一次移位不需要在判断是否加三

Verilog实现

module binary2bcd (
	input clk,
	input rst_n,
	input ready,
	input [15:0]data,
	output reg done,
	output reg [23:0]bcd
);

parameter DATAWIDTH = 8;

parameter IDLE = 4'b0001;
parameter SHIFT = 4'b0010;
parameter ADD = 4'b0100;
parameter DONE = 4'b1000;

reg [27:0]bcd_tmp;			//临时移位寄存器
reg [3:0]cnt;				//移位计数器
reg [3:0]state, nstate;		

always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		state <= IDLE;
	else
		state <= nstate;
end

always @(*)begin
	case(state)
		IDLE:	nstate = (ready) ? SHIFT : IDLE;
		SHIFT:	nstate = (cnt == DATAWIDTH - 1) ? DONE : ADD;		//由于非阻塞赋值延迟一个周期,故需要减1
		ADD:	nstate = SHIFT;
		DONE:	nstate = IDLE;
		default:nstate = IDLE;
	endcase
end

always @(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		cnt <= 'b0;
		done <= 'b0;
		bcd_tmp <= 'b0;
	end
	else case(state)
		IDLE:	begin
				cnt <= 'b0;
				done <= 0;
				bcd_tmp <= {'b0,data};
				end
		SHIFT:	begin
				bcd_tmp <= bcd_tmp << 1;
				cnt <= cnt + 1;
				end
		ADD:	begin
				bcd_tmp[11:8] <= (bcd_tmp[11:8] > 4) ? (bcd_tmp[11:8] + 4'b0011) : bcd_tmp[11:8];
				bcd_tmp[15:12] <= (bcd_tmp[15:12] > 4) ? (bcd_tmp[15:12] + 4'b0011) : bcd_tmp[15:12];
				bcd_tmp[19:16] <= (bcd_tmp[19:16] > 4) ? (bcd_tmp[19:16] + 4'b0011) : bcd_tmp[19:16];
				bcd_tmp[23:20] <= (bcd_tmp[23:20] > 4) ? (bcd_tmp[23:20] + 4'b0011) : bcd_tmp[23:20];
				bcd_tmp[27:24] <= (bcd_tmp[27:24] > 4) ? (bcd_tmp[27:24] + 4'b0011) : bcd_tmp[27:24];
				end
		DONE:	begin
				done <= 1;
				bcd <= {4'b0000,bcd_tmp[27:8]};
				end
		default:;
	endcase
					
end


endmodule

参考博客:https://blog.csdn.net/Reborn_Lee/article/details/106949149?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170368210016800192283413%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170368210016800192283413&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-106949149-null-null.nonecase&utm_term=bcd&spm=1018.2226.3001.4450

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值