تكتسب تقنية FPGA (FPGA) حاليًا شعبية كبيرة. يتزايد عدد التطبيقات: بالإضافة إلى معالجة الإشارات الرقمية ، تُستخدم FPGAs أيضًا لتسريع تعلم الآلة ، وفي تقنيات blockchain ، ومعالجة الفيديو ، وفي إنترنت الأشياء.
تحتوي هذه التكنولوجيا على ناقص واحد مهم: بالنسبة للبرمجة ، يتم استخدام لغات وصف معقدة للغاية ومحددة للمعدات الرقمية Verilog و VHDL. هذا يعقد دخول الوافد الجديد إلى FPGA ومن الصعب على صاحب العمل إيجاد متخصص لديه هذه المعرفة المحددة في سوق العمل. من ناحية أخرى ، فإن لغة برمجة Python الشهيرة ذات المستوى العالي مع إطار
MyHDL تجعل برمجة FPGA بسيطة وممتعة. علاوة على ذلك ، فإن الأشخاص الذين يعرفون بيثون هم من كبار الخبراء المتخصصين في فيريلوج / إتش دي إل. مع سلسلة من المقالات أريد أن أوضح مدى سهولة الدخول إلى حقل FPGA مع العلم بيثون والبدء في إنشاء مشاريع FPGA معقدة حقيقية بهذه اللغة. ألاحظ أن بيثون لا يتم تنفيذه مباشرة على FPGA ، لكنه أداة لتوليد البرامج الثابتة.
أولاً ، نحتاج إلى الإصدار 3.6 من python (فيما يلي ، يتم تنفيذ جميع العمليات على نظام التشغيل Ubuntu 18.04).
تثبيت myhdl:
pip3 install myhdl
باسم "مرحبا العالم!" سنقوم بكتابة برنامج بسيط يجعل المصابيح تضيء عند الضغط على زر. في عالم المعالجات الدقيقة "Hello World!" هذا هو البرنامج الذي يومض بمؤشر LED واحد ؛ في عالم FPGA ، مرحبًا World Hello بألف مصباح LED. لا يوجد سوى أربعة مصابيح LED على اللوحة ، لذلك سنقوم فقط بوميضها ، اعتمادًا على زر الضغط. من المهم أن نلاحظ أن جميع الشفرات في FPGA ، على عكس ميكروكنترولر ، يتم تنفيذها في نفس الوقت ، جميع الثنائيات تضيء وتخرج في نفس الوقت. وليس بالتتابع في حالة ميكروكنترولر. يستخدم الاختبار لوحة WaveShare OpenEPM1270 مع لوحات Altera Max II EPM1270T144C5 على متن الطائرة.

قم بإنشاء ملف python جديد:
from myhdl import * from random import randrange def led_blinker(input1, led1, led2, led3, led4): @always_comb def on_off_led(): if input1 == 1: led1.next = 1 led2.next = 1 led3.next = 0 led4.next = 0 else: led1.next = 0 led2.next = 0 led3.next = 1 led4.next = 1 return on_off_led
لمعرفة ما إذا كان رمزنا يعمل بشكل صحيح ، فأنت بحاجة إلى أداة تحقق. في الواقع ، فإن أي برنامج لـ FPGA هو معالج إشارة رقمية ، لذلك يحتاج المطور للتأكد من أنه أشار بشكل صحيح إلى ما يجب القيام به مع الشريحة. يتم ذلك من خلال المحاكاة ، لذلك تحتاج إلى تثبيت برنامج يعرض الإشارات التي تمت معالجتها. هناك الكثير من هذه البرامج ، ولكن في رأيي أفضل GTKWave مجانًا في الوقت الحالي. يتم وضعها من المحطة:
sudo apt-get install gtkwave
بعد ذلك ، في الملف الذي يحتوي على البرنامج الثابت ، يجب وصف بيئة الاختبار. هذا هو أيضا وظيفة الثعبان:
def test(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] test = led_blinker(input1, led1, led2, led3, led4) @always(delay(10)) def gen(): input1.next = randrange(2) return test, gen
هنا بيئة الاختبار يولد تسلسل عشوائي من الأصفار والأخرى (يتم استخدام وحدة بيثون العشوائية).
def simulate(timesteps): tb = traceSignals(test) sim = Simulation(tb) sim.run(timesteps)
ونقوم بتهيئة المحاكاة ، وسحب وظيفة بيئة test_inverter هناك. وبالتالي ، نحصل على العاكس الروسي دمية → test_inverter → محاكاة (الوقت في وحدات التعسفي).
بعد تشغيل البرنامج النصي في مجلد العمل ، قم بإنشاء ملف .vcd وتشغيله من خلال gtkwave ، في المحطة الطرفية: gtkwave test_invereter.vcd.

نتيجة لذلك ، تم إنشاء تسلسل عشوائي لإشارات الإدخال input1 ، وكيفية معالجة وظيفة led_blinker لهذه الإشارات.
بعد أن تأكدنا من أن المنطق يعمل تمامًا كما نريد ، يجب أن نلقي هذه الوظيفة في FPGA. اعتدت على العمل مع الرقائق من Intel (Altera سابقًا) ، وهذا التسلسل من العمليات مشابه للرقائق من الشركات المصنعة الأخرى ذات أنظمة CAD المناسبة. يتم إنشاء ملف ثنائي على شريحة FPGA ، التي يتم إنشاؤها بواسطة برنامج التحويل البرمجي من الشركة المصنعة للرقاقة ، أما بالنسبة إلى Intel فهي Quartus ، بالنسبة إلى Xilinx Vivado. يمكن أن يعمل المترجمون فقط مع الكود في VHDL / Verilog ، لذلك يجب ترجمة شفرة Python إلى أي من هذه اللغات (لا يهم أي منها).
def convert(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] toVerilog(led_blinker, input1, led1, led2, led3, led4) convert()
في هذا المثال ، يتم ترجمة الشفرة إلى Verilog. النتيجة في ملف led_blinker.v ، وسيحتاج Quartus إلى إعطائه لإنشاء البرامج الثابتة FPGA:
module led_blinker ( input1, led1, led2, led3, led4 ); input input1; output led1; reg led1; output led2; reg led2; output led3; reg led3; output led4; reg led4; always @(input1) begin: LED_BLINKER_ON_OFF_LED if ((input1 == 1)) begin led1 = 1; led2 = 1; led3 = 0; led4 = 0; end else begin led1 = 0; led2 = 0; led3 = 1; led4 = 1; end end endmodule
في هذا النهج لتطوير البرامج الثابتة FPGA ، يمكنك تجاهل هذا الملف وإفلاته ببساطة في Quartus.
يمكنك تنزيل Quartus من
fpgasoftware.intel.com ، نحتاج إلى إصدار مجاني من Lite ، سيكون كافياً بالنسبة لنا. قم بتنزيل الإصدار الأساسي بحجم 9 جيجابايت.
لا ينبغي أن يكون تثبيت Quartus مشكلة بالنسبة لمستخدم Linux العادي. بعد التثبيت ، تحتاج إلى تعيين بعض المعلمات في النظام بحيث يمكنك استخدام الجهاز لفلاش برنامج FPGA - المبرمج:
1. إنشاء قاعدة udev. للقيام بذلك ، قم بإنشاء ملف جديد /etc/udev/rules.d/51-altera-usb-blaster.rules بالمحتويات التالية:
أعد تشغيل udev باستخدام udevadm:
sudo udevadm control --reload
2. السماح بالوصول غير الجذر إلى جهاز USB- مكبر. للقيام بذلك ، قم بإنشاء الملف /etc/udev/rules.d/altera-usb-blaster.rules بالسطر:
ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666"
هذا يعطي rw-rw-rw- الوصول إلى المبرمج.
3. تكوين jtagd. يستخدم Quartus البرنامج الخفي jtagd للعمل ، والذي يربط البرنامج بجهاز مبرمج. انسخ الوصف من الدليل الخاص بك باستخدام Quartus:
sudo mkdir /etc/jtagd sudo cp <Quartus install path>/quartus/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts
قم بتشغيل Quartus وإنشاء "ملف" جديد للمشروع - "معالج مشروع جديد" ، اكتب اسم المشروع.
بعد ذلك ، انقر فوق "التالي". وفي قائمة "إضافة ملفات" ، نقوم بتوصيل ملف verilog الذي تم إنشاؤه بالامتداد .v. وبالتالي ، إذا تم تحرير ملف verilog من ملف python ، فسيتم اختياره تلقائيًا من قِبل Quartus ، ثم نصل إلى قائمة اختيار الجهاز ، وفي حالتنا ، يكون MAX II EMP1270T144C5 وفي المرات القليلة القادمة. تم إنشاء المشروع.
في Project Navigator ، انتقل إلى قائمة الملفات وانقر بزر الماوس الأيمن على ملف verilog الخاص بنا "تعيين ككيان من المستوى الأعلى".
نحن تجميع المشروع. الآن ، في قائمة "Assignments-Pin Planner" ، قم بتهيئة المسامير على الشريحة:

ترجمة مرة أخرى. الآن أصبح كل شيء جاهزًا للبرمجة: Tools-Programmer. نحن نربط المبرمج والطاقة باللوحة ، في إعداد الأجهزة نختار USB-Blaster ، ونضع مربعات الاختيار كما هو موضح في الشكل والبدء.

بعد أن أبلغ المبرمج عن نجاحه. يمكنك رؤية النتيجة على السبورة:

الخاتمة
يصف هذا الدرس كيفية إنشاء بيئة عمل وأول مشروع FPGA بسيط في لغة برمجة Python.
نظرت:
- كيفية التثبيت:
- تكوين مبرمج USB Blaster في أوبونتو ؛
- تطوير FPGA FPGA المشروع ؛
- اختبار والتحقق من المشروع ؛
- تجميع مشروع لـ FPGA ؛
- تم تحميل المشروع إلى FPGA.