لوحة FPGA
سلطانة المطيري

كيف غيّرت المصفوفات المنطقية القابلة للبرمجة (FPGA) مفهومنا بين ما هو مادي وما هو منطقي؟

هل تساءلت يوماً عن العلاقة بين العتاد (Hardware) والبرمجيات (Software)؟ كنا دائماً ننظر إلى الدوائر الإلكترونية على أنها “عتاد” صلب وثابت، بينما نرى البرامج على أنها مجرد تعليمات مرنة يمكن تغييرها بسهولة. لكن هل هذا التصنيف لا يزال دقيقاً في عالمنا اليوم؟ هل يمكن أن تكون الدوائر نفسها مجرد برمجيات، ولكن بلغة مختلفة؟

في هذا المقال، سنستكشف كيف غيّرت تقنية المصفوفات المنطقية القابلة للبرمجة FPGA (Field-Programmable Gate Array) مفهومنا الأساسي عن العتاد والبرمجيات، وكيف أجبرتنا على إعادة التفكير في الحدود الفاصلة بين ما هو مادي وما هو منطقي، لنطرح سؤالاً أعمق: هل نحن بحاجة لإعادة تعريف “البرمجة” لتشمل “التفكير المكاني” بجانب “التفكير الزمني”؟

الفرق بين المادي والمنطقي:

في الأساس، وُضع الفصل بين “العتاد” و”البرمجيات” على قاعدة علمية واضحة. فالعتاد (Hardware) هو المكونات الفيزيائية التي تُبنى عليها الأجهزة الإلكترونية، مثل الترانزستورات، البوابات المنطقية، وحدات التحكم، الأسلاك، والمكثفات. ويمكن التعامل معه من خلال قوانين الكهرباء والفيزياء الصلبة. أما البرمجيات (Software) فهي مجموعة من التعليمات الممثَّلة على شكل “بتات” (0 و1) تُنفَّذ على معالج أو دائرة مهيأة مسبقًا، وفقًا لنظريات الحوسبة واللغات الصورية.

بعبارة أخرى: العتاد يحدد “ما هو ممكن” فيزيائيًا، بينما البرمجيات تحدد “ما الذي سيحدث” فعليًا داخل هذا الإطار. لذلك، عُرف العتاد بأنه “ثابت” لا يتغير إلا بإعادة التصنيع، بينما اعتُبرت البرمجيات “مرنة” قابلة للتغيير بمجرد إعادة كتابة الكود.

هذا التمييز كان منطقيًا تمامًا مع الدوائر التقليدية. فالمعالجات (CPU) كانت تُبنى باستخدام ملايين الترانزستورات الموصولة بطريقة ثابتة، لا تتغير بعد تصنيعها. وإذا احتجنا وظيفة جديدة، كنا نلجأ إلى كتابة برنامج جديد يُنفذ على هذه البنية الثابتة.

الدوائر التقليدية وكيفية بناؤها:

قبل أن تظهر الشرائح القابلة لإعادة البرمجة مثل الـ FPGA، كانت الدوائر الإلكترونية تُبنى بطرق تقليدية ثابتة لا تسمح بالتغيير بعد التنفيذ. وتنقسم هذه الدوائر بشكل عام إلى دوائر توافقية (Combinational)، يكون مخرجها معتمدًا فقط على المدخلات الحالية مثل البوابات المنطقية والمجاميع (Adders)، ودوائر تسلسلية (Sequential) تمتلك ذاكرة داخلية تجعل مخرجاتها مرتبطة بالحالة السابقة مثل العدادات والسجلات وآلات الحالات (Finite State Machines).

في المراحل الأولى، كان بناء هذه الدوائر يتم باستخدام مكونات منفصلة (ترانزستورات، مقاومات، مكثفات) يتم توصيلها يدويًا على ألواح تجارب أو ألواح مطبوعة تعرف بـ الـ PCB (Printed Circuit Board). هذه الطريقة مثالية للتجارب أو الدوائر الصغيرة، لكنها معقدة جدًا إذا أردنا بناء أنظمة أكبر، إذ يصبح الحجم ضخمًا، والسرعة محدودة، واستهلاك الطاقة مرتفع.

لاحقًا جاءت الدوائر المتكاملة (ICs)، التي سمحت بدمج مئات، ثم آلاف، ثم ملايين الترانزستورات في شريحة صغيرة. ومع التطور، ظهرت شرائح مخصصة تسمى ASICs (Application-Specific Integrated Circuits)، وهي دوائر تُصمم لوظيفة محددة فقط، مثل وحدة معالجة إشارة داخل جهاز هاتف أو متحكم إلكتروني في سيارة. هذه الشرائح حققت أداء عاليًا وكفاءة ممتازة في استهلاك الطاقة، لكنها كانت صلبة وغير مرنة; فبمجرد تصنيعها، لا يمكن تغييروظيفتها إلا بإعادة التصميم والتصنيع من البداية، وهي عملية تستغرق وقتًا طويلًا وتكلفة كبيرة.

لوحة PCB تقليدية مليئة بالمكونات (يمين) مقابل شريحة متكاملة مضغوطة (يسار)
لوحة PCB تقليدية مليئة بالمكونات (يمين) مقابل شريحة متكاملة مضغوطة (يسار)

ظهور الـ FPGA:

في ثمانينيات القرن الماضي، ظهرت فكرة جديدة غيّرت مسار تصميم الدوائر الإلكترونية: المصفوفات المنطقية القابلة للبرمجة FPGA (Field-Programmable Gate Arrays).
الفكرة الأساسية بسيطة: بدلاً من تصنيع شريحة ثابتة تؤدي وظيفة واحدة كما هو الحال في الدوائر المخصصة (ASICs)، يتم تصنيع شريحة عامة تحتوي على آلاف الوحدات المنطقية الصغيرة القابلة لإعادة التوصيل. وظيفة هذه الشريحة لا تُحدد في المصنع، بل تُحدد لاحقًا من خلال “برمجتها” بتحميل تسلسل من البتات (Bitstream).

الفرق بين ASIC (دوائر مخصصة ثابتة) وFPGA (مصفوفات قابلة لإعادة التشكيل).
الفرق بين ASIC (دوائر مخصصة ثابتة) وFPGA (مصفوفات قابلة لإعادة التشكيل).

 

الأساس النظري وراء هذا المفهوم هو أن أي دالة منطقية يمكن تنفيذها بواسطة ذاكرة صغيرة تعمل كجدول بحث (Lookup Table – LUT). فعلى سبيل المثال، دالة منطقية بثلاث مدخلات يمكن تمثيلها في ذاكرة من 8 مواقع (2³)، حيث نخزن القيم المطلوبة في كل موقع لتخرج النتيجة الصحيحة لأي تركيبة من المدخلات.
الـFPGA تحتوي على آلاف من هذه الـ LUTs، وكل مجموعة منها مرتبطة بعناصر تخزين (Flip-Flops) ومفاتيح برمجية (Switches) تسمى كتل منطقية قابلة للتهيئة (Configurable Logic Blocks – CLBs). من خلال الربط بين هذه الكتل عبر شبكة من التوصيلات القابلة للبرمجة، يمكن تشكيل أي دائرة تقريبًا; من بوابة منطقية بسيطة إلى معالج كامل.

التوازي والسرعة:

أهم ما يميز الـ FPGA ليس فقط أنها قابلة لإعادة التشكيل، بل أنها تجسد مفهوم التوازي (Concurrency) على مستوى البتات والعمليات. في المعالج التقليدي (CPU)، تُنفذ التعليمات واحدة تلو الأخرى بشكل متسلسل، حتى مع وجود أنوية متعددة يظل التنفيذ محكومًا بتعاقب الأوامر في الزمن. أما في الـ FPGA، فالوضع مختلف تمامًا: كل جزء من الدائرة يعمل بالتوازي مع الأجزاء الأخرى.

لتوضيح ذلك، تخيل عملية ضرب 50 رقمًا في وقت واحد. على المعالج، ستُنفذ هذه العملية في سلسلة من التعليمات، تأخذ وقتًا يزداد مع عدد العمليات. أما على الـ FPGA، فيمكن بناء 50 مضروبًا (Multipliers) يعملون جميعًا في اللحظة نفسها، بحيث نحصل على النتائج دفعة واحدة.

الأمر نفسه ينطبق على مهام أخرى مثل:

  • معالجة الإشارات والصور: حيث يمكن تطبيق فلاتر على مئات البكسلات في وقت متزامن.
  • التشفير وفك التشفير: حيث يمكن إجراء العمليات الرياضية المعقدة في خطوات متوازية.
  • الذكاء الاصطناعي والتعلم العميق: حيث يمكن تنفيذ آلاف العمليات الحسابية على المصفوفات في وقت واحد، مما يجعل الـ FPGA خيارًا مفضلًا لبعض تطبيقات التسريع.

ذا التوازي يعني أن الـ FPGA قادرة على إنجاز بعض المهام مئات أو حتى آلاف المرات أسرع من المعالجات التقليدية.

البرمجة الزمنية مقابل البرمجة المكانية:

لفهم التحول الذي أحدثته الـ FPGA، من المهم التمييز بين نوعين من التفكير في تصميم الأنظمة:

البرمجة الزمنية (Temporal Programming):

وهي الطريقة التقليدية للبرمجة كما نعرفها في لغات مثل C و Python. تعتمد على تسلسل التعليمات; “نفذ هذا، ثم بعده ذاك”. هنا يكون المحرك الأساسي هو الوقت، حيث يتعاقب التنفيذ خطوة بخطوة. المعالج (CPU) هو من يتولى هذه المهمة، فينفذ الأوامر واحدًا تلو الآخر بسرعة عالية.

البرمجة المكانية (Spatial Programming):

في المقابل، تعتمد هذه الطريقة على تحديد العلاقات بين المكونات: “هذا متصل بذاك”، “وهذه الإشارة تذهب مباشرة إلى تلك”. أي أن التنفيذ يحدث مكانيًا لا زمنيًا، فكل جزء من الدائرة يعمل بشكل متزامن مع بقية الأجزاء. هذا هي ميزة الـ FPGA، حيث لا نكتب “تسلسل أوامر”، بل نصف “شبكة توصيلات” تعمل كلها في نفس اللحظة.

ما رأيناه في الفيديو يوضّح الفرق; المعالج (CPU) يتعامل مع التعليمات كطابور ينتظر دوره، بينما الـFPGA تحوّل الطابور إلى شبكة تعمل كلها في نفس اللحظة.

منهجية التصميم في الـ FPGA:

ظهور الـ FPGA فتح سؤالًا: إذا كانت هذه الشرائح لا تأتي بوظيفة ثابتة، بل تنتظر من يحدد سلوكها، فكيف يمكن للمهندس أن يصف دائرة كاملة دون العودة إلى التوصيلات والأسلاك اليدوية؟

الإجابة جاءت من خلال لغات وصف العتاد (Hardware Description Languages – HDL) مثل VHDL و Verilog، التي ظهرت في الثمانينيات. هذه اللغات لم تُصمم لكتابة برامج بالمعنى التقليدي، بل لوصف البنية المادية نفسها: كيف تتصل الإشارات، وكيف تنتقل البيانات مع كل نبضة ساعة، وما هي العمليات التي تُنفذ بالتوازي داخل الشريحة.

بهذا الأسلوب لم يعد على المصمم أن يرسم آلاف المخططات التفصيلية، بل أصبح بإمكانه كتابة أوصاف نصية تختصر الدائرة بأكملها. ثم تُترجم هذه الأوصاف عبر أدوات المحاكاة (Simulation) والتوليف (Synthesis) إلى شبكة حقيقية من العناصر المنطقية داخل الـ FPGA.

ختامًا

من الدوائر التقليدية على ألواح الـ PCB، إلى الشرائح المخصصة (ASICs)، كنا ننظر دائمًا إلى العتاد على أنه شيء صلب، ثابت، لا يتغير بعد تصنيعه. ثم جاءت الـ FPGA لتكسر هذه القاعدة; شريحة يمكن أن تتحول إلى أي دائرة، لا بالأسلاك، بل بالكود.

هنا لم يعد “البرمجيات” مجرد تعليمات تُنفذ على عتاد ثابت، بل أصبحت وسيلة لإعادة تشكيل العتاد نفسه. هذه النقلة أجبرتنا على إعادة التفكير في أبسط تعريفاتنا; ما الذي نعتبره عتادًا؟ وما الذي نعتبره برمجيات؟

المراجع:

مشاركة المقالة على :
فيسبوك
منصة 𝕏
لينكدن
واتساب
البريد الاكتروني