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;
保存后仿真: