1. 实验任务
- 设计并实现一个n(n=8)的全加器
2. 如何实现
先设计出一个半加器
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder_1 IS PORT (A,B:IN STD_LOGIC; SO,CO:OUT STD_LOGIC); END ENTITY h_adder_1; ARCHITECTURE fh1 OF h_adder_1 IS BEGIN SO<=A XOR B; CO<=A AND B;--SO是数值位,CO是进位位 END ARCHITECTURE fh1;
接着设计出一位的全加器
运用原件例化语句,将设计好的半加器进行封装后,根据真值表,进过卡诺图化简,得到全加器的组合逻辑,进而设计出全加器的组合电路。
--一位全加器 library ieee; use ieee.std_logic_1164.all; entity f_adder_1 is port(ain,bin,cin:in std_logic; cout,sum: out std_logic); end entity f_adder_1; architecture behav of f_adder_1 is component h_adder_1 port(A,B:in std_logic; CO,SO :out std_logic); end component; component or2a port (a,b: in std_logic; c: out std_logic); end component; signal net1,net2,net3:std_logic; begin u1: h_adder_1 port map(A=>ain,B=>bin,CO=>net2,SO=>net1); u2: h_adder_1 port map(net1,cin,net3,sum); u3: or2a port map(a=>net2,b=>net3,c=>cout); end architecture behav;
其中的两输入或门可以调用系统元件库也可以自己设计和封装,或者通过画图的方式来实现,本人是通过编程的方式来实现的,即在相同的文件夹下,新建VHDL文件,然后编写或门。
--两输入或门 library ieee; use ieee.std_logic_1164.all; entity or2a is port (a,b :in std_logic; c: out std_logic); end entity or2a; architecture one of or2a is begin c<=a or b; end architecture one;
多位全加器的设计
library ieee; use ieee.std_logic_1164.all; entity f_adder_n is generic (n:integer :=8); port(q: out std_logic_vector(0 to n-1); a:in std_logic_vector(0 to n-1); b:in std_logic_vector(0 to n-1); in_1: in std_logic; cout_n:out std_logic); end entity f_adder_n; architecture behav of f_adder_n is component f_adder_1 port(ain,bin,cin:in std_logic; cout,sum: out std_logic); end component; signal cc:std_logic_vector(0 to n); begin --<=in_1; q_1:for i in 0 to n-1 generate f_adder: f_adder_1 port map (a(i),b(i),cc(i),cc(i+1),q(i)); end generate; cout_n<=cc(n); end architecture behav;
3. 实验结果
- RTL
- 仿真图