一 设计原理
1.课题认识
加法器是为了实现加法的。即是产生数的和的装置。加数和被加数为输入,和数与进位为输出的装置为半加器。若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。常用作计算机算术逻辑部件,执行逻辑操作、移位与指令调用。 由任务书可知,本次课题要解决的问题如下:
1.四位加法器的设计。
2.两个四位加法器级联为八位加法器的问题。
4.动态显示的问题。
2.设计思路
8位加法器采用两个4位二进制并行加法器级联而成。 四位加法器可以采用四个一位全加器级连成串行进位加法器,实现框图如下图所示。 课题要求计算的和要用十进制显示,并要求动态显示。可以设计一个9位二进制显示为十进制的子程序,并采用分频,来实现动态显示!
用两个并行四位加法器实现一个八位加法器的框图如下:
二 设计过程
有设计思路可知,要实现8位加法器,需要三个子程序:1. 4位加法器;2.十进制显示环节;3.动态显示环节。
1. 4位二进制并行加法器的设计
① 运用四个全加器级连成串行进位加法器。程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADD4 IS
Port(A,B:in STD_logic_vector(3 downto 0); --输入四位二进制。
ci:in STD_logic; --输入进位。金属防水接头
co: out STD_logic; --输出进位。
so:out STD_logic_vector(3 downto 0) ); --输出和。
end;
ARCHITECTURE h1 of ADD4 is
begin
process(A,B)
variable cq, qq, sq: STD_logic_vector(3 downto 0);
begin
qq(0):= not(A(0) XOR (NOT (B(0)))); sq(0):= not(qq(0) XOR (NOT(ci))); --低位相加并
if ((A(0) xor B(0))='1') then cq(0):= ci; --产生进位。
ELSE cq(0):=A(0); END if;
qq(1):= not(A(1) xor (NOT(B(1)))); sq(1):= not(qq(1) xor (NOT(cq(0)))); --第二位于前一进 if((A(1) xor B(1))='1') Then cq(1):= cq(0); -- 位相加,并产生进位。
ELSE cq(1):=A(1); END if;
qq(2):= not(A(2) XOR (NOT(B(2))));sq(2):= not(qq(2) XOR (NOT(cq(1))));
if ((A(2) xor B(2))='1') then cq(2):= cq(1);
ELSE cq(2):=A(2); END if;
qq(3):=not(A(3) XOR (NOT B(3))); sq(3):=not(qq(3) XOR (NOT(cq(2)))); --前一位位进位
if ((A(3) xor B(3))='1') then cq(3):= cq(2); --与高位相加并产生进位。
433m天线 ELSE cq(3):=A(3); END if;
Co<=cq(3); So<=sq; End process; End architecture h1;
太阳能玻璃② 四位并行加法器波形如下:
2. 转换显示设计
① 加法器得到的和为二进制,设计以下程序使它显示为十进制。程序如下:
library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;
entity look is
port(d:in std_logic_vector(8 downto 0); --输入要转换的二进制。
clk3:in std_logic;
smg: out std_logic_vector(2 downto 0); --位选,分别显示个位,十位,百位。
led7s:out std_logic_vector(6 downto 0));
end;
architecture one of look is
signal ai,bi,ci:integer range 0 to 9;
signal xi:std_logic_vector(2 downto 0);
signal led7s1:std_logic_vector(20 downto 0);
signal di:integer range 0 to 512;
begin
di<=conv_integer(d); --把8位二进制加进位转为整型。
process(di)
variable a,b,c:integer range 0 to 9;
begin
a:=di rem 10; --把整型数的个位赋值给a.。
b:=((di-a) rem 100)/10; --把整型数的十位赋值给b。
c:=(di-a-10*b)/100; --把整型数的百位赋值给c。
ai<=a;bi<=b;ci<=c; end process;乙基氯化物
process(ai) --把个位赋值给led7s1显示出来。
begin
case ai is
when 0=>led7s1(6 downto 0)<="1000000";
when 1=>led7s1(6 downto 0)<="1111001";
when 2=>led7s1(6 downto 0)<="0100100";
when 3=>led7s1(6 downto 0)<="0110000";
when 4=>led7s1(6 downto 0)<="0011001";
when 5=>led7s1(6 downto 0)<="0010010";
when 6=>led7s1(6 downto 0)<="0000010";
when 7=>led7s1(6 downto 0)<="1111000";
when 8=>led7s1(6 downto 0)<="0000000";
when 9=>led7s1(6 downto 0)<="0010000";
when others=>led7s1(6 downto 0)<="XXXXXXX";
end case; end process;
process(bi) -- 把十位赋值给led7s1显示出来.。
begin
case bi is
when 0=>led7s1(13 downto 7)<="1000000";
when 1=>led7s1(13 downto 7)<="1111001";
when 2=>led7s1(13 downto 7)<="0100100";
when 3=>led7s1(13 downto 7)<="0110000";
when 4=>led7s1(13 downto 7)<="0011001";
when 5=>led7s1(13 downto 7)<="0010010";
when 6=>led7s1(13 downto 7)<="0000010";
when 7=>led7s1(13 downto 7)<="1111000";
when 8=>led7s1(13 downto 7)<="0000000";
盖型螺母 when 9=>led7s1(13 downto 7)<="0010000";
桥架接头 when others=>led7s1(13 downto 7)<="XXXXXXX";
end case; end process;
process(ci) --把百位赋值给led7s1显示出来.。
begin
case ci is
when 0=>led7s1(20 downto 14)<="1000000";
when 1=>led7s1(20 downto 14)<="1111001";
when 2=>led7s1(20 downto 14)<="0100100";