ในการทำ full adder ขนาด n bit คือการนำ full adder 1 bit มาต่ออนุกรมกันโดย โดย carryout(เลขทด
จาก bit ก่อนหน้า)จะต่อไปยัง carry in ของ bit ถัดไป และ
รูปวงจร full adder ขนาด 8 bit
ที่มา:ไฟล์ pdf handout2 ประกอบการเรียนวิชา computer organization
จากรูปจะมีขาควบคุมการ บวกและลบอยู่เรียก sub ถ้าเป็น 0 ให้บวก ถ้า เป็น 1 ให้ ลบ
โดยการลบกันของเลขฐานสองก็คือ การบวกด้วยเลขจำนวนเต็มลบ
เช่น 7-3 คือ 7+(-3) = 4
โดยการจะเปลี่ยนค่าจาก 3 เป็น -3 เพื่อ จะนำมาบวกในวงจร full adder จะใช้วิธีการ 2 Complement
เลข 3 คือ 0011 ให้สลับเลขทุก bit เป็นค่าตรงกันข้ามและ บวก 1
และค่อยนำค่าที่ทำ 2Complement แล้วไป บวกกับ ตัวตั้ง(A)
เมื่อนำหลักการนี้มาออกแบบวงจรด้วย quartus เขียนด้วยภาษา vhdl
library ieee;
use ieee.std_logic_1164.all;
entity add_sub is
generic(WIDTH : integer := 8);
Port ( a : in STD_LOGIC_VECTOR (WIDTH-1 downto 0);
b : in STD_LOGIC_VECTOR (WIDTH-1 downto 0);
addsub : in STD_LOGIC;
o : out STD_LOGIC_VECTOR (WIDTH-1 downto 0);
cout : out STD_LOGIC);
end add_sub;
architecture behave of add_sub is
signal carry : std_LOGIC_VECTOR(WIDTH downto 0);
signal b_xor_sub : std_LOGIC_VECTOR(WIDTH-1 downto 0);
component full_adder is
port(
a , b, c_in : in std_logic; -- a เป็นตัวตั้ง, b เป็นตัวบวก, c_in คือ ตัวทดจากหลักก่อนหน้า
sum,c_out : out std_logic); -- sub คือผลบวก, c_out คือตัวทดไปหลักถัดไป
end component;
component xor2 is
port(
a: in std_logic;
b: in std_logic;
y: out std_logic
);
end component;
begin
U0: xor2 port map(addsub,'0',carry(0));
adder : for i in 0 to WIDTH-1 generate
U1 : xor2 port map(b(i),addsub,b_xor_sub(i));
adder : full_adder port map(a(i),b_xor_sub(i),carry(i),o(i),carry(i+1));
end generate;
U2: xor2 port map(carry(WIDTH),addsub,cout);
end behave;
รูป Vhdl Testbench (จำลองการทำงาน)
เมื่อให้ขา addsub เป็น 0 คือ การนำ a และ b มา บวกกัน 22+80 ได้ 102
เมื่อให้ขา addsub เป็น 1 คือ การนำ a และ b มาลบกัน 22-80 ได้ -58
ไม่มีความคิดเห็น:
แสดงความคิดเห็น