二进制转BCD码(8421)

       在显示温度、电压、电流等数据时,通常需要将二进制数据转成十进制进行显示。最常用的方法是将二进制码转换成BCD码(8421)。

       8421码:它只选用了四位二进制码中前10组代码,即用0000~1001分别代表它所对应的十进制数,余下的六组代码不用。

       我们将二进制数(1101_0101)转换成十进制数(27+26+24+22+20),对于硬件来说,我们用乘方描述会浪费很多资源。于是,我们迫切寻找一个优化方案。

       当我们将乘方通过二项式定理展开((((((2+1)*2+0)*2+1)*2+0)*2+1)*2+0)*2+1)之后,我们好像去掉了乘方。((((((2+1)*2+0)*2+1)*2+0)*2+1)*2+0)*2+1)=(((((((0+1)2+1)*2+0)*2+1)*2+0)*2+1)*2+0)*2+1)

       我们发现,二项式乘的系数是2。在编程中,乘2可以用移位来代替。通过一系列优化之后发现,二进制数转换成十进制数就只需要移位和加法运算。

由于BCD码是4个位宽,所以我们在判断时以4个位宽进行判断。将满16进1调整为满10进1。

二项式

(BCD)BIN

(0+1)

=(1)0001

((0+1)2+1)

=(3)0011

(((0+1)2+1)*2+0)

=(6)0110

((((0+1)2+1)*2+0)*2+1)

=()1101

由于我们要转换成BCD码,不可能出现1101的情况,所以当上一个值大于等于5时,就先要进行加3,再移位。很多人不明白为什么是加3?其实,当上一个值大于等于5时,说明我们移位后的值会大于等于10,所以我们需要向前进一位,而4位二进制是满16才进一位。这时候我们就需要将数值中的10变成16,可以将该数值加6。对上一个值来说,就是加3。

二项式

(BCD)BIN

(0+1)

=(1)0001

((0+1)2+1)

=(3)0011

(((0+1)2+1)*2+0)

=(6)0110

((((0+1)2+1)*2+0)*2+1)

=(13)1_0011

(((((0+1)2+1)*2+0)*2+1)*2+0)

=(26)10_0110

((((((0+1)2+1)*2+0)*2+1)*2+0)*2+1)

=(53)101_0011

(((((((0+1)2+1)*2+0)*2+1)*2+0)*2+1)*2+0)

=(106)1_0000_0110

((((((((0+1)2+1)*2+0)*2+1)*2+0)*2+1)*2+0)*2+1)

=(213)10_0001_0011

由于转换是串行执行,二进制数的位宽为多少就有几个时钟周期的延时。例如 :1MHz的时钟周期,二进制数的位宽为1000位,延迟时间为1ms,对于人眼来说,不过一眨眼而已。

下面是我一起将AD_TCL549数据经过该模块转换后在数码管显示时所使用的代码,有点缺陷,但能使用。具体的代码说明会在写AD_TCL549时描述

module	BCD (
	input	wire			clk		,
	input	wire			rst_n	,
	input	wire			data_flag,
	input	wire	[11:0]	din		,
	
	output	reg				dout_en,
	output	reg		[15:0]	dout
	);

//cnt_12
	reg	[3:0]	cnt_12;
parameter	CNT_12_MAX	=	12;
always@(posedge	clk or negedge	rst_n)
	if(!rst_n)
		cnt_12	<=	0;
	else if(cnt_12==CNT_12_MAX)
		cnt_12	<=	0;
	else if(data_flag || cnt_12)
		cnt_12	<=	cnt_12	+1'b1;

//dout
always@(posedge	clk or negedge	rst_n)
	if(!rst_n)
    	dout	=	0;
    else if(data_flag)
    	dout	=	0;
    else if(cnt_12)
        begin
        	if(dout[3:0]>=5)
        		dout[3:0]	= dout[3:0]		+3;
           	if(dout[7:4]>=5)
           		dout[7:4]	= dout[7:4]		+3; 
           	if(dout[11:8]>=5)
           		dout[11:8]	= dout[11:8]	+3;
           	if(dout[15:12]>=5)
           		dout[15:12]	= dout[15:12]	+3;
           	dout	=	{dout[14:0],din[12-cnt_12]};
        end

//dout_en
always@(posedge	clk or negedge	rst_n)
	if(!rst_n)
    	dout_en	<=	0;
    else if(cnt_12==CNT_12_MAX)
    	dout_en	<=	1;
    else
    	dout_en	<=	0;

endmodule

 

### 回答1: 二进制BCD码电路是一种常用的字电路,用于将二进制换为BCD码二进制编码的十进制)。 在Multisim中创建二进制BCD码电路,我们可以使用逻辑门和触发器来实现。以下是一个简单的二进制BCD码的电路设计。 首先,创建一个4二进制输入(A0,A1,A2,A3)和一个4BCD码输出(B0,B1,B2,B3),以及一个时钟输入(CLK)。 然后,使用4个2输入AND门和4个2输入OR门来实现逻辑功能。将输入A0至A3与逻辑门的输入相连,再通过一系列的逻辑门连接和配置,将二进制换为BCD码。 接下来,使用4个触发器来存储换后的BCD码。将逻辑门的输出连接到触发器的输入,并使用时钟输入触发触发器,使其在每个时钟脉冲周期中更新输出。 最后,将触发器的输出连接到BCD码输出端口B0至B3。 完成这个电路设计后,运行Multisim并进行仿真。输入一个二进制,然后观察BCD码输出是否正确。如果输出与预期一致,说明二进制BCD码电路设计成功。 需要注意的是,这只是一个简单的二进制BCD码电路设计示例。在实际应用中,可能需要更复杂的设计来处理更多二进制换。 ### 回答2: 二进制BCD码电路是将二进制换为二进制编码的十进制的电路。以下是使用Multisim软件创建和模拟二进制BCD码电路的步骤: 1. 打开Multisim软件,并选择一个适当的电路板以及所需的组件,如逻辑门、多路复用器和显示模块。 2. 在电路板上放置所需的组件并连接它们。在这个电路中,你需要使用多个逻辑门来实现二进制BCD码换。常用的逻辑门有与门、或门和非门。你还可以使用多路复用器来选择要显示的结果。 3. 连接并设置逻辑门。在这个电路中,你需要将二进制的各连接到逻辑门的输入端,然后使用逻辑门来处理和二进制。 4. 连接显示模块。将换后的BCD码连接到显示模块,以便将结果显示出来。 5. 进行仿真。在Multisim中,你可以运行仿真来测试和验证你的电路设计。通过输入不同的二进制并观察显示模块的输出来确保电路的正确性。 在设计电路时,还需要考虑到源电压和输入输出的电平兼容性,以及逻辑门的延迟和反相特性等因素。通过合理选择器件和连接方式,可以实现二进制BCD码换。通过Multisim软件的仿真功能,可以验证电路设计的正确性和性能。 这是一个基本的二进制BCD码电路设计过程的简要描述。在实际设计中,可能还需要进行进一步的优化和完善,以满足具体的应用需求。 ### 回答3: 二进制BCD码是一种常见的字编码方式,其中BCD代表二进制编码十进制。在电路设计中,我们可以使用最简单和常见的方法来实现二进制BCD码的电路原理,即使用倒器和BCD编码器。 首先,将一个4二进制输入到倒器中。倒器是一种特殊的计器,它会从输入开始计,并在每次计完成后减1,直到计器为0。 然后,将倒器的输出连接到BCD编码器的输入。BCD编码器是一种字电路,将4二进制换为相应的BCD码。它的输出由4个BCD码组成,每个BCD码表示一个十进制。 最后,将BCD编码器的输出连接到显示器或其他输出设备,以显示二进制对应的BCD码。 在Multisim中,我们可以使用组合逻辑电路来实现二进制BCD码的电路。首先,选择适当的倒器和BCD编码器的芯片模型,并连接它们的输入和输出。然后,将二进制输入连接到倒器的输入端,并将BCD编码器的输出连接到显示器或其他输出设备。 通过正确连接和配置这些元件,我们可以实现一个完整的二进制BCD码的电路。在Multisim中,我们可以模拟和调试这个电路,以确保它能够正常工作,并将二进制换为BCD码。 总之,通过使用倒器和BCD编码器,我们可以设计一个简单的电路来实现二进制BCD码。在Multisim中,我们可以使用适当的芯片模型和连接来实现这个电路,并通过模拟和调试来验证它的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值