VHDL实现BCD码加法器
BCD码加法器计算两个四位二进制数的相加值,
由9个输入端和5个输出端组成,分为相加,修正判别和修正三个阶段。
在相加值为0-9时,BCD码与四位二进制码相同,
当值为10-15时,BCD码等于四位二进制码加上“0110”。
如图所示:
相加模块与四位全加器实现功能相同,将对其进行例化使用:
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;
保存后仿真:
也可以换种方式实现:
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;
保存后仿真: