VHDL实现BCD码加法器

VHDL实现BCD码加法器

BCD码加法器计算两个四位二进制数的相加值,
由9个输入端和5个输出端组成,分为相加,修正判别和修正三个阶段。
在相加值为0-9时,BCD码与四位二进制码相同,
当值为10-15时,BCD码等于四位二进制码加上“0110”。

如图所示:
VHDL实现BCD码加法器_第1张图片
相加模块与四位全加器实现功能相同,将对其进行例化使用:

LIBRARY IEEE;                                                             --结构描述方式实现BCD码加法器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY	homework8 IS
	PORT(
	AA,BB:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	FF:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);      --FF为最终输出
	CIN:IN STD_LOGIC;
	COUT:OUT STD_LOGIC
	);
END homework8;
ARCHITECTURE yejiayu OF homework8 IS
COMPONENT homework6						
	PORT(
	A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	F:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);       --四位全加器的输出   
	CI:IN STD_LOGIC;                          --低位
	CO:OUT STD_LOGIC						  --高位
	);
END COMPONENT homework6;
											  --修正判别过渡
	SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q1接手四位全加器的输出
	SIGNAL Q2:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q2为修正被加数
	SIGNAL COU1:STD_LOGIC;					  
	SIGNAL COU2:STD_LOGIC;					 
BEGIN
	U1:homework6 PORT MAP(A=>AA,B=>BB,CI=>CIN,F=>Q1,CO=>COU1);--修正判别
	COU2<=NOT((NOT COU1)AND(NOT(Q1(3) AND Q1(2)))AND(NOT(Q1(3) AND Q1(1))));
    Q2<=(2=>COU2,3=>COU2,OTHERS =>'0');       --被加数的2,3位与COU2相连,其余接地
    U2:homework6 PORT MAP(A=>Q2,B=>Q1,CI=>'0',F=>FF,CO=>COU1);--修正
END yejiayu;

保存后仿真:
VHDL实现BCD码加法器_第2张图片
也可以换种方式实现:

LIBRARY IEEE;																--行为描述方式实现
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY	homework9 IS
	PORT(
	AA,BB:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	FF:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);      --FF为最终输出
	CIN:IN STD_LOGIC;
	COUT:OUT STD_LOGIC
	);
END homework9;
ARCHITECTURE yejiayu OF homework9 IS
COMPONENT homework6						
	PORT(
	A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	F:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);       --四位全加器的输出   
	CI:IN STD_LOGIC;                          --低位
	CO:OUT STD_LOGIC						  --高位
	);
END COMPONENT homework6;
											  --修正判别过渡
	SIGNAL Q1:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q1接手四位全加器的输出
	SIGNAL Q2:STD_LOGIC_VECTOR(3 DOWNTO 0);   --Q2为修正被加数
	SIGNAL COU1:STD_LOGIC;					  
	SIGNAL COU2:STD_LOGIC;					 
BEGIN
	U1:homework6 PORT MAP(A=>AA,B=>BB,CI=>CIN,F=>Q1,CO=>COU1);--修正判别
	PROCESS(AA,BB,CIN)
		BEGIN
		IF(COU1='1')THEN					  --和>15时
			Q2<=Q1+6;
		ELSIF(Q1>9)THEN						  --和>9时
			COU2<='1';
			Q2<=Q1-10;
		ELSIF(Q1<10)THEN
			COU2<='0';
			Q2<=Q1;
		END IF;
		FF<=Q2; 							  --值传给FF
		COUT<=COU2;							  --值传给COUT
	END PROCESS;
END yejiayu;

保存后仿真:
VHDL实现BCD码加法器_第3张图片

你可能感兴趣的:(VHDL,vhdl)