二位BCD码加法器的VHDL源程序如下:
ibrary ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity bcdadd is ---------------------实体部分
port(key:in std_logic;---------------定义key输入口
a0,a1,b0,b1:in integer range 0 to 9; -----定义两个加数的输入口
a0l,a1l,b0l,b1l,s0l,s1l,s2l:out std_logic_vector(6 downto 0);----定义七个输出数码管s:out std_logic);----定义Key指示灯输出口
end;
architecture one of bcdadd is ----------结构体部分
signal one:integer range 0 to 18; ----定义两个数的个位相加之后的信号
signal ten:integer range 0 to 19; -----定义两个数的十位相加之后的信号
signal co1,co2:integer range 0 to 1; ----定义个位和十位的进位信号
signal s0,s1:integer range 0 to 15;
begin
p1:process(one,ten,a0,b0,a1,b1,co1)----第一个进程,进行加运算
begin
one<=a0+b0; --------------------个位相加之和
if one>9 then--------------------和大于9,进位为1
co1<=1;
s0<=one-10; -----------------------个位的值
else -----------------------和小于9,进位为0
co1<=0;
s0<=one; -------------------------个位的值
end if;
ten<=a1+b1+co1;----------------------十位相加值和,加数包括个位来的进位
if ten>9 then -------------------和大于9,进位为1
co2<=1;
s1<=ten-10;-------------------十位的值
else ----------------------------------和小于9,进位为0
co2<=0;
s1<=ten;-----------------------十位的值
end if;
end process p1;
p2:process(a0,a1,b0,b1) ----------第二个进程,两个加数的输出数码管显示译码
begin
case a0 is ----------------------被加数的个位显示译码
when 0=>a0l<="1000000";
when 1=>a0l<="1111001";
when 2=>a0l<="0100100";
when 3=>a0l<="0110000";
when 4=>a0l<="0011001";
when 5=>a0l<="0010010";
when 6=>a0l<="0000010";
when 7=>a0l<="1111000";
when 8=>a0l<="0000000";
when 9=>a0l<="0010000";
when others=>a0l<="ZZZZZZZ";
end case;
case a1 is ------------------------------被加数的十位显示译码when 0=>a1l<="1000000";
when 1=>a1l<="1111001";
when 2=>a1l<="0100100";
when 3=>a1l<="0110000";
when 4=>a1l<="0011001";
when 5=>a1l<="0010010";
when 6=>a1l<="0000010";
when 7=>a1l<="1111000";
when 8=>a1l<="0000000";
when 9=>a1l<="0010000";
when others=>a1l<="ZZZZZZZ";
end case;
case b0 is-----------------------------加数的个位显示译码when 0=>b0l<="1000000";
when 1=>b0l<="1111001";
when 2=>b0l<="0100100";
when 3=>b0l<="0110000";
when 4=>b0l<="0011001";
when 5=>b0l<="0010010";
when 6=>b0l<="0000010";
when 7=>b0l<="1111000";
when 8=>b0l<="0000000";
when 9=>b0l<="0010000";
when others=>b0l<="ZZZZZZZ";
end case;
case b1 is ----------------------------加数的十位显示译码when 0=>b1l<="1000000";
when 1=>b1l<="1111001";
when 2=>b1l<="0100100";
when 3=>b1l<="0110000";
when 4=>b1l<="0011001";
when 5=>b1l<="0010010";
when 6=>b1l<="0000010";
when 7=>b1l<="1111000";
when 8=>b1l<="0000000";
when 9=>b1l<="0010000";
when others=>b1l<="ZZZZZZZ";
en d case;
end process p2;
p3:process(key,s0,s1,co2,a0,a1,b0,b1) --------第三个进程,和的显示译码以及输入大于9是的出
来
begin
if key='0' or a0>9 or b0>9 or a1>9 or b1>9 then --当key等于0或者两个输入中的任何
一个位大于9,和的数码显示均为“Z”状态s0l<="ZZZZZZZ";
s1l<="ZZZZZZZ";
s2l<="ZZZZZZZ";
else
case s0 is-------------------------------和的个位显示译码
when 0=>s0l<="1000000";
when 1=>s0l<="1111001";
when 2=>s0l<="0100100";
when 3=>s0l<="0110000";
when 4=>s0l<="0011001";
when 5=>s0l<="0010010";
when 6=>s0l<="0000010";
when 7=>s0l<="1111000";
when 8=>s0l<="0000000";
when 9=>s0l<="0010000";
when others=>s0l<="ZZZZZZZ";
end case;
case s1 is--------------------------------和的十位显示译码
when 0=>s1l<="1000000";
when 1=>s1l<="1111001";
when 2=>s1l<="0100100";
when 3=>s1l<="0110000";
when 4=>s1l<="0011001";
when 5=>s1l<="0010010";
when 6=>s1l<="0000010";
when 7=>s1l<="1111000";
when 8=>s1l<="0000000";
when 9=>s1l<="0010000";
when others=>s1l<="ZZZZZZZ";
end case;
case co2 is --------------------------和的百位显示译码
when 0=>s2l<="1000000";
when 1=>s2l<="1111001";
end case;
end if;
end process p3;
p4:process(key) -------------第四个进程,设置key的指示灯begin
i f key='1' then
s<='1' ;
else s<='0';
end if;
end process p4;
end;