الدرس الثالث عشر – بناء معالج خاص ذو بنية تفرعية

سلسلة من الدروس في لغة توصيف العتاد الصلبVHDL

الدرس الثالث عشر – بناء معالج خاص ذو بنية تفرعية

مهمة المعالج 

بفرض لدينا قفل إلكتروني لباب شركة، يفتح القفل عندما يتأكد من هوية الشخص بطريقة ما(كلمة مرور، بطاقة لونية ، مسح البصمة).

يقرأ المعالج البيانات الواردة المدخلة من المستخدم على شكل 2 بايت من البيانات و يبحث في الذاكرة المتصلة به عن هذه البيانات، في حال وجودها في إحدى الحجر الذاكرية يرسل إشارة تسمح بفتح الباب.

بشكل عملي أكثر إن مهمة المعالج هي مقارنة البيانات الواردة مع جميع الحجرات الذاكرية.

بنية النظام الرقمي التسلسلي

بنية المعالج

–         دخل 16 بت لقراءة البيانات.

–         إشارة دخل توعز للمعالج بالبدء بالبحث.

–         إشارة خرج تسمح / لا تسمح بفتح الباب.

–         عناوين الحجرات الذاكرية، و هي متسلسلة من 1 إلى 100.

سلوك المعالج:

عند وصول إشارة البدء بالبحث Run = ‘1’ يقرأ المعالج القيمة المدخلة من المستخدم و يحتفظ بها، و يبدأ بمقارنتها بشكل تسلسلي مع البيانات المخزنة في الحجرات الذاكرية. عند إيجاد القيمة المدخلة في إحدى الحجرات الذاكرية يتوقف المعالج عن البحث في الذاكرة و يعطي إشارة توضح إنهاء العملية بنجاح Done =‘1‘ . أما في حال انتهاء البحث دون إيجاد القيمة المدخلة فيتوقف المعالج عن العمل و يعطي إشارة توضح عدم وجود القيمة المدخلة في الذاكرة Done =‘0‘.

يتم توليد عنوان الحجرة الذاكرية في بداية كل عملية مقارنة.

عملية المقارنة هي إيجاد الفرق بين القيمتين.

يتم توقف عملية البحث (finish := ‘1’;) في أحد حالتين:

–         وجود القيمة التي يتم البحث عنها في الحجرة التي يتم اختبارها حالياً

 IF (Done <=‘1‘ AND temp < 101)

–         عدم وجود القيمة في أي حجرة من الذاكرة

 IF (Done <=‘0‘ AND temp = 101)

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_signed.all;

——————————————————————

ENTITY s_proc IS

PORT ( DIN,RIN        :IN    STD_LOGIC_VECTOR(15 DOWNTO 0);

           Clock,Run      :IN     STD_LOGIC;

           Address         : OUT INTEGER RANGE 0 TO 100;

            Done            : OUT  STD_LOGIC);

END s_proc;

————————————————————

ARCHITECTURE Behavioral OF s_proc IS

SIGNAL A : STD_LOGIC_VECTOR(15 DOWNTO 0);

BEGIN

PROCESS(Clock,Run)

VARIABLE finish : STD_LOGIC := ‘0’;

VARIABLE temp : INTEGER RANGE 0 TO 101 := 0;

BEGIN

IF(Clock’EVENT AND Clock = ‘1’)THEN

IF(Run = ‘1’) THEN

A <= DIN;

Done <= ‘X’;

temp := 0;

finish := ‘0’;

END IF;

IF(finish = ‘0’)THEN

temp := temp + 1;

IF (temp = 101) THEN

finish := ‘1’;

Done <= ‘0’;

ELSIF((A – RIN) = X”0000″)THEN

finish := ‘1’;

Done <= ‘1’;

END IF;

END IF;

END IF;

Address  <= temp;

END PROCESS;

END Behavioral;

بنية الذاكرة

–         200 بايت منظمة على شكل 100 سطر.

–         مدخل عناوين.

–         مخرج بيانات بعرض 16بت.

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

————————————–

ENTITY ROM IS

PORT( address     : IN INTEGER RANGE 0 TO 100;

            read_data : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END ROM;

————————————–

ARCHITECTURE behavioral OF ROM IS

  TYPE memArray IS ARRAY (0 TO 100) OF STD_LOGIC_VECTOR (15 DOWNTO 0);

  SIGNAL mem : memArray;

 BEGIN

 passwords:FOR i IN 0 TO 100 GENERATE

                       mem(i) <= conv_std_logic_vector(i,16);

                   END GENERATE;

 PROCESS (address)

 BEGIN

read_data <= mem (address);

 END PROCESS;

END behavioral;

بنية النظام

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_signed.all;

——————————————————————

ENTITY serial_lock IS

PORT ( DIN                      :IN     STD_LOGIC_VECTOR(15 DOWNTO 0);

            Clock,Run             :IN     STD_LOGIC;

            Done                     :OUT  STD_LOGIC);

END serial_lock;

ARCHITECTURE Structural OF serial_lock IS

———– COMPONENTS————-

COMPONENT s_proc IS

PORT ( DIN,RIN         :IN    STD_LOGIC_VECTOR(15 DOWNTO 0);

             Clock,Run     :IN     STD_LOGIC;

              Address       : OUT INTEGER RANGE 0 TO 100;

              Done            : OUT  STD_LOGIC);

END COMPONENT;

COMPONENT ROM IS

PORT( address  : IN INTEGER RANGE 0 TO 64;

        read_data  : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END COMPONENT;

———SIGNALS———

SIGNAL RIN : STD_LOGIC_VECTOR(15 DOWNTO 0);

SIGNAL Address : INTEGER RANGE 0 TO 100;

———ARCHITECTURE———-

BEGIN

proc0:s_proc

PORT MAP(DIN,RIN,Clock,Run,Address,Done);

DATA_Mem:ROM

PORT MAP(Address,RIN);

END Structural;

نلاحظ أننا نحتاج عدد من نبضات الساعة يساوي إلى عنوان موقع الحجرة الذاكرية التي تحتوي البيانات التي يتم البحث عنها(البحث عن 3 احتاج 3 نبضات و البحث عن 10 احتاج 10 نبضات). و نحتاج بالتالي لــ 100 نبضة لاكتشاف أن القيمة التي نبحث عنها غير موجودة في الذاكرة.

بنية النظام الرقمي التفرعي

بهدف اختصار الزمن اللازم للبحث سنحول النظام إلى بنية تفرعية مكونة من أربعة معالجات تعمل على التوازي مع بعضها يبحث كل منها في ذاكرة بيانات خاصة به تحوي ربع كمية البيانات الموجودة في البينة التسلسلية.

مشاكل و حلول

–         بما أن البيانات المخزنة في كل ذاكرة من الذواكر الأربعة مختلفة عن الأخريات و لا نريد تغيير محتوى الذواكر مع مرور الأيام، سنقوم بتوصيف أربعة ذواكر كل منها يحتوي البيانات المناسبة.

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

————————————–

ENTITY ROM1 IS

PORT( address    : IN INTEGER RANGE 0 TO 25;

          read_data   : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END ROM1;

————————————–

ARCHITECTURE behavioral OF ROM1 IS

  TYPE memArray IS ARRAY (0 TO 25) OF STD_LOGIC_VECTOR (15 DOWNTO 0);

  SIGNAL mem : memArray;

 BEGIN

 passwords:FOR i IN 0 TO 25 GENERATE

                        mem(i) <= conv_std_logic_vector(i,16);

                   END GENERATE;

 PROCESS (address)

BEGIN

read_data <= mem (address);

  END PROCESS;

END behavioral;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

————————————–

ENTITY ROM2 IS

PORT( address     : IN INTEGER RANGE 0 TO 25;

          read_data   : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END ROM2;

————————————–

ARCHITECTURE behavioral OF ROM2 IS

  TYPE memArray IS ARRAY (0 TO 25) OF STD_LOGIC_VECTOR (15 DOWNTO 0);

  SIGNAL mem : memArray;

 BEGIN

passwords:FOR i IN 0 TO 25 GENERATE

mem(i) <= conv_std_logic_vector(i,16) + conv_std_logic_vector(25,16);

END GENERATE;

 PROCESS (address)

BEGIN

read_data <= mem (address);

END PROCESS;

END behavioral;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

————————————–

ENTITY ROM3 IS

PORT( address     : IN INTEGER RANGE 0 TO 25;

           read_data   : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END ROM3;

————————————–

ARCHITECTURE behavioral OF ROM3 IS

  TYPE memArray IS ARRAY (0 TO 25) OF STD_LOGIC_VECTOR (15 DOWNTO 0);

  SIGNAL mem : memArray;

 BEGIN

passwords:FOR i IN 0 TO 25 GENERATE

mem(i) <= conv_std_logic_vector(i,16) + conv_std_logic_vector(50,16);

END GENERATE;

PROCESS (address)

BEGIN

read_data <= mem (address);

END PROCESS;

END behavioral;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

————————————–

ENTITY ROM4 IS

PORT( address    : IN INTEGER RANGE 0 TO 25;

            read_data : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END ROM4;

————————————–

ARCHITECTURE behavioral OF ROM4 IS

  TYPE memArray IS ARRAY (0 TO 25) OF STD_LOGIC_VECTOR (15 DOWNTO 0);

  SIGNAL mem : memArray;

 BEGIN

 passwords:FOR i IN 0 TO 25 GENERATE

mem(i) <= conv_std_logic_vector(i,16) + conv_std_logic_vector(75,16);

END GENERATE;

 PROCESS (address)

BEGIN

read_data <= mem (address);

END PROCESS;

END behavioral;

–         بفرض أننا نريد البحث عن القيمة الــ 79 و الموجودة في الذاكرة 4 في العنوان 4، ستجد النواة 4  القيمة بعد أربع نبضات في حين ستستمر الأنوية الثلاثة الأخرى بالبحث حتى إتمام عملية البحث و الوصول إلى نتيجة حتمية وهي عدم وجود القيمة عندهم. لحل هذه المشكلة لا بد من وجود آلية تخاطب بين الأنوية بحيث تتوقف جميعها عن البحث في حال استطاعت إحداها الوصول إلى القيمة المطلوبة. سنمثل آلية التخاطب بإشارة دخل get تكون مركبة OR من إشارات Done  لكل الأنوية و يتم اختبار هذا المدخل قبل الانتقال لاختبار حجرة ذاكرية جديدة.

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_signed.all;

——————————————————————

ENTITY p_proc IS

PORT ( DIN,RIN                     :IN STD_LOGIC_VECTOR(15 DOWNTO 0);

             Clock,Run,get           :IN  STD_LOGIC;

              Address                   :OUT INTEGER RANGE 0 TO 25;

              Done                        :OUT  STD_LOGIC);

END p_proc;

—————————————————————-

ARCHITECTURE Behavioral OF p_proc IS

SIGNAL A : STD_LOGIC_VECTOR(15 DOWNTO 0);

BEGIN

PROCESS(Clock,Run)

VARIABLE finish : STD_LOGIC := ‘0’;

VARIABLE temp : INTEGER RANGE 0 TO 26 := 0;

BEGIN

IF(Clock’EVENT AND Clock = ‘1’)THEN

IF(Run = ‘1’) THEN

A <= DIN;

Done <= ‘X’;

temp := 0;

finish := ‘0’;

END IF;

IF(finish = ‘0’ AND get /= ‘1’)THEN

temp := temp + 1;

IF (temp = 26) THEN

finish := ‘1’;

Done <= ‘0’;

ELSIF((A – RIN) = X”0000″)THEN

finish := ‘1’;

Done <= ‘1’;

END IF;

END IF;

END IF;

Address  <= temp;

END PROCESS;

END Behavioral;

بنية النظام

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_signed.all;

——————————————————————

ENTITY parallel_lock IS

PORT ( DIN                      :IN    STD_LOGIC_VECTOR(15 DOWNTO 0);

           Clock,Run             :IN     STD_LOGIC;

           Done                     :OUT  STD_LOGIC);

END parallel_lock;

ARCHITECTURE Structural OF parallel_lock IS

———– COMPONENTS————

COMPONENT p_proc IS

PORT ( DIN,RIN              :IN      STD_LOGIC_VECTOR(15 DOWNTO 0);

            Clock,Run,get      :IN      STD_LOGIC;

            Address              :OUT INTEGER RANGE 0 TO 25;

            Done                  :OUT   STD_LOGIC);

END COMPONENT;

COMPONENT ROM1 IS

PORT( address      : IN INTEGER RANGE 0 TO 25;

            read_data : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END COMPONENT;

COMPONENT ROM2 IS

PORT( address      : IN INTEGER RANGE 0 TO 25;

            read_data : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END COMPONENT;

COMPONENT ROM3 IS

PORT( address     : IN INTEGER RANGE 0 TO 25;

            read_data : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END COMPONENT;

COMPONENT ROM4 IS

PORT( address      : IN INTEGER RANGE 0 TO 25;

            read_data : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 ));

END COMPONENT;

——— SIGNALS———–

SIGNAL RIN1 : STD_LOGIC_VECTOR(15 DOWNTO 0);

SIGNAL RIN2 : STD_LOGIC_VECTOR(15 DOWNTO 0);

SIGNAL RIN3 : STD_LOGIC_VECTOR(15 DOWNTO 0);

SIGNAL RIN4 : STD_LOGIC_VECTOR(15 DOWNTO 0);

SIGNAL Address1 : INTEGER RANGE 0 TO 25;

SIGNAL Address2 : INTEGER RANGE 0 TO 25;

SIGNAL Address3 : INTEGER RANGE 0 TO 25;

SIGNAL Address4 : INTEGER RANGE 0 TO 25;

SIGNAL Done1 : STD_LOGIC;

SIGNAL Done2 : STD_LOGIC;

SIGNAL Done3 : STD_LOGIC;

SIGNAL Done4 : STD_LOGIC;

SIGNAL get   : STD_LOGIC;

———ARCHITECTURE———-

BEGIN

 get <= Done1 OR Done2 OR Done3 OR Done4;

proc1:p_proc

PORT MAP(DIN,RIN1,Clock,Run,get,Address1,Done1);

DATA_Mem1:ROM1

PORT MAP(Address1,RIN1);

proc2:p_proc

PORT MAP(DIN,RIN2,Clock,Run,get,Address2,Done2);

DATA_Mem2:ROM2

PORT MAP(Address2,RIN2);

proc3:p_proc

PORT MAP(DIN,RIN3,Clock,Run,get,Address3,Done3);

DATA_Mem3:ROM3

PORT MAP(Address3,RIN3);

proc4:p_proc

PORT MAP(DIN,RIN4,Clock,Run,get,Address4,Done4);

DATA_Mem4:ROM4

PORT MAP(Address4,RIN4);

Done <= get;

END Structural;

About زين العابدين

مهندس حواسيب - معهد IDA - جامعة Braunshweig التقنية.
هذا المنشور نشر في دروس تعليمية وكلماته الدلالية , , , . حفظ الرابط الثابت.

رد واحد على الدرس الثالث عشر – بناء معالج خاص ذو بنية تفرعية

  1. يقول Noreldin:

    شكرا يا باشمهند على الدروس القيمة .
    والي عندك طلب ياحبذا لو تشرح بناء هذا المعالج بطريقة البوابات

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s