فيريلوج (برمجة)
بنيات قابلة للتركيب

لغه فيريلوج تعتبر على نطاق واسع أن HDL (لغة وصف الأجهزة). كما انه هناك العديد من العبارات في لغة فيريلوج والتي لا تحتوي على تناظرية في الأجهزة الحقيقية، ونأخذ على سبيل المثال $ display. وبالتالي فإنه لا يمكن استخدام الكثير من اللغات لوصف الأجهزة.
في واقع الامر فإنه هذا قد يبدو لك كـ تعريف لـ لغه فيريلوج الذي يكون بشكل عام يحتاج إلى إعادة توصيف بشكل صحيح. ومع ذلك، فإن الأمثلة المقدمة هنا هي المجموعة الفرعية الكلاسيكية (والمحدودة) للغة التي لها تعيين مباشر للبوابات الحقيقية.
// Mux examples — Three ways to do the same thing.

// The first example uses continuous assignment
wire out;
assign out = sel ? a : b;

// the second example uses a procedure
// to accomplish the same thing.

reg out;
always @(a or b or sel)
 begin
  case(sel)
   1'b0: out = b;
   1'b1: out = a;
  endcase
 end

// Finally — you can use if/else in a
// procedural structure.
reg out;
always @(a or b or sel)
 if (sel)
  out = a;
 else
  out = b;
الهيكل المثير للإهتمام الذي سوف اعرضه لك الآن هو مزلاج شفاف؛ سيمرر المدخلات إلى الخرج عندما يتم ضبط إشارة البوابة على «المرور عبر»، كما انه يلتقط المدخلات ويخزنها عند انتقال إشارة البوابة إلى «الانتظار». سيبقى الإخراج ثابتًا بغض النظر عن إشارة الإدخال أثناء ضبط البوابة على «تعليق». في المثال الذي تراه ادناه، سيكون مستوى «المرور» للبوابة عندما تكون قيمة جملة if صحيحة، أي البوابة = 1. تتم قراءة هذا «إذا كانت البوابة صحيحة، يتم تغذية الدين إلى latch_out بشكل مستمر.» ولكن احذر فإنه بمجرد أن تكون جملة if خاطئة، فإن القيمة الاخير ستبقى في latch_out ومستقلة عن قيمة din.
// Transparent latch example

reg latch_out;
always @(gate or din)
 if(gate)
  latch_out = din; // Pass through state
  // Note that the else isn't required here. The variable
  // latch_out will follow the value of din while gate is
  // high. When gate goes low, latch_out will remain constant.
flip-flop هو القالب المهم التالي؛ في لغة فيليوج، D-flop هو الأبسط في هذه اللغة، ويمكن تصميمه على النحو التالي:
reg q;
always @(posedge clk)
 q <= d;
إن الشي الذي يجب ملاحظته في هذا المثال المستخدم والذي يعد مهما أيضا هو استخدام تخصيص عدم الحظر. القاعدة الأساسية الأساسية هي استخدام <= عندما يكون هناك بيان posedge أو Negedge ضمن جملة Always.(دائما)

إن البديل من D-flop هو واحد مع مراعاه إعادة تعيين غير متزامن؛ هناك اصطلاح مايجدر معرفته فيه أن حالة إعادة التعيين ستكون أول عبارة في العبارة.
reg q;
always @(posedge clk or posedge reset)
 if(reset)
  
 else
  q <= d;
المتغير التالي يتضمن كلاً من الامرين التاليين:
إعادة تعيين غير متزامن وشرط مجموعة غير متزامن مرة أخرى
تدخل الاتفاقية حيز التنفيذ، وهذا المصطلح يعني إعادة التعيين يتبعه المصطلح المحدد.
reg q;
always @(posedge clk or posedge reset or posedge set)
 if(reset)
  q <= 0;
 else
 if(set)
  q <= 1;
 else
  q <= d;
ملاحظة: إذا تم استخدام هذا النموذج لنمذجة قالب تعيين / إعادة تعيين، فإن هذا قد ينتج عن ذلك أخطاء في المحاكاة ضع في اعتبارك تسلسل الاختبار التالي للأحداث التي سوف تجري .
اولا) إعادة التعيين إلى مستوى عالٍ
ثانيا) يرتفع مستوى clk
ثالثا) يرتفع مستوى clk
رابعا) يرتفع مستوى clk مرة أخرى
خامسا) يتم إعادة التعيين إلى مستوى منخفض متبوعًا بـ
سادسا) مجموعة منخفضة. لا تفترض أي إعداد وتعليق الانتهاكات.
في هذا المثال الذي اسلف ذكره، سيتم تنفيذ العبارة Always @ وهي بمعنى دائما أولاً عند حدوث الحافة الصاعدة لإعادة التعيين والتي ستضع q على القيمة 0.اما في المرة التالية التي يكون فيها تنفيذ الكتلة دائمًا هو الحافة الصاعدة لـ clk والتي ستحافظ مرة أخرى على q عند القيمة 0. يتم بعد ذلك تنفيذ الكتلة دائمًا عند ارتفاع الضبط والذي نظرًا لأن إعادة التعيين هي قوى عالية q للبقاء عند 0. في بعض الاحوال قد تكون هذه الحالة صحيحة وقد لا تكون أيضا ويعتمد هذا الامر كليا على التقليب الفعلي. ومع ذلك فإننا لا نعد هذا الامر المشكله الرئيسيه أو الاساسيه في هذا النموذج. لاحظ أنه عند انخفاض إعادة التعيين، تظل هذه المجموعة عالية. في تقليب حقيقي، سيؤدي هذا إلى انتقال الإخراج إلى 1. كما انه في الواقع في هذا النموذج لن يحدث ذلك لأن الكتلة دائمًا يتم تشغيلها عن طريق ارتفاع حواف المجموعة وإعادة التعيين - وليس المستويات. قد يكون من الامور الضروريه اتباع نهج مختلف لضبط / إعادة ضبط الوجه المتأرجح. [1]
المتغير الأساسي الأخير هو الذي ينفذ D-flop مع تغذية mux لمدخلاته. يحتوي mux على مدخلات d وردود الفعل من التقليب نفسه. هذا يسمح بوظيفة التحميل المسور. لذلك هذه هي طريقه تنفيذه
// Basic structure with an EXPLICIT feedback path
always @(posedge clk)
 if(gate)
  q <= d;
 else
  q <= q; // explicit feedback path

// The more common structure ASSUMES the feedback is present
// This is a safe assumption since this is how the
// hardware compiler will interpret it. This structure
// looks much like a latch. The differences are the
// '''@(posedge clk)''' and the non-blocking '''<='''
//
always @(posedge clk)
 if(gate)
  q <= d; // the "else" mux is "implied"
لاحظ معي أنه لا توجد كتل للكتابه «أولية» مذكورة في هذا الوصف. بل نلاحظ أن هنالك بين أدوات التوليف FPGA و ASIC في هذا الهيكل. وفي الواقع فإن ادوات FPGA تتيح الكتل الأولية حيث يتم إنشاء قيم reg بدلاً من استخدام إشارة «إعادة تعيين». لا تدعم أدوات تجميع ASIC مثل هذا البيان. والسبب وراء هذا الامر يعود إلى أن الحالة الأولية لـ FPGA هي شيء يتم تنزيله في جداول ذاكرة FPGA. ASIC وهو تطبيق فعلي للأجهزة.