الدوائر المتكاملة المنطقية القابلة للبرمجة. صنع مؤقت أو المشروع الأول على الثابتة والمتنقلة

06.07.2019

لقد اضطررت لكتابة هذا المقال من قبل رفاقي الذين يفهمون وحدات التحكم جيدًا (أفضل بكثير مني) ويستخدمونها في كل مكان يذهبون إليه. ومع ذلك، هناك عدد كبير من التطبيقات التي لا يكون فيها استخدام FPGA مبررًا فحسب، بل يؤدي أيضًا إلى تبسيط كبير للنظام وتحسين معلماته. سأقوم بالحجز على الفور: في هذا وربما المقالات اللاحقة، أعتبر FPGAs فقط من Xilinx، وليس لأنهم دفعوا لي، وليس حتى لأنهم الأفضل، تاريخيًا فقط أعمل معهم بشكل حصري تقريبًا.

لذلك دعونا نبدأ مع القليل من النظرية. FPGAتنقسم إلى مجموعتين رئيسيتين: CPLD (جهاز منطقي مبرمج معقد) و FPGA (مصفوفة البوابة المبرمجة الميدانية). CPLD- هذا عادة ما يكون FPGA من فئة "الاقتصاد"، أي. سعرها منخفض وكمية ضئيلة من الموارد، وهذا ملحوظ بشكل خاص على المشغلات. FPGAعادةً ما تكون أكثر تكلفة، وتحتوي على المزيد من الموارد (منطق بسيط - مشغلات...) والأهم من ذلك، كتل "معقدة" إضافية مؤخرًا، مثل المضاعفات وذاكرة الكتلة وأجهزة الواجهة (Ethernet وPCI-express...) وحتى PowerPC نوى المعالج. بشكل منفصل، يمكننا أن نذكر سلسلة Zinq من Xilinx - حيث قاموا بشكل عام بحشو نوى ARM هناك. يتمثل الاختلاف الرئيسي بين FPGA وCPLD في الحاجة إلى تحميل التكوين عند تشغيل الطاقة، وبالتالي تحميل ROM خارجي مع التكوين. حتى عائلة SPARTAN-3AN لديها ذاكرة قراءة فقط (ROM) مدمجة على متنها، والتي يتم تشغيلها منها.

الآن الشيء الأكثر أهمية: كيف تختلف FPGA عن وحدة التحكم ومتى يتم استخدامها. كل شيء بسيط للغاية هنا: FPGA (نأخذ تلك التي لا تحتوي على أجراس وصفارات) هي في الواقع كيس من المنطق على شريحة واحدة، والتي يمكن توصيلها بشكل تعسفي: نفس المشغلات، و، أو والأوليات المماثلة، على سبيل المثال ، في سلسلة K155 أو 74NS. وحدة التحكم عبارة عن معالج جاهز (وإن كان يحتوي على عدد ضئيل من الأوامر)، وذاكرة مدمجة، وناقلات البيانات والأوامر، والأجهزة الطرفية، وما إلى ذلك. بشكل عام، يمكنك إنشاء وحدة تحكم صغيرة من FPGA كبيرة، ولكن هذه الفكرة، على الأقل، غبية. لذلك، تم تصميم وحدة التحكم لتنفيذ سلاسل طويلة من الأوامر، وتكرارها بشكل دوري، والانتقال من سلسلة إلى أخرى، وما إلى ذلك، وتم تصميم FPGA لإجراء عمليات منطقية بسيطة، والأهم من ذلك، عدد كبير في وقت واحد (وحتى في ترددات الساعة المختلفة).

دعنا ننتقل من النظرية إلى التطبيق. في البداية، سنحتاج إلى نوع من شريحة CPLD. الموارد قليلة، لكنها كافية للتنمية. سآخذ XC95288XL في علبة TQ144 (مرة أخرى، تصادف وجوده في المخزون)، بشكل عام أوصي بأخذ شيء أحدث، على سبيل المثال، من سلسلة CoolRunner 2. للحصول على منتج نهائي (حتى لو كان يومض إلى الحد الأدنى باستخدام مؤشر LED)، نحتاج إلى: لحام الأجهزة (هنا، آمل ألا تكون هناك مشاكل، لكنني سأذكر الفروق الدقيقة)، "اكتب" البرنامج الثابت ( في حالتنا، بدلاً من ذلك، ارسمه) وقم بفلاش البرنامج الثابت في الدائرة الدقيقة. بشكل عام، سنحتاج إلى برنامج يقوم بإنشاء البرامج الثابتة ومبرمج. نقوم بتنزيل البرنامج (Xilinx ISE Webpack) من الموقع الرسمي (على الرغم من أنهم سيطلبون منك التسجيل)، فإن ترخيص Webpack مجاني. يمكن تصنيع المبرمج وفقًا للمخطط الموضح في الشكل 1 (لمنفذ LPT) أو يمكنك شراء منفذ USB من المصنع (لقد وجدته في المتاجر الصينية عبر الإنترنت مقابل حوالي 50 دولارًا، لكنني لم أشتريه بنفسي). أكثر.

أرز. 1

بعد أن قمنا بلحام FPGA على اللوح، أو لحامنا أو شراء مبرمج، وتنزيل حزمة ISE Webpack وتثبيتها (لدي الإصدار 13.2)، وإطلاق Project Navigator وإنشاء مشروع جديد. لإنشاء مشروع، حدد ملف -> مشروع جديد، وحدد اسم المشروع ومكان حفظه، وحدد أيضًا نوع المصدر TOP-LEVEL (الشكل 2). الحقيقة هي أنه بالنسبة لـ FPGA، ليس من الضروري رسم مخطط للقلابات واتصالاتها، على سبيل المثال، يمكنك الكتابة بلغات عالية المستوى (VHDL، Verilog) وليس من الضروري على الإطلاق ذلك؛ استخدام شيء واحد في نفس المشروع. في الوقت الحالي، نستخدم التخطيطي فقط على جميع المستويات.


أرز. 2
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

في النافذة التالية (الشكل 3) نختار دائرتنا الصغيرة (لا نلمس الباقي في البداية)؛ في النافذة التي تظهر بعد النقر على زر "التالي"، نعجب بمعلمات المشروع الذي تم إنشاؤه، وانقر فوق "إنهاء" - وهذا كل شيء: تم إنشاء المشروع.


أرز. 3

الآن نحن بحاجة، في الواقع، إلى رسم مخطط: انقر بزر الماوس الأيمن على النافذة التي تحتوي على المشروع والمصدر الجديد (الشكل 4)، وقم بتسمية هذا المصدر (هذا هو اسم مخططنا، يمكن أن يكون هناك الكثير منهم في المشروع)، حدد تخطيطي مرة أخرى، وانقر فوق "التالي" "، واستمتع بمعلمات الملف الذي تم إنشاؤه حديثًا، وانقر فوق "إنهاء" واحصل على رسم تخطيطي نظيف.


أرز. 4
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

يبدأ الجزء الأكثر إثارة للاهتمام: على اللوحة الموجودة على اليسار (وليس على الحافة ذاتها)، انقر فوق الزر "إضافة رمز" (الشكل 5).


أرز. 5
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

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

على سبيل المثال، ضع في اعتبارك المهمة التالية: تحتاج إلى تحديد وقت التأخير بأكبر قدر ممكن من الدقة بين الحواف الأمامية لنبضتين تظهران على أسلاك مختلفة، ودمج هذه القيمة في وحدة التحكم عبر واجهة SPI. أي تشابه بين المهمة وموضوع "زيادة تردد تشغيل المتحكم الدقيق" في أحد منتديات الروبوتات هو مقصود. لذلك، يوجد عند مدخل الجهاز سلكين للنبضات و3 أسلاك لوحدة التحكم SPI. نضيف مدخلاً آخر للساعة (لا نعرف التردد بعد، يمكننا فقط أن نفترض أنه لا يقل عن 70 ميجاهرتز). لنبدأ في رسم البرامج الثابتة: نحتاج إلى مشغلات مغلقة من شأنها "التقاط" النبضات، وعداد الوقت، وسجل التحول (ليست هناك حاجة لإنشائها، فهي مشغلات مكتبة). لن أصف ما هي المحفزات والعدادات، وآمل أن يكون القراء "على دراية" ولن تكون هناك أي مشاكل، وإلا فسأضطر إلى كتابة عدة مقالات أخرى. لقد حصلنا على هذا المخطط (الشكل 6)، كما ترون، ليس من الضروري سحب السلك من إخراج الرمز إلى الإدخال، يكفي تسمية الدائرة ببساطة. لتعيين المدخلات والمخرجات الخارجية، استخدم زر "إضافة علامة الإدخال/الإخراج".


أرز. 6
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

عندما يكون الرسم التخطيطي جاهزًا، انتقل إلى علامة التبويب "تصميم"، وانقر نقرًا مزدوجًا فوق "تنفيذ التصميم" - تبدأ جميع أنواع العمليات (في البداية، لا يهم أي منها - الشيء الرئيسي هو أن كل شيء معًا هو عملية التقطير كود المصدر في البرامج الثابتة). عندما يعمل كل شيء، ننظر إلى الأخطاء بتحذيرات: نصلح كل ما هو مهم، ونترك الباقي. على سبيل المثال، لا نحتاج إلى مخرجات CEO وTS الخاصة بالعداد، كما أن الـ 15 بت المتبقية من المخرجات الموازية لسجل التحول ليست مطلوبة أيضًا، ولكنها تقسم بالتحذيرات. إذا أقسم مع الأخطاء على ما نريد، فهذا يعني أننا نريد شيئا خاطئا. إذا كنا (والمركب) راضين عن كل شيء، فإننا نستمر في الإعجاب بالتقارير: كم عدد الموارد المستخدمة، وما هي ترددات الساعة المتوفرة... إذا كان كل شيء على ما يرام مرة أخرى، فقد حان الوقت لمحاكاة الدائرة والتأكد من ذلك أنه يعمل بالفعل وفقًا للمهمة. أقترح إجراء المحاكاة بعد التحقق من التوقيتات لأنه في بعض الأحيان، من أجل الحصول على تردد الساعة المطلوب، يتعين عليك هز الدائرة بأكملها، الأمر الذي، بطبيعة الحال، يمكن أن يؤثر على النتيجة...

لذا، المحاكاة: في علامة التبويب تصميم (في اللوحة اليسرى)، حدد المحاكاة (الشكل 7).


أرز. 7
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

أدناه، في العمليات، بدلا من عمليات التوليف والأسلاك، ظهرت عملية محاكاة النموذج السلوكي، انقر نقرا مزدوجا فوقها - يبدأ جهاز المحاكاة، حيث نرى إشاراتنا (ليس فقط المدخلات والمخرجات، ولكن أيضا وسيطة) ( الشكل 8).


أرز. 8
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

نقوم بتمرير مؤشر الماوس فوق الأزرار ونقرأ التعليقات الموجودة على الأزرار. قمنا بضبط وقت خطوة المحاكاة (الشكل 9) والقيم الأولية لإشارات الدخل، وقمنا على الفور بإعداد إشارات الساعة (لن نقوم بمحاكاة الساعة وتبديلها كل 5 نانوثانية).


أرز. 9
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

وبمرور الوقت من خلال معالجة المدخلات و(إذا لزم الأمر) خطوة المحاكاة، نحصل على مخطط توقيت (الشكل 10).


أرز. 10
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

نحن نتأكد من أن كل شيء يعمل على النحو المنشود (أو نقوم بتصحيح أخطاء الدائرة بشكل أكبر)، وننتقل إلى الخطوة التالية - توزيع المخرجات والمدخلات عبر أطراف الدائرة الدقيقة. للقيام بذلك، قم بإضافة ملف مصدر آخر (الشكل 11)، وهو ملف قيود التنفيذ.


أرز. أحد عشر
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

نكتب "pinout للدائرة الدقيقة" (الشكل 12) وهنا نكتب أيضًا متطلبات ترددات الساعة. والآن نأتي إلى الفروق الدقيقة المرتبطة بإشارات الساعة. الحقيقة هي أن إشارات الساعة يجب أن تصل إلى ما يسمى بالخطوط العالمية - الخطوط التي تمر عبر الدائرة الدقيقة بأكملها، والخطوط المتبقية ذات طبيعة محلية وتمر عبر منطق التبديل من كتلة إلى كتلة. تحتوي شريحة XC95288XL في حزمة TQ144 على 3 خطوط من هذا القبيل، وهي متصلة بالأرجل 30، 32، 38. ويمكن توصيل الإشارات المتبقية بأي أرجل إدخال/إخراج (I/O).


أرز. 12
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

انقر نقرًا مزدوجًا فوق "تنفيذ التصميم" مرة أخرى، وانتظر، واقرأ التعليقات حول موضوع التحذيرات التي تحتوي على أخطاء وانتقل إلى التقارير الخاصة بالدبابيس (الشكل 13) والتوقيت (الشكل 14)؛ نتأكد من أن كل شيء يناسبنا، وتكون لدينا السعادة على شكل الملف %project_name%.jed.


أرز. 13
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)


أرز. 14
(الصورة قابلة للنقر للتكبير، وتفتح في نافذة جديدة)

ملف البرنامج الثابت جاهز. لنفترض الجهاز أيضًا. نقوم بتوصيل كابل JTAG بالكمبيوتر وانقر نقرًا مزدوجًا على تكوين الجهاز المستهدف. ستبدأ الأداة المساعدة للبرامج الثابتة (Impact.exe) في الواقع، عند تصنيع عدة أجهزة لوميض سلسلة، يمكنك أن تقتصر على تشغيل جهاز واحد فقط. نقوم بإنشاء مشروع جديد (هذا مشروع لبرنامج البرامج الثابتة)، ونسمح له بالعثور تلقائيًا على المبرمج والشريحة المتصلة، وإظهار ملف البرنامج الثابت، ثم انقر فوق البرنامج. ننتظر بضع عشرات من الثواني ونرى نقشًا يقول أن كل شيء على ما يرام - الجهاز جاهز.

ألتيرا سيكلون واردوينو

جوهر السؤال. الفرق بين FPGA والمتحكم الدقيق

كل منتج ميكروبروجر مبتدئ في مرحلة معينة من تطوره يتساءل ماذا الفرق بين FPGA(من Altera أو Xilinx) و متحكم(المعالج الدقيق)؟

تقرأ المنتديات - يكتب الخبراء في هذا المجال أن هذه أشياء مختلفة تمامًا ولا يمكن مقارنتها، بحجة أن لديهم أشياء مختلفة بنيان. لقد قرأت دليلًا عن Verilog أو C++ - كلاهما يستخدم عوامل تشغيل متشابهة مع وظائف مماثلة، حتى بناء الجملة متشابه، ولكن لماذا يختلفان؟ تذهب إلى مركبة المريخ الجوالة - هناك مصابيح LED (أو حتى مصابيح كهربائية فقط) تستخدم FPGAإنهم يومضون، تنظرون إلى المشاريع على Arduino - إنهم يتحكمون في الروبوتات. قف!

ولكن الآن دعونا نتوقف ونسأل أنفسنا: لماذا؟ FPGA- مصباح كهربائي غبي، واردوينو - روبوت ذكي؟ بعد كل شيء، يبدو أن كلا الجهازين الأول والثاني عبارة عن أجهزة قابلة للبرمجة، حقًا؟ FPGAألا توجد إمكانيات كافية للروبوت؟

إلى حد ما، جوهر السؤال "ما هو؟" الفرق بين FPGA والمتحكم الدقيق؟ يتم الكشف عنها بدقة من خلال مثل هذا المثال.

دعونا نلاحظ ذلك على الفور. وظيفي FPGAفي البداية ليست أقل شأنا متحكم(والمعالج الدقيق، بالمناسبة أيضًا)، بشكل أكثر دقة - الوظائف الرئيسية لأحدهما والآخر متطابقة بشكل أساسي - لإنتاج 0 أو 1 منطقي في ظل ظروف معينة، وإذا تحدثنا عن السرعة، فإن عدد المسامير (الأرجل) ) وقدرات معالجة خطوط الأنابيب، إذن متحكمقبل FPGAولكن عموما بعيدا. ولكن هناك واحد "لكن". حان الوقت لتطوير نفس خوارزمية البرنامج على جهازين مختلفين (FPGA ووحدة التحكم الدقيقة) يختلف عدة مرات، أو حتى عشرات المرات. بالضبط FPGAهنا في 99٪ من الحالات يكون أدنى بكثير من MK. والأمر لا يتعلق على الإطلاق بالارتباك اللغوي فيريلوج,VHDLأو أهدلوفي الجهاز نفسه FPGA.

حول تفاعل لغة البرنامج مع معمارية الـ FPGA والمتحكم الدقيق

FPGA: الخامس FPGAولا توجد سلاسل آلية معقدة (تقوم ببعض العمل نيابةً عنك). لا يوجد سوى مسارات الأسلاك الحديدية والطرق السريعة والمدخلات والمخرجات والكتل المنطقية وكتل الذاكرة. من بين الآثار هناك فئة خاصة - أثر تسجيل الوقت (مرتبط بأرجل معينة يوصى من خلالها بإجراء تردد الساعة).

فريق التمثيل الرئيسي:

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

الكتل هي أماكن فردية على السبورة، تتكون من خلايا. تُستخدم الكتل لتخزين المعلومات والضرب والجمع والعمليات المنطقية على الإشارات بشكل عام.

الخلايا عبارة عن مجموعات من عدة وحدات إلى عدة عشرات من الترانزستورات.

الترانزستور هو العنصر الرئيسي في منطق TTL.

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

مولد الساعة - شريحة خارجية تولد نبضات الساعة التي يعتمد عليها معظم العمل FPGA.

بنية FPGA. العلاقة المتبادلة بين العناصر المكونة

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

بنية FPGA(FPGA)

هندسة المتحكمات الدقيقة

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

ذاكرة القراءة فقط (ROM) هي الذاكرة التي يتم تخزين البرنامج الخاص بك فيها. ويشمل خوارزميات العمل والثوابت. وكذلك مكتبات (مجموعات) الأوامر والخوارزميات.

ذاكرة الوصول العشوائي (RAM) - الذاكرة المستخدمة متحكمللتخزين المؤقت للبيانات (مثل المشغلات في FPGA). على سبيل المثال، عند الحساب في عدة خطوات. لنفترض أنك بحاجة إلى ضرب الرقم الأول الذي يأتي في الثاني (الإجراء الأول)، ثم الرقم الثالث في الرابع (الإجراء الثاني) وإضافة النتيجة (الإجراء الثالث). في هذه الحالة، سيتم إدخال نتيجة الإجراء 1 في ذاكرة الوصول العشوائي (RAM) لمدة الإجراء الثاني، ثم سيتم إدخال نتيجة الإجراء 2. وبعد ذلك ستنتقل هاتان النتيجتان من ذاكرة الوصول العشوائي (RAM) لحساب الإجراء 3.

المعالج عبارة عن آلة حاسبة متحكم. يتواصل مع ذاكرة الوصول العشوائي (RAM) وكذلك مع الذاكرة الدائمة. يتم تبادل الحسابات مع العمليات. من الثابت، يتلقى المعالج الأوامر التي تجبر المعالج على تنفيذ خوارزميات وإجراءات معينة باستخدام إشارات الإدخال.

مرافق الإدخال/الإخراج (المنافذ) ومنافذ الإدخال/الإخراج التسلسلية - الدبابيس متحكم، مصممة للتفاعل مع العالم الخارجي.

الموقتات عبارة عن كتل مصممة لحساب عدد الدورات عند تنفيذ الخوارزميات.

وحدة التحكم بالحافلة عبارة عن كتلة تتحكم في التبادل بين جميع الكتل الموجودة فيها متحكم. فهو يعالج الطلبات، ويرسل أوامر التحكم، وينظم ويبسط الاتصالات داخل البلورة.

وحدة تحكم المقاطعة هي كتلة تتلقى طلبات المقاطعة من الأجهزة الخارجية. طلب المقاطعة هو إشارة من جهاز خارجي يعلم أنه يحتاج إلى تبادل بعض المعلومات معه متحكم.

الطرق السريعة الداخلية - الطرق الموضوعة في الداخل متحكملتبادل المعلومات بين الكتل.

مولد الساعة - دائرة كهربائية خارجية دقيقة تولد نبضات الساعة التي يعمل عليها كل شيء عملية متحكم.

الترابط بين الكتل المكونة للمتحكم الدقيق

في متحكم، الخامس اختلافاتمن FPGAيتم العمل بين الكتل المذكورة أعلاه والتي لها مجمع بنيانوتسهيل عملية تطوير البرنامج. عند وميض البرامج الثابتة، يمكنك فقط تغيير الذاكرة الدائمة التي تعتمد عليها جميع أعمال MK.

الفرق الرئيسي بين FPGA والمتحكم الدقيق

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

الأجهزة والبرمجيات.

في FPGAيجب عليك القيام بكل العمل بنفسك يدويًا: من أجل تنفيذ أي برنامج عليه FPGA، تحتاج إلى تتبع كل إشارة لكل سلك يأتي FPGA، ضع بعض الإشارات في خلايا الذاكرة، وتأكد أنه في اللحظة المناسبة يتم الوصول إلى خلايا الذاكرة هذه عن طريق إشارة أخرى، والتي تقوم أنت أيضًا بمراقبتها أو حتى توليدها، ونتيجة لذلك، تقوم مجموعة الإشارات المتأخرة في الذاكرة بتنشيط الإشارة التي تحتاجها، والتي، على سبيل المثال، سوف تذهب إلى دبوس إخراج معين وتقوم بتشغيل مؤشر LED المتصل به. بعض الإشارات لا تذهب إلى الذاكرة، ولكن، على سبيل المثال، لتشغيل جزء معين من الخوارزمية (البرنامج). وهذا يعني، في لغة microproger، أن هذه الأرجل قابلة للتوجيه. على سبيل المثال، لدينا على اللوحة الخاصة بنا في برنامجنا ثلاثة دبابيس عنوان لتمكين بعض الخوارزميات غير ذات الصلة (أو ذات الصلة)، والتي قمنا بتنفيذها بلغة Verilog في FPGA. في البرنامج أيضًا، بالإضافة إلى ثلاثة أرجل عنوان، لدينا أيضًا، على سبيل المثال، 20 أرجل معلومات، والتي من خلالها تأتي مجموعة من إشارات الإدخال (على سبيل المثال، من أجهزة استشعار مختلفة) مع بعض المعلومات (على سبيل المثال، درجة حرارة الماء في الحوض من مستشعر درجة حرارة الماء في الحوض). 20 ساق = 20 بت. 3 أرجل -3 بت. عندما تصل إشارة العنوان 001 (من ثلاثة أرجل عنوان)، نطلق الخوارزمية الأولى، التي تكتب 20 إشارة معلومات في 20 خلية ذاكرة (20 مشغلًا)، ثم نضرب الإشارات العشرين التالية في العشرين المستلمة مسبقًا، ونكتب النتيجة من الضرب إلى الذاكرة، ثم أرسله على طول الأرجل الأخرى، على سبيل المثال، إلى ترموستات الماء في حوض السمك. ولكننا لن نرسل هذه النتيجة إلا عندما يصل رمز، على سبيل المثال 011، إلى عنواننا ويبدأ خوارزمية القراءة والنقل. حسنًا، بالطبع نحن "نرسل" و"نقرأ" ونكتب شيئًا آخر يدويًا. نحن نتحكم في كل إشارة في كل خطوة من خطوات العمل FPGAعلى طريق معين، نحن لا نخسر. المعالجة أو التسجيل. أضف أو اضرب. لا تنسى أن تكتبها. لا تنس قبول الإشارة التالية وكتابتها إلى المشغلات الأخرى. أضف هنا أيضًا العمل المرتبط بتردد الساعة، والمزامنة (والتي يتم تنفيذها يدويًا أيضًا)، والأخطاء التي لا مفر منها في مراحل التطوير والتصحيح، ومجموعة من المشكلات الأخرى التي لا معنى لها ببساطة أن تأخذها في الاعتبار في هذه المقالة. صعب. لفترة طويلة. لكن الإخراج يعمل بسرعة فائقة، دون أي خلل أو تباطؤ. حديد!

الآن متحكم. 20 ساقًا لتلقي المعلومات - بالنسبة للأغلبية ميكروكنترولرمهمة مستحيلة جسديا. لكن 8 أو 16 - نعم من فضلك! 3 منها إعلامية - سهلة! برنامج؟ عند العنوان 001، اضرب الرقم الأول الذي تم استلامه بالرقم الثاني، عند العنوان 011 أرسل النتيجة إلى منظم الحرارة. الجميع! سريع. بسهولة. ليست رائعة، ولكنها فعالة. إذا كتبت البرنامج بكفاءة عالية، فلن يكون هناك أي خلل أو فرامل. برمجيا!

الأجهزة والبرامج! هذا هو الشيء الرئيسي الفرق بين FPGA والمتحكم الدقيق.

في متحكممعظم الخوارزميات المربكة والمستخدمة بشكل متكرر مثبتة بالفعل في البلورة. كل ما عليك فعله هو الاتصال برمجيًا بالمكتبة المطلوبة التي يتم تخزين هذه الخوارزمية فيها، والاتصال بها بالاسم، وسوف تقوم بكل الأعمال القذرة نيابةً عنك. من ناحية، يعد هذا مناسبًا ويتطلب معرفة أقل بالبنية الداخلية للدائرة الدقيقة. يعتني Mikrik بتتبع الإشارات المستلمة والمولدة والناتجة وتخزينها ومعالجتها وتأخيرها. يفعل كل شيء بنفسه. هذا هو المطلوب في معظم مهام البرمجة الدقيقة. ولكن إذا كنت تستخدم كل هذه وسائل الراحة بشكل غير صحيح، فهناك احتمال التشغيل غير الصحيح. الأجهزة والبرامج!

خاتمة

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

وفقا لخصائص إشارة الإخراج، FPGAغالبًا ما تكون مصممة لـ 3.3V، 20mA، متحكمعند 5 فولت، 20 مللي أمبير.

تحت متحكمتم تنفيذ AVR بنجاح في منصة Arduino، وتمت كتابة العديد من البرامج مفتوحة المصدر، وتم تطوير مجموعة كبيرة ومتنوعة من الأدوات على شكل أجهزة استشعار ومحركات وشاشات وكل ما يرغب فيه قلبك! أصبح Arduino الآن أشبه بمجموعة أدوات إنشاء الألعاب للأطفال والكبار. ومع ذلك، لا تنس أن جوهر هذا المصمم يتحكم في "المنازل الذكية"، والأجهزة الإلكترونية الاستهلاكية الحديثة، والأجهزة، والسيارات، والطائرات، والأسلحة، وحتى المركبات الفضائية. مما لا شك فيه أن مجموعة البناء هذه ستكون واحدة من أفضل الهدايا لأي ممثل للنصف الأقوى للبشرية.

من حيث المبدأ، كل شيء بسيط!

لا تزال لديك أسئلة؟ أكتب تعليقا. سنجيبك ونساعدك على معرفة ذلك =)

  • برمجة المتحكمات الدقيقة
  • هل كنت تنتظر الإشارة؟ ها هو!

    لسنوات عديدة كنت مترددًا في البدء في برمجة FPGAs لأنها كانت صعبة ومكلفة ومؤلمة (كما بدا لي). ولكن من الجيد أن يكون لديك أصدقاء يساعدونك في اتخاذ الخطوة الأولى. والآن لا أفهم شيئًا واحدًا - لماذا انتظرت طويلاً؟

    الآن سأساعدك على اتخاذ الخطوة الأولى أيضًا!

    لماذا أحتاجه؟

    هل سئمت من قراءة المستندات باستمرار على عضو الكنيست الخاص بك أو الاحتفاظ بمجموعة من المعلومات في رأسك. قمت بإعادة كتابة كل شيء في ASMA، ولكن السرعة لا تزال غير كافية. لقد قمت بتوصيل جهازين خارجيين بجهاز MK الخاص بك، وقمت بتوصيل جهاز ثالث، ولكن نفدت المقاطعات، وتتوقف تلك الوحدات التي كانت تعمل بالفعل عن العمل. أنت تأخذ MK آخر، وهو أكثر قوة من نفس الخط، ولكن مرة أخرى كتيبات، وسجلات العلم، والبتات... الجحيم. تقوم بتغيير النظام الأساسي: تقوم بالتبديل إلى MK آخر وتتخلص من معرفتك بالنظام الأساسي السابق. بغض النظر عن ما تفعله، فمن الصعب. تجد منصة شائعة يمكنك من خلالها تجميع مشروع من المكونات بسهولة، لكنك لا تزال غير قادر على القفز فوق قيود الأجهزة الخاصة بـ MK... في مكان ما على حافة وعيك أحيانًا تنبثق فكرة ذلك على FPGA هذا بالتأكيد سيعمل بسرعة وبشكل متوازٍ، ما هذه "بالضبط المشكلة التي تحتاج إلى حل من فضلك"، ولكني كبير في السن/غبي/مشغول/إلخ حتى أتمكن من/البدء في القيام بذلك.

    هل تريد أن تتنفس أخيرا بحرية؟ تفضل!

    متعة التطوير على FPGAs

    كان لدي يوم شاق في العمل. من وظيفة واحدة جئت إلى الوظيفة الثانية، ثم إلى دارشا، في المساء قمت بواجباتي المنزلية، والواجبات المنزلية، ثم فيلم عائلي، وفقط في الساعة 11 مساء كنت حرا تماما! القول بأنني متعب هو عدم قول أي شيء. لكن في هذه الحالة، جلست أمام الكمبيوتر المحمول بهدف ثابت: إنشاء مولد موجة مربعة بتردد 440 هرتز. مرت 20 دقيقة وكنت أسمع ذلك بالفعل في سماعات الرأس. لم أستطع أن أصدق أذني! استغرق الأمر مني 15 دقيقة أخرى لعمل PWM وتغيير مستوى الصوت. بحلول ذلك الوقت، كان لدي لوحة FPGA لمدة أسبوع تقريبًا، وقبل ذلك كنت قد قرأت كتابين فقط عن Verilog.

    في ذلك المساء أدركت: ها هو!هذه هي المنصة التي يمكنني من خلالها تحويل أفكاري بسرعة وسهولة إلى أجهزة تعمل فعليًا!

    لماذا هذا؟

    سأصف المزايا الموجودة في دراسة واستخدام FPGAs، على الرغم من أن الجميع يعرفها بالفعل:
    • عالمية المعرفة- عند تغيير نموذج MK، تحتاج إلى قراءة الوثائق. عند تغيير الشركة المصنعة لـ MK، تحتاج إلى قراءة الوثائق. تحتاج إلى قراءة المستندات باستمرار، والاحتفاظ باستمرار بالكثير من المعلومات في رأسك. عند التطوير على FPGA، إذا كنت تعرف Verilog أو VHDL، فلا يمكنك فقط برمجة أي FPGA من خط إحدى الشركات المصنعة، ولكن أيضًا، إذا كنت ترغب في ذلك، قم بالتبديل إلى أخرى (Altera، Xilinx). على الرغم من أنه ستكون هناك لحظات عند إتقان بيئة تطوير مختلفة ومشكلات الأجهزة الدقيقة، فإن جوهر النهج المتبع في تصميم الأجهزة في HDL لن يتغير من هذا.
    • من الفكرة إلى الأجهزة- عند تطوير مشروع ما، إذا كنت تفتقر إلى متحكم واحد، عليك اختيار متحكم آخر. من حيث المبدأ، يمكنك تقديم افتراضات حول ما إذا كان عضو الكنيست هذا سيتعامل مع المشروع أم لا. أو أن هناك عضوًا عضوًا محددًا وتحاول دمج المشروع فيه. في أغلب الأحيان هذا هو الحال. إنه يذكرني قليلاً بأسلوب جدي، الذي يصنع سلماً مما لديه في السقيفة. على الرغم من أنه يمكنك تصميم سلم، قم بشراء الألواح التي تناسبك... من الفكرة إلى الأجهزة، وليس العكس.
    • سهولة استخدام تطورات الآخرين- يمكنك أخذ وحدة شخص آخر وتطبيقها في مشروعك. من الكود يمكنك فهم كيفية عمله. حتى لو كان لxilinx، وأنت تفعل ذلك تحت تغيير. في بعض الأحيان لا يعمل هذا بشكل جيد، ولكنه أسهل من، على سبيل المثال، إضافة مكتبات ثنائية إلى مشروع C++/Qt
    • كتلة الاستقلال.تشبه الكتل في HDL الوظائف النقية في اللغة. تعتمد فقط على إشارات الإدخال. ستستمر الوحدة المطورة والمصححة في العمل بشكل صحيح، بغض النظر عن مدى نمو المشروع. لن يؤثر أي شيء من الخارج على التشغيل الصحيح له من الداخل. وبشكل عام، يمكنك أن تنسى كيف يعمل - إنه صندوق أسود. بالإضافة إلى ذلك، تعمل الكتل موازي.

    مشكلة الاختيار

    هناك الكثير من الأسئلة حول ما يجب اختياره: Altera/Xilinx، Verilog/VHDL، ما هي لوحة التصحيح التي يجب اتخاذها. ولكن أول الأشياء أولا.

    الصانع

    اخترت ألتيرا. لماذا؟ حسنًا، هكذا قررت أنا وصديقي، على الرغم من أن اسم Xilinx أجمل بالنسبة لي. لكن. إذا لم تتمكن من الاختيار الآن، فسوف أفعل ذلك من أجلك. أنت بحاجة إلى ألتيرا! لماذا؟ لا أعرف. الشيء الأكثر أهمية الآن هو اتخاذ خطوة: الاختيار. لقد اخترت Altera ولم أشعر بأي ندم حتى الآن.



    لغة

    دعونا أعتبر فيريلوج - لأن… حسنًا، أنت تفهم.

    مجلس التنمية

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

    في عائلة Altera، يمكننا شراء لوحات مزودة بـ CPLD MAX II مع 240 و570 و1270 عنصرًا مقابل أموال معقولة، أو شرائح FPGA الأقدم مثل Cyclone 1 و2 و3 و4 مع ما يصل إلى 10000 خلية أو أكثر. كيفة تختار؟

    حتى على أساس 240 خلية، يقوم مشروع Mars Rover بعدد كبير من المشاريع. أوصي بشدة بقراءته للحصول على فكرة تقريبية عن مدى تعقيد المشاريع التي يمكن أن تتناسب مع 240 خلية. من ناحية أخرى، هناك مشاريع مبرمجة بالكامل لنسخة أجهزة لجهاز كمبيوتر معين، بما في ذلك المعالج وكل المنطق المحيط به (NES، Speccy، Orion، YuT-88، إلخ). وهذا يتطلب بالفعل خمسة أو عشرة آلاف أو أكثر من الخلايا. بالإضافة إلى ذلك، تحتوي هذه اللوحات على أجهزة خارجية إضافية.

    ولذلك، أنصح بأخذ ما يتراوح بين 240 و10000 خلية، مع تفضيل الخلايا الأكبر حجمًا حسب الأموال المتاحة. في لوحة تصحيح الأخطاء، لا تمثل الخلايا الإضافية مشكلة كبيرة، ولكن إذا لم يكن هناك ما يكفي منها، فلا يوجد شيء يمكنك فعله حيال ذلك. بعد ذلك، عندما يتم تصحيح أخطاء الجهاز، سيصبح من الواضح عدد الخلايا المطلوبة، وشراء الكمية المطلوبة، دون "مجموعة أدوات الجسم" غير الضرورية، وأرخص ثمنًا واتركها في الجهاز النهائي.

    ما يميز MAX حقًا عن الأعاصير، إلى جانب عدد الخلايا، هو:
    1) لا تحتوي سلسلة MAX على PLL بالداخل. كل لوحة تطوير لديها مذبذب، عادة 50 ميغاهيرتز. سيكون هذا كافيًا لغالبية المشاريع. ستتم جميع عمليات المزامنة عن طريق قسمة 50 ميجاهرتز على قيمة معينة. أو يمكنك أخذ مولد خارجي وإدخاله في مدخل FPGA منفصل. ماذا لو كنت بحاجة إلى تردد أعلى من 50 ميجا هرتز؟ لم أتمكن من العثور على مذبذبات أعلى من 50 ميجا هرتز على الفور. ولكن هذا هو المكان الذي يأتي فيه PLL، المضمن في الأعاصير، للإنقاذ. يمكنك من خلاله مضاعفة التردد، على سبيل المثال، حتى 100 ميجاهرتز.
    2) تحتوي سلسلة Cyclone على وحدات مضاعفة للأجهزة مدمجة. يعتمد عددهم على النموذج المحدد - هنا لا يزال بإمكانك "إلقاء نظرة على التعليمات" لمعرفة المقدار. إذا كنت تخطط للقيام بنوع من DSP، فستكون في متناول يديك: فهي ستحفظ الخلايا وتزيد السرعة. من ناحية أخرى، إذا لم تكن هناك مضاعفات، فيمكن توليفها، ولكن قد لا يكون لدى FPGA الصغيرة موارد كافية لذلك.

    وفي جميع النواحي الأخرى، لدي معيار "ملائم/غير مناسب". تصحيح الأخطاء على لوحة من الواضح أنها أكبر من المطلوب، يليها ملئها بالحد الأدنى المطلوب لذلك.

    كم من المال مطلوب؟


    مبرمج
    أعتقد أنه ليس لدي الوقت لحام المبرمجين بكميات كبيرة.

    300 روبل. لقد حصلت على حسابي على موقع eBay، وهو يبدو كالتالي:

    مجلس التنمية
    الاختيار واسع، اعتمادا على مبلغ المال.

    مستوى اول 350 - 550 روبل. هذه لوحات تعتمد على MAX II (أو الخلايا). قد يكون مناسبًا للتعرف الأولي والتكامل الإضافي في الأجهزة النهائية. تحتوي اللوحة على مولد، واثنين من الأزرار، واثنين من مصابيح LED، والدبابيس الـ 80 المتبقية حسب تقديرك.

    وحدة الطاقة
    إنه أمر لا بد منه، لكنه لا يتم تضمينه دائمًا. ستحتاج إلى مصدر طاقة 5 فولت وتيار 2A.

    مستوى متوسط من 900 إلى 1500 روبل. هذه هي لوحات Cyclone 1، 2، 3، 4، تختلف بشكل رئيسي في عدد الخلايا.
    تم وضع علامة عليها بشيء من هذا القبيل:
    إ.ب. 2 ج 5 T144 - الإعصار 2 حوالي 5 آلاف خلية
    إ.ب. 4 م. 6 E22C8N - إعصار 4 حوالي 6 آلاف خلية
    إ.ب. 2 ج 8 Q208C8N - إعصار 2 حوالي 8 كيلو خلية

    قد تلاحظ أن الإعصار 3 قد يحتوي على خلايا أكثر من الإعصار 4.

    فيما يلي بعض الخيارات:

    835 روبل.
    ALTERA FPGA CycloneII EP2C5T144 الحد الأدنى من لوحة النظام للتعلم الجيد

    880 روبل
    Altera CycloneII EP2C5T144 FPGA Mini Development Learn Core Board E081

    1265 روبل
    EP2C8 EP2C8Q208C8N ALTERA Cyclone II FPGA لوحة تطوير التقييم الأساسية

    المجالس المتقدمة . هذه هي اللوحات التي تم تثبيت وحدات إضافية (UTP، USB، AUDIO)، والموصلات (SD، VGA)، والأزرار، والمفاتيح، ومصابيح LED، ومؤشرات سبعة قطاعات، وما إلى ذلك. أو قد تكون هناك لوحة أساسية، وقد يتم إرفاق بطاقات التوسعة بها بشكل منفصل.

    لدي مجموعة العمل التالية - لوحة + لوحة التوسع:
    Altrea EP4CE10E22 FPGA CORE Board + لوحة الجهاز USB / الصوت / إيثرنت / بطاقة SD / VGA
    2760 روبل

    هنا اللوحة الرئيسية. يحتوي على 2 مصباح LED وزرين و4 مفاتيح ومؤشر من سبعة أجزاء وشريحة ذاكرة الوصول العشوائي.

    لوحة التوسع. يحتوي على SD وVGA بالإضافة إلى وحدات تحكم USB (رقاقة USB2.0 عالية السرعة: CY7C68013A)، الصوت (بطاقة صوت تصل إلى 96 كيلو هرتز/32 بت ADC/DAC: WM8731S)، UTP (واجهة إيثرنت 100 ميجا: DM9000A):

    يتم ببساطة إدخال هذه الألواح في بعضها البعض، لكن لا يزال لديّها في الدرج. بالنسبة لحرفي اليدوية، لدي لوح تجارب، والذي أقوم بتوصيله بكابل يأتي مع المجموعة. يتم تضمين مصدر طاقة 5 فولت أيضًا.

    لقد اتخذت مؤخرًا خطوتي الأولى نحو FPGAs و . إن شغفي المتعصب بـ FPGAs وفكرة أن FPGAs هي أفضل منصة لإنشاء أي جهاز قد اكتسب طابعًا دينيًا. تنادي طائفة FPGA الخاصة بي بالرفض التام لوحدات التحكم الدقيقة، ويدعو فرع متطرف بشكل خاص إلى رفض ليس فقط المعالجات الناعمة، ولكن أيضًا الحوسبة التسلسلية بشكل عام!

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

    هذه المقالة للمبتدئين. سأصف فيه المشكلات والأسئلة والمفاهيم الخاطئة والأخطاء النموذجية التي قد تظهر في بداية التدريب (لأنها ظهرت لي). ومع ذلك، فإن سياق المقال محدود بحقيقة أن التطوير يتم على FPGA من Altera في بيئة Quartus بلغة Verilog.

    من الصعب أن نعيش دون أن نفعل أي شيء، لكننا لا نخاف من الصعوبات!

    أحد الأسباب التي تجعل العديد من الأشخاص لا يبدأون في تعلم Verilog الآن هو عدم وجود FPGA حقيقي. بعض الأشخاص لا يستطيعون الطلب لأنه باهظ الثمن، والبعض الآخر لأنهم لا يعرفون ما يجب أن يأخذوه (ستتم مناقشة مسألة الاختيار في هذا المقال). بالنسبة للبعض، لا يزال FPGA في طريقه عبر البريد.

    لكن في تطوراتي، توصلت إلى استنتاج مفاده أنني بحاجة إلى FPGA حقيقي في المرحلة النهائية من التطوير، عندما أحتاج إلى اختبار المشروع "في الأجهزة". النقطة المهمة هي أنني أقضي معظم وقتي في تصحيح أخطاء الكود الخاص بي باستخدام أجهزة المحاكاة.

    ولذلك نصيحتي: إن غياب FPGA ليس سببًا لعدم النشاط. كتابة وتصحيح وحدات FPGA في أجهزة المحاكاة!

    محاكاة لفيريلوج

    إذًا، كيف يمكنك الترفيه عن نفسك أثناء أيام العمل الطويلة المملة (إذا كان هذا هو الحال)؟ بالطبع سوف نتقن FPGA! ولكن كيف يمكنك تشغيل بيئة تطوير كاملة من Altera إذا كانت تكلفتك 3 حدود عمل شهرية للإنترنت؟ يمكنك إحضاره على محرك أقراص فلاش! ولكن إذا كان موضوع الدراسة هو Verilog، فيمكنك قصر نفسك على المفكرة، ومترجم IcarusVerilog، وإلقاء نظرة على النتيجة في GTK Wave.

    جربه الآن

    للبدء في بيئة Windows، ما عليك سوى تنزيل ملف التثبيت ierilog-20130827_setup.exe (لقطة التطوير) من الرابط http://bleyer.org/icarus/

    التثبيت لا يسبب أي صعوبات. الآن دعنا ننتقل قليلاً إلى الأمام: لنقم بإنشاء مجلد للمشروع وفيه ملفان بمحتوى غير واضح بعد:

    ملف الوحدة مع رمز لوحدات الاختبار - bench.v

    `المقياس الزمني 1ns / 100 ps الوحدة النمطية testbench () ؛ ريج كلك؛ البداية الأولية $display("start"); $dumpfile("test.vcd"); $dumpvars(0,testbench); clk<= 0; repeat (100) begin #10; clk <= 1; #10; clk <= 0; end $display("finish"); end


    يصف ملف bench.v وحدة اختبار testbench؛ حيث يتم إنشاء مصدر إشارة clk (موجة مربعة). سيتم إنشاء وحدات أخرى في ملفات منفصلة، ​​أو يمكن اختبار المنطق أولاً في هذه الوحدة ثم نقله إلى وحدة منفصلة. ثم ستتم إضافة مثيلات لهذه الوحدات إلى وحدة testbench، حيث سنطبق إشارات الاختبار على مدخلاتها ونتلقى النتائج منها. يمكننا بناء تسلسل هرمي من الوحدات، وأعتقد أن هذا واضح للجميع.

    ملف BAT الذي سيقوم بتجميع ومحاكاة الوحدة الرئيسية، وإضافة وحدات أخرى من المجلد الحالي - makev.bat

    اختبار iverilog -o -I./ -y./ bench.v vvp توقف مؤقت للاختبار


    بعد تشغيل هذا الملف، سنرى على الشاشة النص المحدد في $display (هذا هو إخراج التصحيح)، وستكون قيم الإشارات وسجلات الدائرة في ملف test.vcd. انقر فوق الملف وحدد البرنامج المطلوب عرضه - GTKWave (في حالتي D:\iverilog\gtkwave\bin\gtkwave.exe). بضع نقرات أخرى وسنرى clk الخاص بنا.



    من الناحية العملية، أقوم بإنشاء كل وحدة نمطية جديدة في المفكرة وأقوم بتصحيح أخطاء IcarusVerilog. الخطوة التالية بعد هذا التصحيح هي التحقق من الوحدات في Quartus. على الرغم من أن Quartus لديه أيضًا جهاز محاكاة خاص به، إلا أنني أستخدمه بشكل أقل. السبب هو سهولة تحديث الكود وعرض النتيجة في IcarusVerilog: احفظ التغييرات في الملف، قم بتشغيل BAT، وانقر فوق الزر "تحديث" في GTKWave - هذا كل شيء! في ModelSim، يتطلب هذا المزيد من الحركة، ولكنه ليس سيئًا أيضًا، خاصة في هذه الهياكل المعقدة.

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

    الفرق بين المحاكاة والعمل على أجهزة حقيقية

    في البداية، مثل قطة عمياء، ضربت رأسي بإطارات الأبواب. يبدو أن الكود الصحيح لا يعمل على الإطلاق، أو لا يعمل كما هو متوقع. أو كان يعمل فقط، والآن توقف فجأة!

    تبدأ القطة الفضولية في البحث عن العلاقة بين أفعالها والنتيجة ("خرافة الحمام").

    أكبر دراما
    فيما يلي قائمة بالأشياء الشاذة، ولكن أولاً أكبر الدراما التي واجهتها: لا يمكن تصنيع جميع تصميمات Verilog في الأجهزة. ويرجع ذلك إلى حقيقة أن Verilog لا يصف فقط منطق الأجهزة، والذي يتم دمجه في وحدات ويتم تشغيله في الأجهزة. يصف نفس Verilog وحدات الاختبار التي تجمع بين الوحدات قيد الاختبار، وتوفر إشارات اختبار لمدخلاتها، وهي موجودة بشكل عام فقط للاختبار على جهاز كمبيوتر. يتم تحديد التغيير في قيم الإشارة بمرور الوقت من خلال الإنشاءات التي تحتوي على علامة "#" في نص Verilog. هذه العلامة تعني تأخير الوقت. في المثال أعلاه، هذه هي الطريقة التي يتم بها إنشاء إشارة CLK. واعتقدت بشكل خاطئ أنه بنفس الطريقة، داخل FPGA حقيقي، يمكنك إنشاء، على سبيل المثال، سلسلة من البتات لإرسال رسالة عبر RS232. بعد كل شيء، يتم توفير إشارة من مولد 50 ميجا هرتز إلى مدخلات FPGA! ربما تركز عليه بطريقة أو بأخرى. وكما اتضح، لم أكن الوحيد الذي كان يأمل في حدوث معجزة: , , , , . الحقيقة، كما هو الحال دائما، تبين أنها أكثر خطورة: FPGA عبارة عن مجموعة من المنطق ويمكن أن يظهر تأخير زمني عند استخدام عداد، وتزداد قيمته من خلال دورات الساعة من المولد إلى قيمة معينة، أو بطريقة أخرى (ولكن دائمًا في الأجهزة).
    قائمة الشذوذات الموجودة
    لكن من المدهش أن قراءة الكتب تلقي الضوء على هذا الشيطان. علاوة على ذلك، يتم اكتساب النعمة.
    إذا قمت بتعيينه كـ ريج، فليس حقيقة أنه سيتم إنشاؤه
    كيف وصلتم إلى المشكلة؟ لنفترض أن هناك وحدة نمطية واحدة، يجب أن أقوم بتوفير قيمة لمدخلاتها (حسب نوع المعلمة). في المستقبل، سيتعين على هذه المعلمة أن تتغير بمرور الوقت اعتمادًا على بعض الأحداث الخارجية. لذلك، يجب تخزين القيمة في سجل (reg). لكن تنفيذ تلقي الأحداث الخارجية لم يتم تنفيذه بعد، لذلك لا أغير السجل، ولكن ببساطة أضبطه على قيمته الأولية، والتي لا تتغير في المستقبل.

    // قم بتعيين سجل 8 بت reg val; // ابدأ بالقيمة الأولية val<= 8"d0240; //wire к которому подключим выход из модуля wire out_data; //неведомый модуль, называется bbox //экземпляр этого модуля называется bb_01 //будем считать, что в модуле есть входной порт in_data и выходной out_data //во входной порт подаем значение с регистра val, а выход подключаем к wire - out_data bbox bb_01(.in_data(val), .out_data(out_data));
    يبدو أن هناك صيد؟ في اللغات الأمرية، غالبًا ما نقوم بتعيين المتغيرات كثوابت ثم لا نغيرها أبدًا وكل شيء يعمل. ماذا نرى في الحديد؟


    أولا، نحن لا نرى السجل. ثانيًا، يتم توفير hFF مقاس 8 بوصات لمدخل الوحدة بدلاً من d0240 مقاس 8 بوصات! وهذا يكفي حتى لا يعمل المخطط كما خططنا. حقيقة عدم وجود سجل أمر طبيعي. في Verilog، يمكنك وصف المنطق بطرق مختلفة، وفي الوقت نفسه، يعمل المُركِّب دائمًا على تحسين تنفيذ الأجهزة. حتى لو كتبت كتلة دائمًا وعملت مع السجلات الموجودة فيها، ولكن سيتم تحديد قيمة الإخراج دائمًا من خلال قيم الإدخال، فسيكون استخدام السجل هنا غير ضروري ولن يوفره المركب. والعكس صحيح، إذا لم تتغير قيمة الإخراج بالنسبة لبعض قيم بيانات الإدخال، فلا توجد طريقة للاستغناء عن سجل المزلاج وسيقوم المركب بإنشائه. (الكتاب 1 ص 88-89). ماذا يتبع من هذا؟ إذا بدأنا بتغيير قيمة السجل، على سبيل المثال، اعتمادًا على الضغط على الزر، فسيتم إنشاء السجل بالفعل وسيعمل كل شيء كما ينبغي. إذا اتضح أن الأزرار لا تغير أي شيء، فسوف يقوم المركب برميها مرة أخرى وسوف ينهار كل شيء مرة أخرى. ما يجب القيام به مع ثابت؟ تحتاج إلى إطعامه مباشرة إلى إدخال الوحدة:

    Bbox bb_01(.in_data(8"d0240), .out_data(out_data));
    الآن لدينا القيمة الصحيحة عند إدخال الوحدة:

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

    من الأفضل ضبط حجم السلك بنفسك.
    عند التطوير في بيئة الكوارتوس، من الممكن عدم تحديد خطوط الأسلاك مسبقًا. في هذه الحالة، سيتم إنشاؤها تلقائيًا، ولكن سيتم إصدار تحذير بشأن ذلك. المشكلة هي أن السلك سيكون بعرض 1 بت، وإذا كانت المنافذ أكبر من 1 بت، فلن يتم نقل القيمة.

    Bbox bb_01(.in_data(8"d0240), .out_data(int_data));other_bbox bb_02(.in_data(int_data), .out_data(out_data));
    تحذير
    تحذير (10236): تحذير Verilog HDL Implicit Net عند test.v(15): تم إنشاء شبكة ضمنية لـ "int_data"
    نتيجة:

    كما ترون، يتم توصيل بت واحد، والبتات السبعة المتبقية غير متصلة (NC). لتجنب هذه المشكلة، تحتاج إلى إنشاء السلك بنفسك. لا عجب أن مترجم IcarusVerilog لا يصدر تحذيرًا، بل خطأ إذا لم يتم تحديد السلك مسبقًا.

    سلك int_data؛ bbox bb_01(.in_data(8"d0240), .out_data(int_data));other_bbox bb_02(.in_data(int_data), .out_data(out_data));

    لن يتسلق الكمبيوتر عبر الوحدات لمعرفة سعة المنفذ. بالإضافة إلى ذلك، قد يكون عمق البتات مختلفًا، ولا يتم أخذ كل البتات من مدخلات أو مخرجات الوحدة، ولكن بعض البتات المحددة.

    لا يمكنك استخدام مخرجات دالة منطقية كإشارة على مدار الساعة
    في بعض الأحيان يتطلب المشروع تقليل تردد الساعة أو إدخال تأخير زمني لدورات الساعة N. يمكن للمبتدئين استخدام عداد ودائرة إضافية لتحديد ما إذا كان العداد قد وصل إلى قيمة معينة (دائرة المقارنة). ومع ذلك، إذا كنت تستخدم الإخراج من دائرة المقارنة مباشرة كساعة، فقد تنشأ مشاكل. وذلك لأن الدائرة المنطقية تستغرق بعض الوقت لتأسيس قيمة إخراج مستقرة. يؤدي هذا التأخير إلى إزاحة الجزء الأمامي من الإشارة التي تمر عبر أجزاء مختلفة من الدائرة المنطقية بالنسبة للساعة، مما يؤدي إلى حدوث سباقات وقابلية شبه مستقرة وعدم التزامن. حتى أنني سمعت ذات مرة تعليقًا حول هذا باعتباره انتقادًا لـ FPGAs: "هناك مشاكل مستمرة مع FPGAs - سباقات الإشارة".

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

    وبالتالي، تم إنشاء جميع المنهجيات اللازمة لمطوري الأجهزة المعتمدة على FPGA، وإذا التزمت بها، فلن تكون هناك أي مشاكل.

    ماذا لو أردت أن أخالف النظام؟
    يقودنا ترتيب التطوير وسلوك مُركِّب الدائرة إلى استنتاج ما هو FPGA على مستوى الأجهزة. هذه دوائر متزامنة. ولذلك، فإن من بين أهداف المركب هو تلبية الفواصل الزمنية. للقيام بذلك، فهو، على سبيل المثال، يبسط التعبيرات المنطقية، ويزيل من أجزاء التوليف من الدوائر التي لا تستخدمها دوائر أخرى وغير مرتبطة بالمخرجات المادية لـ FPGA. الحلول غير المتزامنة والحيل التناظرية غير مرحب بها، لأن تشغيلها يمكن أن يكون غير متوقع ويعتمد على أي شيء (الجهد، ودرجة الحرارة، والعملية الفنية، والدفعة، وتوليد FPGA)، وبالتالي لا توفر نتيجة مضمونة وقابلة للتكرار وقابلة للتحويل. لكن الجميع يحتاج إلى نتيجة مستقرة وأساليب مشتركة للتصميم!

    ولكن ماذا تفعل إذا كنت لا توافق على رأي المُركِّب القائل بأنك بحاجة إلى التخلص من السجلات غير القابلة للتغيير وتقصير الدوائر المنطقية؟ ماذا لو كنت تريد إنشاء دوائر ذات منطق غير متزامن؟ هل تحتاج إلى بعض الضبط الدقيق؟ أو ربما تريد أنت بنفسك تجميع دائرة باستخدام مكونات FPGA منخفضة المستوى؟ بسهولة! شكرًا لمطوري Altera على هذه الفرصة والوثائق التفصيلية!

    كيف افعلها؟ يمكنك تجربة محرر الدوائر الرسومية. ربما سمعت أن Quartus يسمح لك برسم المخططات؟ يمكنك اختيار الكتل القياسية بنفسك وربطها. ولكن هذا ليس الحل! حتى الدائرة المرسومة سيتم تحسينها بواسطة المُركب، إن أمكن.

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

    لنبدأ بحقيقة أنه من خلال وصف الهندسة المعمارية في Verilog بطريقة معينة، يمكنك الحصول على نتيجة معينة. فيما يلي أمثلة التعليمات البرمجية للحصول على مشغل RS المتزامن وغير المتزامن:

    // وحدة وحدة تشغيل RS المتزامنة rs(clk, r, s, q); سلك الإدخال clk، r، s؛ إخراج ريج س ؛ دائمًا @(posege clk) يبدأ إذا بدأ (r) بـ q<= 0; end else if (s) begin q <= 1; end end endmodule
    في هذه الحالة، تحصل على مشغل متزامن.

    إذا تجاهلت إشارة الساعة وقمت بالتبديل اعتمادًا على أي تغييرات في r وs، فإن النتيجة هي عنصر ذو قيمة غير متزامنة - مزلاج.

    // مثال على وحدة تشغيل RS غير المتزامنة ModuleTester(clk, r, s, q); سلك الإدخال clk، r، s؛ إخراج ريج س ؛ دائمًا @(r أو s) تبدأ إذا كانت (r) تبدأ q<= 0; end else if (s) begin q <= 1; end end endmodule

    الوحدة النمطية ModuleTester(clk, r, s, q); سلك الإدخال clk، r، s؛ إخراج ريج س ؛ DLATCH lt(.q(q), .clrn(~r), .prn(~s)); com.endmodule

    ونتيجة لذلك، فإن جميع "مجموعة الجسم" عند مدخل المزلاج، والتي اعتبرها المركب ضرورية، سوف تختفي وسنحصل على ما أردناه بالضبط:

    يمكن العثور على قائمة بالأوليات الموجودة على موقع Altera الإلكتروني.

    والآن مثال صغير عن عدم التزامن والاختزال. قررت، على سبيل المثال، إنشاء مولد وفقًا لنفس المبدأ الذي كان معتادًا عليه من قبل، ولكن فقط على FPGA:

    لكن لزيادة المدة سأأخذ 4 عناصر لكن واحد منهم فقط سيكون مع الانقلاب:

    الوحدة النمطية ModuleTester(q); إخراج الأسلاك ف؛ سلك أ، ب، ج، د؛ تعيين أ = ب؛ تعيين ب = ج؛ تعيين ج = د؛ تعيين د = ~أ؛ تعيين س = أ؛ com.endmodule

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

    لكن إذا وضعنا شرطًا للمركب ألا يتم تقصير الأسطر a، b، c، d، فسنحصل على ما قصدناه. تُستخدم التوجيهات لتقديم تلميحات إلى المُركِّب. إحدى الطرق للإشارة إلى ذلك هي من خلال النص في التعليق:

    الوحدة النمطية ModuleTester(q); إخراج الأسلاك ف؛ السلك أ، ب، ج، د /* الاحتفاظ بالتوليف */; // ^^^--- هذا توجيه لمركب الصوت sign a = b; تعيين ب = ج؛ تعيين ج = د؛ تعيين د = ~أ؛ تعيين س = أ؛ com.endmodule
    وهذه هي النتيجة - سلسلة من أربعة عناصر:

    وهذا ليس كل شيء! سأترك الأمر لمتعة الدراسة المستقلة: العمل مع حالة وتوجيه لتنفيذها كذاكرة وصول عشوائي/ذاكرة قراءة فقط أو دائرة منطقية؛ العمل مع كتل الذاكرة المدمجة (RAM/ROM)؛ اختيار تنفيذ الضرب - مضاعف الأجهزة أو الدائرة المنطقية.

    سأبدأ مقالتي الأولى بالقول: أنا جديد على موضوع هذه المقالة، ولكنني اخترت هذا الموضوع فقط. سأشرح لماذا. لقد كنت أقرأ المركز منذ فترة طويلة وكنت دائمًا مهتمًا بموضوعات أولئك الذين يدرسون حاليًا ما يتحدثون عنه. مثل هذه المقالات تكون دائمًا مفهومة، وتجد جمهورها دائمًا وتنقل دائمًا للقارئ اهتمام المؤلف وحماسه، والذي عادة ما يكون خارج المخططات للمبتدئين في أي مجال!

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

    لقد عرفنا الهدف، والسؤال هو كيف؟ يوجد داخل FPGA بعض العناصر الأساسية المرتبطة بناءً على سجل التكوين. تعتمد العناصر الأساسية المحتملة ونوع وموقع تخزين سجل التكوين على نوع FPGA وعلى الطراز المحدد. يوجد في FPGAs الحديثة نوعان: CPLD و FPGA، وسنعطي كل منهما فقرة.

    CPLD (جهاز منطقي قابل للبرمجة معقد - أجهزة منطقية معقدة قابلة للبرمجة) - FPGA، عناصرها الأساسية هي الخلايا الكبيرة والبوابات المنطقية البسيطة (AND(-NOT)/OR(-NOT)). يحتوي عادةً على عناصر أساسية أقل من FPGA، ولكنه أسرع. كما أنها تحتوي عادةً على ذاكرة تكوين غير متطايرة مباشرة على الشريحة، ولكنها تحتوي على عدد محدود من دورات التكوين.

    FPGA (مصفوفة البوابة القابلة للبرمجة ميدانيًا) - FPGAs، والتي عادةً ما تحتوي على مجموعة كاملة من أنواع الكتل الأساسية، وهي عناصر منطقية مخصصة (جداول الحقيقة) وكتل الجمع والضرب (معالجة الإشارات الرقمية - DSP) وPLL (المرحلة المقفلة) Loop) لتقسيم وضرب الترددات وبعضها الآخر حسب النموذج. عادةً ما تحتوي على ذاكرة داخلية متطايرة ووظيفة لتحميل التكوينات من ذاكرة خارجية غير متطايرة.

    يمكنك العثور على تعريفات مختلفة جدًا لهذه الأنواع من FPGAs والاختلافات بينها، سواء في الكتب أو على الإنترنت. لذلك، لا ينبغي أن تتوقف عند هذا الاختلاف؛ فالمصنعون أنفسهم يصنفون FPGAs التي ينتجونها. إذا كنت لا تتذكر الاختصارات أو لا تفهم معنى بعض الكلمات، فلا بأس، الشيء الرئيسي هو ظهور فهم عام لـ FPGAs، أتمنى أن أكون قد حققت ذلك. الآن إلى الممارسة!

    لنبدأ بمناقشة الأدوات. سأستخدم لوحة Altera Cyclone II FPGA Starter Board، وهي لوحة جاهزة تم تثبيت سلسلة Cyclone II FPGA عليها - EP2C20F484C7N - بالإضافة إلى الأجهزة الطرفية والواجهات المختلفة. في هذه المقالة، نستخدم مصابيح LED ومؤشرات من سبعة قطاعات. لن نستخدم أي كتل خاصة من سلسلة FPGA هذه، لذا يمكنك استخدام أي FPGA آخر تقريبًا (FPGA وCPLD) إذا كنت ترغب في ذلك.

    يمكن لأولئك المهتمين جدًا شراء إحدى مجموعات التطوير أو تجميع الجهاز بأنفسهم، وهو أمر صعب جدًا بالنسبة للمبتدئين، ولكنه مهمة قابلة للتنفيذ تمامًا. من السهل على Google استخدام مخططات المبرمج ومخططات الاتصال الخاصة بـ FPGA نفسها، ويمكن لأي شخص عمل سابقًا على البرامج الثابتة لـ AVR للهواة العثور على مبرمج Altera Byte Blaster مناسب. بشكل عام، أقدم لك تنفيذ الدائرة (يوجد في نهاية المقالة رسم تخطيطي لدائرة Starter Board الخاصة بي). يمكن لأي شخص يريد تجربته دون إنفاق المال ورؤية نتيجة العمل استخدام جهاز المحاكاة المدمج في Quartus II (لم يتم وصف العمل معه في هذه المقالة).

    بالنسبة للبرامج، سنستخدم Quartus II، النسخة المجانية التي يمكنك العثور عليها على موقع الشركة المصنعة (Altera)، سواء في إصدارات Windows أو Linux.

    والآن نقترب من التدريب! أطلقنا نظام Quartus II CAD الخاص بنا وقمنا بإنشاء مشروع. الخطوات الأولى للمعالج هي الإشارة إلى اسم المشروع وموقعه، ثم تخطي خطوة إضافة الملفات (سيكون لدينا وقت لاحقاً). سننتهي من إنشاء المشروع في مرحلة اختيار الجهاز؛ إذا كنا نقوم بذلك على قطعة من الأجهزة، فإننا نعرف بالضبط اسم FPGA، ونقوم باختياره. إذا كنا نقوم فقط بإنشاء مشروع لـ FPGAs، فسنختار شيئًا أكثر قوة، على سبيل المثال، إعصار ثالث. اخترت FPGA المثبت في مجموعة أدوات التشغيل الخاصة بي.

    انقر فوق "إنهاء" - يتم إنشاء المشروع. هيكل المشروع في Quartus هرمي، نحتاج إلى تحديد الجزء العلوي من التسلسل الهرمي (كيان المستوى الأعلى). بالنسبة للتصميم، يمكننا استخدام ملفات الدوائر والملفات مع وصف المنطق في إحدى لغات وصف الأجهزة (HDL). رأيي هو أن الطريقة الأكثر وضوحًا هي استخدام ملف الدائرة مع الكتل المنطقية الرئيسية كأعلى التسلسل الهرمي، وتنفيذ الكتل نفسها في HDL. قد تكون الآراء مختلفة، بينما كنت أختار، قرأت الكثير من موضوعات الهوليفار، لكنني استقرت الآن على هذا النموذج، يمكنك الاختيار. لقد اخترت VHDL ((دوائر متكاملة عالية السرعة جدًا) لغة وصف الأجهزة) كلغة HDL للمشروع؛ يمكنك استخدام أي لغة أخرى، على سبيل المثال Verilog أو AHDL، كل هذا يتوقف على تفضيلاتك.

    قم بإنشاء ملف مشروعنا الأول (ملف - جديد..) وحدد مخطط الكتلة/الملف التخطيطي. الآن دعونا نرسم دائرة بسيطة، ونضيف مدخلاً واحدًا ومخرجًا واحدًا ونقوم بتوصيلهم (في FPGA الحقيقي، ستنقل هذه الدائرة إشارة من ساق إلى أخرى). للقيام بذلك، انقر نقرًا مزدوجًا فوق مساحة فارغة في الرسم التخطيطي وحدد العنصر المطلوب في مربع حوار الرمز الذي يفتح.

    نحن نتواصل بهذه الطريقة، بخط. دعونا نعطي أسماء الدبابيس (انقر نقرًا مزدوجًا على العناصر)، وسيُسمى الإدخال CLOCK_27، وسيُسمى الإخراج LEDR. لم يتم اختيار الأسماء عن طريق الصدفة - قمت بعد ذلك بربط CLOCK_27 بإدخال مذبذب 27 ميجا هرتز، وLEDR مع مؤشر LED الأحمر الصفري. احفظ الملف، واترك مربع اختيار الإضافة إلى المشروع. لنقم الآن بتعيين الملف الناتج ليكون أعلى التسلسل الهرمي للمشروع. للقيام بذلك، في نافذة Project Navigator، في علامة التبويب "الملفات"، في قائمة السياق الخاصة بملفنا، حدد "Set as Top-Level Entity". مرحباً، العالم جاهز. نقوم بتجميع المشروع (المعالجة – بدء التجميع)، إذا رأينا معلومات: تم تجميع Quartus II Full Compilation بنجاح. – نفرح ونعتبر أن المرحلة الأولى قد اكتملت.

    الآن دعونا ننظر إلى أهدافنا. سيبدأ جهازنا في حساب الدقائق والساعات عند تشغيل الطاقة. وهذا يعني أننا سنحتاج إلى أربعة مؤشرات مكونة من سبعة قطاعات "HH: MM". لحساب الوقت نحتاج إلى إشارة 1 هرتز أكثر أو أقل دقة. نحصل عليه بتقسيم التردد 27 ميجا هرتز، ثم نحسبه على 60 (ثانية)، ثم مرة أخرى على 60 (دقيقة)، ثم على 24 (ساعة). من الكتلتين الأخيرتين، سيتم توفير العدد الثنائي للدقائق والساعات إلى حاوية وحدة فك التشفير -> BCD (الرقم العشري المشفر الثنائي) -> 7seg. هذا، بشكل عام، هو الجهاز كله. سأحجز على الفور أن الدائرة ستكون غير متزامنة (تبدأ الدقائق من الثواني، والساعات من الدقائق)، من أجل البساطة والوضوح.

    لذلك، دعونا ننشئ الكتلة الأولى لدينا - كتلة تقسيم التردد. لنقم بإنشاء ملف جديد، كما نعلم بالفعل، سيكون نوع الملف فقط هو VHDL File. لنلصق الكود فيه:

    مكتبة إييي؛
    استخدم ieee.std_logic_1164.all؛

    الكيان Div_27Mhz_to_1 هرتز هو
    ميناء (clk: في std_logic؛ clk_out: خارج std_logic)؛
    نهاية Div_27Mhz_to_1HZ؛

    سلوك div_behavior للهندسة المعمارية Div_27Mhz_to_1 هرتز هو
    يبدأ
    عملية (كلك)
    المتغير cnt: نطاق عدد صحيح من 0 إلى 27000000؛
    يبدأ
    ثم

    إذا (المجلس الوطني >= 13500000)
    ثم
    clk_out<= "1";
    آخر
    clk_out<= "0";
    إنهاء إذا؛

    إذا (المجلس = 27000000)
    ثم
    المجلس الوطني الانتقالي:= 0;
    آخر
    CNT:= CNT + 1;
    إنهاء إذا؛

    إنهاء إذا؛
    إنهاء العملية؛
    نهاية div_behavior؛

    سأتخطى توجيهات الخدمة (يمكنك البحث عنها في الكتاب المرجعي، الروابط في النهاية)، سأهتم فقط بمنطق العمل. أولا نعلن الكيان، أي. الكتلة نفسها. ونشير إلى مدخلاتها ومخرجاتها وأنواعها وأسمائها. النوع std_logic في اللغة الشائعة يعني البت. بعد ذلك، نقوم بوصف البنية الداخلية لهذه الكتلة. تتكون البنية من عمليات متوازية. كل عملية لها قائمة الحساسية الخاصة بها، على سبيل المثال، العملية الوحيدة في المثال أعلاه حساسة للتغيرات في إدخال clk. يمكنك الإعلان عن متغيرات لعملية ما، في مثالنا هذا متغير من النوع عدد صحيح يتراوح من 0 إلى 27000000. بعد ذلك، يتم تعيين المنطق الأولي في نص العملية: حتى مرور نصف الفترة، ندفع الصفر المنطقي إلى الناتج، عندما يمر النصف، ندفع واحدًا، ولا تنس العد وإعادة تعيين العداد إلى الصفر عندما يصل إلى 27.000.000. أنا لا أدعي أن لدي رمزًا مثاليًا - بينما لا أزال أتعلم، سأفعل كن سعيدا للتصحيحات :)

    نقوم بحفظ الملف بالكود وإنشاء رمز (ملف - إنشاء/تحديث - إنشاء ملفات رموز للملفات الحالية)، وهذا ضروري لإدراج هذه الكتلة في مخططنا الرئيسي. يمكنك العثور على الرموز الخاصة بك في مجلد المشروع في مربع حوار إدراج الرمز. الآن دعونا نتناول الكتل المتبقية بتفاصيل أقل.

    مكتبة إييي؛
    استخدم ieee.std_logic_1164.all؛
    استخدم ieee.std_logic_unsigned.all؛

    الكيان cnt_0_to_59 هو
    المنفذ (clk: في std_logic؛ c59: خارج std_logic؛ المتجه: خارج std_logic_vector(5 نزولاً إلى 0));
    نهاية cnt_0_to_59؛

    العمارة cnt_behavior لـ cnt_0_to_59 هي
    يبدأ
    عملية (كلك)
    المتغير cnt: نطاق الأعداد الصحيحة من 0 إلى 59؛
    يبدأ
    إذا (clk"الحدث وclk = "1")
    ثم
    إذا (المجلس = 59)
    ثم
    المجلس الوطني الانتقالي:= 0;
    ج59<= "1";
    المتجه<= CONV_STD_LOGIC_VECTOR(cnt, 6);
    آخر
    CNT:= CNT + 1;
    ج59<= "0";
    المتجه<= CONV_STD_LOGIC_VECTOR(cnt, 6);
    إنهاء إذا؛
    إنهاء إذا؛
    إنهاء العملية؛
    نهاية cnt_behavior؛

    هذه هي وحدة العد من صفر إلى 59 التي نستخدمها لحساب الدقائق والثواني. من بين الميزات الجديدة هنا نوع الإخراج std_logic_vector(5 downto 0)، الذي يحدد مجموعة من البتات (متجه البتات)، بالإضافة إلى الدالة CONV_STD_LOGIC_VECTOR(cnt, 6)، التي تحول المتغير إلى متجه بت من المحدد طول.

    مكتبة إييي؛
    استخدم ieee.std_logic_1164.all؛
    استخدم ieee.std_logic_unsigned.all؛

    بالنسبة إلى CONV_STD_LOGIC_VECTOR:
    استخدم ieee.std_logic_arith.all؛

    الكيان cnt_0_to_23 هو
    المنفذ (clk: في std_logic؛ المتجه: خارج std_logic_vector(4 نزولاً إلى 0));
    نهاية cnt_0_to_23؛

    العمارة cnt_behavior لـ cnt_0_to_23 هي
    يبدأ
    عملية (كلك)
    المتغير cnt: نطاق الأعداد الصحيحة من 0 إلى 23؛
    يبدأ
    إذا (clk"الحدث وclk = "1")
    ثم
    إذا (المجلس = 23)
    ثم
    المجلس الوطني الانتقالي:= 0;
    المتجه<= CONV_STD_LOGIC_VECTOR(cnt, 5);
    آخر
    CNT:= CNT + 1;
    المتجه<= CONV_STD_LOGIC_VECTOR(cnt, 5);
    إنهاء إذا؛
    إنهاء إذا؛
    إنهاء العملية؛
    نهاية cnt_behavior؛

    أعلاه هو عداد الساعة. لا شيء جديد.

    مكتبة إييي؛
    استخدم ieee.std_logic_1164.all؛
    استخدم ieee.std_logic_unsigned.all؛

    بالنسبة إلى CONV_STD_LOGIC_VECTOR:
    استخدم ieee.std_logic_arith.all؛

    الكيان bin2bcd_5bit هو
    port(bin:in std_logic_vector(4 downto 0);
    bcd1: خارج std_logic_vector(3 نزولاً إلى 0);
    bcd10: خارج std_logic_vector(3 نزولاً إلى 0)
    );

    نهاية bin2bcd_5bit؛

    سلوك محول البنية لـ bin2bcd_5bit هو
    يبدأ
    عملية (بن)
    المتغير i: نطاق الأعداد الصحيحة من 0 إلى 23؛
    المتغير i1: نطاق الأعداد الصحيحة من 0 إلى 9؛
    يبدأ
    أنا:= conv_integer(bin);
    i1:= ط / 10؛
    bcd10<= CONV_STD_LOGIC_VECTOR(i1, 4);
    i1:= أنا العينية 10;
    bcd1<= CONV_STD_LOGIC_VECTOR(i1, 4);
    إنهاء العملية؛
    نهاية سلوك_المحول؛

    يقوم المحول الثنائي إلى BCD بتقسيم رقم ثنائي واحد إلى رقمين، يمثل كل منهما منزلة عشرية. ومن بين الميزات الجديدة عامل rem، وهو ما تبقى من القسمة. المحول لستة بتات مكتوب بطريقة مماثلة، ولن أذكره هنا.

    مكتبة إييي؛
    استخدم ieee.std_logic_1164.all؛
    استخدم ieee.std_logic_unsigned.all؛

    الكيان BCD_to_7seg هو
    ميناء(
    BCD: في std_logic_vector(3 نزولاً إلى 0);
    Seg: خارج std_logic_vector(6 نزولاً إلى 0)
    );

    نهاية BCD_to_7seg؛

    بنية conv_behavior لـ BCD_to_7seg هي
    يبدأ
    عملية (BCD)
    يبدأ
    إذا BCD = "0000" ثم قسم<= "0000001";--0
    elsif BCD = "0001" ثم seg<= "1001111";--1
    elsif BCD = "0010" ثم seg<= "0010010";--2
    elsif BCD = "0011" ثم seg<= "0000110";--3
    elsif BCD = "0100" ثم seg<= "1001100";--4
    elsif BCD = "0101" ثم seg<= "0100100";--5
    elsif BCD = "0110" ثم seg<= "0100000";--6
    elsif BCD = "0111" ثم seg<= "0001111";--7
    elsif BCD = "1000" ثم seg<= "0000000";--8
    elsif BCD = "1001" ثم seg<= "0000100";--9
    قسم آخر<= "1001001";--err
    إنهاء إذا؛
    إنهاء العملية؛
    نهاية conv_behavior؛

    محول كود مكون من بت واحد إلى سبعة أجزاء يتم تنفيذه باستخدام جدول حقيقة بسيط. يعد الكود المكون من سبعة أجزاء في حد ذاته تمثيلًا بسيطًا للمقاطع المحترقة على المؤشر بالترتيب abcdefg، وفي حالتي أيضًا معكوس.