Non Blocking Assignment
جزء من قسم الأساسيات في رحلة 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logicتدرّب بنفسك: مترجم Verilog عبر الإنترنت