إسناد غير حاجز
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 50 من 90.
في الدرس السابق، تناولنا إسناد blocking (=)، الذي يُنفَّذ خطوةً بخطوة. والآن سنتناول إسناد non-blocking (<=)، الذي يُنفَّذ كلّه دفعةً واحدة، بالتوازي.
يستخدم الإسناد non-blocking العامل <=. ويُسمّى "non-blocking" لأنه لا يحظر تنفيذ العبارة التالية. تُنفَّذ جميع إسنادات non-blocking في الكتلة في الوقت نفسه.
البنية النحوية:
variable <= expression;متى تستخدم الإسناد non-blocking
يُستخدم الإسناد non-blocking (<=) في المنطق التسلسلي: الدوائر التي تستخدم clock وتحتوي على ذاكرة. لا تتغير المخرجات إلا عند edge من clock (عادةً عند الحافة الصاعدة).
أمثلة على المنطق التسلسلي:
- القلابات
- السجلات
- العدادات
- آلات الحالات
- مسجلات الإزاحة
مثال على Verilog:
initial begin
a <= 5; // مجدول، لكن لم يُنفَّذ بعد
b <= a + 2; // مجدول، يستخدم القيمة القديمة لـ a
c <= b * 3; // مجدول، يستخدم القيمة القديمة لـ b
endتحدث عمليات الإسناد الثلاثة في الوقت نفسه باستخدام القيم old. وفي نهاية خطوة الزمن، تحدث جميع التحديثات معًا.
عدم الحجب في كتل Always (المنطق التتابعي)
يُستخدم عدم الحجب للمنطق التتابعي: الدوائر التي تستخدم clock ولها ذاكرة (المقلّبات، والسجلات، والعدادات).
always @(posedge clk) begin
q <= d; // q يحصل على d عند حافة الساعة
count <= count + 1; // count يتزايد عند حافة الساعة
endتحدث عمليتا الإسناد في الوقت نفسه، باستخدام values من قبل حافة clock.
الملخّص
| القاعدة | الشرح |
|---|---|
استخدم <= للمنطق التتابعي | always @(posedge clk) |
استخدم = للمنطق التوافقي | always @(*) |
| Non-blocking يُنفَّذ بالتوازي | All التعيينات تحدث في الوقت نفسه |
| Values تتحدّث في end الخطوة الزمنية | ليس فورًا |
التحدي
إكمال إسناد non-blocking
Add عمليات الإسناد non-blocking المفقودة لجعل مسجل الإزاحة ذي البتّين يعمل.
كيفية عمله:
- عند كل clock edge،
q1getsd q2gets القيمة old لـq1
ما يجب فعله:
- Assign
dإلىq1(non-blocking) - Assign
q1إلىq2(non-blocking)
جرّب بنفسك
module shift_register (
input clk,
input reset,
input d,
output reg q1,
output reg q2
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q1 <= 0;
q2 <= 0;
end else begin
// TODO: أضف منطق الإزاحة
// الخطوة 1: عيّن d إلى q1 (غير حاجز)
// الخطوة 2: عيّن q1 إلى q2 (غير حاجز)
end
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت