วันศุกร์ที่ 26 กุมภาพันธ์ พ.ศ. 2559

full adder n bit

ในการทำ 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


ไม่มีความคิดเห็น:

แสดงความคิดเห็น