هذه السلسة من التغريدات مخصصة لأساسيات فيرلوغ من الصفر..
تستخدم لغة فيرلوغ لتصميم دوائر الـ FPGA/ASIC/SoC الرقمية ومحاكاتها أيضا .. لغة فيرلوغ قريبة من لغة سي وتعتبر أسهل للتعلم من VHDL عند أغلب المهتمين. لكن نسبة استعمال اللغتين متقاربة حول العالم.
كما نعلم للدوائر الإلكترونية مداخل ومخارج، لذلك أول خطوة في كتابة كود فيرلوغ لدائرة (وِحدة) ما هو تحديد منافذها؛ هل هذه المنافذ مداخل أم مخارج أم مداخل ومخارج في نفس الوقت؟ ما هو نوعها؟ ما هو حجمها؟ يجب أن تجيب على هذه الثلاث أسئلة بالإضافة لكتابة اسم لهذه المنافذ عندما تنشئ وحدة
أولا نكتب الكلمة المفتاحية module ثم اسم الوحدة (تذكر أن فيرلوغ لغة تفرق بين الحروف الإنجليزية الصغيرة والكبيرة):
module mycircuit
بعد ذلك نضع أسماء المنافذ وأنواعها واتجاهها (مدخل أم مخرج أم كلاهما) وأحجامها داخل قائمة المنافذ (Port List) .. المثال في التغريدة التالية
module mycircuit
بعد ذلك نضع أسماء المنافذ وأنواعها واتجاهها (مدخل أم مخرج أم كلاهما) وأحجامها داخل قائمة المنافذ (Port List) .. المثال في التغريدة التالية
module mycircuit (input x1, output [7:0] reg y1);
ترتيب المنافذ داخل القائمة لا يهم، ولاحظ وضع الفاصلة المنقوطة بعد القائمة وهذا ضروري. لاحظ أيضا ماذا كتبت في المنفذ الثاني:
output [7:0] reg y1
أولا اتجاهه (مخرج) ثم حجمه (8 بت وأرقام مواقعها من 7 إلى 0) ثم نوعه (reg) ثم اسمه. ترتيب هذه الصفات لكل منفذ ضروري.
output [7:0] reg y1
أولا اتجاهه (مخرج) ثم حجمه (8 بت وأرقام مواقعها من 7 إلى 0) ثم نوعه (reg) ثم اسمه. ترتيب هذه الصفات لكل منفذ ضروري.
الـ reg عبارة عن متغير يمكن أن يحمل القيم التالية:
1 (Logic High)
0 (Logic Low)
x (Unkown)
z (High Impedance)
يمكن أن يكون هذا المتغير مخرجا للوحدة لكن لا يمكن أن يكون مدخلا .. كما يمكن استخدامه لأغراض أخرى كالعدادات والآلات محدودة الحالات FSMs وتخزين قيم لأغراض أخرى.
1 (Logic High)
0 (Logic Low)
x (Unkown)
z (High Impedance)
يمكن أن يكون هذا المتغير مخرجا للوحدة لكن لا يمكن أن يكون مدخلا .. كما يمكن استخدامه لأغراض أخرى كالعدادات والآلات محدودة الحالات FSMs وتخزين قيم لأغراض أخرى.
إذا لم تحدد نوع المنفذ في قائمة المنافذ فسيعتبر من نوع wire أو "سلك".. هذا النوع يستخدم للتوصيل ويمكن أن يحمل نفس قيم reg لكن لا يستطيع الاحتفاظ بقيمته ويجب أن يتم تحديث قيمته طول الوقت باستخدام الكلمة المفتاحية assign. مثال في التغريدة التالية:
مثال:
wire w1;
assign w1 = f1;
هنا كل ما تغيرت قيمة f1 سيتم تحديث w1 بهذه القيمة تلقائيا وأولا بأول لأننا استخدمنا assign ويجب أن نستخدمها دائما مع الـ wire.
wire w1;
assign w1 = f1;
هنا كل ما تغيرت قيمة f1 سيتم تحديث w1 بهذه القيمة تلقائيا وأولا بأول لأننا استخدمنا assign ويجب أن نستخدمها دائما مع الـ wire.
الرقم في التغريدة مكتوب بالعكس 😅الصورة تعطي طريقة الكتابة الصحيحة
جاري تحميل الاقتراحات...