Menu
flag Ar iconالعربيةdown icon

Concatenation وReplication في Verilog: العوامل {}

كيف تلصق إشارات معًا بـ {} وكيف تنسخ نمطًا N مرة بـ {N{...}} - عوامل Verilog التي لا غنى عنها لبناء buses أوسع من قطع.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

عاملان صغيران يستحقان وجودهما

Verilog له شكلا {}:

  1. Concatenation - {a, b, c} - يلصق إشارات متعددة في واحدة أوسع.
  2. Replication - {N{pattern}} - ينسخ نمطًا N مرة.

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

Concatenation: {a, b, c}

أبسط حالة: تكديس إشارتين في واحدة:

قراءة من اليسار لليمين: a هو النصف العالي، b هو النصف الأدنى. أول معامل داخل {} هو الأكثر أهمية. عرض النتيجة هو مجموع عروض المعاملات.

يمكنك ربط أي عدد من المعاملات:

wire [31:0] word = {byte3, byte2, byte1, byte0};

ويمكن أن تكون المعاملات بعروض مختلفة:

wire [11:0] frame = {start_bit, data_byte, parity, stop_bit};
//                    1 bit      8 bits     1 bit   2 bits  = 12

قاعدة شائعة: كل معاملات concatenation يجب أن يكون لها عرض صريح. الثوابت غير محددة الحجم (1 بدلًا من 1'b1) تُسبّب أخطاء لأن المُحلّل لا يعرف كم بت يخصص. اكتب دائمًا 1'b0 أو 1'b1 أو 4'd0، لا 0 أو 1 المجردين داخل {}.

Concatenation على الطرف الأيسر

concatenation على LHS لإسناد تقسّم إشارة واسعة إلى أجزائها:

هذا النمط المعتاد لجامع-مع-carry. {carry_out, sum_bits} هو هدف واحد 9 بت على يسار الإسناد، وتُوزَّع البتات: البت العليا إلى carry_out، والـ 8 السفلى إلى sum_bits.

LHS concatenation يعمل في assign وفي الكتل الإجرائية:

always @(posedge clk) begin
    {high_byte, low_byte} <= incoming_word;
end

Replication: {N{pattern}}

عامل replication ينسخ نمطًا عددًا ثابتًا من المرات. الشكل {N{pattern}} - عدد، ثم النمط بين زوج من الأقواس الخاصة به:

N يجب أن يكون ثابتًا - يحتاج المترجم لمعرفة عرض النتيجة عند elaboration. النمط يمكن أن يكون حرفًا أو parameter أو أي تعبير عرضه معروف.

لا تنس الأقواس الداخلية. {8 1'b1} خطأ صياغي؛ {8{1'b1}} صحيح. {} الخارجية هي العامل؛ {...} الداخلية تلفّ النمط المُكرَّر.

دمج الاثنين: التمديد بالإشارة وبالأصفار

العاملان يتركبان طبيعيًا لبناء قيم أوسع:

النمط { {8{a_negative[7]}}, a_negative } هو النمط القياسي لتمديد الإشارة. اقرأه: كرر بت الإشارة ثماني مرات، ثم ألحق البتات الـ 8 الأصلية. صافي النتيجة: تمثيل 16 بت بـ two's-complement لنفس الرقم.

للتوسيع الـ unsigned، يمكنك الاعتماد على الإسناد - Verilog يُمدّد بالأصفار تلقائيًا عندما يكون الهدف أوسع:

wire [15:0] zext_auto = a_unsigned;   // works, top 8 bits are 0

لكن تمديد الإشارة لا يحدث ضمنيًا أبدًا ما لم يكن كل من المعامل والهدف مُعلنين signed. اصطلاح replication الصريح أكثر أمانًا.

أنماط مفيدة

بناء قناع من N واحدات

parameter N = 5;
wire [31:0] mask = { {32-N{1'b0}}, {N{1'b1}} };
// e.g. with N=5, mask = 32'h0000_001F

عكس vector

لا يوجد عكس مدمج في Verilog، لكن يمكنك كتابة واحدة inline مع concatenation:

wire [3:0] forward  = 4'b1010;
wire [3:0] reversed = {forward[0], forward[1], forward[2], forward[3]};
// reversed = 4'b0101

لـ vectors أوسع، حلقة generate أو function أنظف.

حزم الرايات في بايت حالة

wire [7:0] status = {
    error_flag,    // [7]
    overflow,      // [6]
    underflow,     // [5]
    ready,         // [4]
    busy,          // [3]
    1'b0,          // [2] reserved
    1'b0,          // [1] reserved
    valid          // [0]
};

خانات الـ reserved بـ 1 بت لها عروض صريحة - أبدًا 0 مجرد داخل {}.

أخطاء شائعة

ثوابت غير محددة الحجم داخل {}. {a, 0} خطأ صياغي أو صفر 32 بت. حدد العرض دائمًا: {a, 1'b0}.

نسيان الأقواس الداخلية في replication. {8 1'b1} لا يُحلَّل؛ {8{1'b1}} يُحلَّل.

الخلط في الترتيب. {a, b} يضع a على الجانب العالي وb على الأدنى. اعكس افتراضك وستحصل على ترتيب بايت معكوس في مكان ما.

replication صفر مرات. {0{...}} غير شرعي في Verilog القياسي. SystemVerilog يسمح بها (وتُنتج نتيجة بعرض صفر). Verilog العادي سيرفضها.

ماذا بعد

شاهدت الآن كل عامل في Verilog. الفصل التالي يبدّل التروس ويغوص في البنية - كيف تتصل modules ببعضها، وقواعد المنافذ، وصياغة أخذ نسخة من sub-modules لبناء تصاميم أكبر.

الأسئلة الشائعة

كيف تربط إشارات في Verilog؟

استخدم الأقواس المعقوفة: {a, b, c} تُنتج vector واحدًا أوسع بلصق المعاملات من اليسار إلى اليمين. MSB لـ a يصبح MSB للنتيجة؛ LSB لـ c يصبح LSB. عرض النتيجة هو مجموع عروض المعاملات. concatenation تعمل على الطرف الأيمن للإسناد (لبناء قيمة) وعلى الطرف الأيسر (لتقسيم قيمة).

ماذا تعني {N{pattern}} في Verilog؟

إنه عامل replication: يُنتج N نسخة من pattern متسلسلة معًا. {8{1'b1}} هي قيمة 8 بت كلها واحدات (8'hFF). {4{2'b10}} هي قيمة 8 بت 8'b10101010. replication هي كيف تُمدّد بالأصفار، أو تُمدّد بالإشارة، أو تبني أي نمط بتات متكرر دون كتابته يدويًا.

كيف تُمدّد إشارة بالإشارة في Verilog؟

استخدم replication لتكرار بت الإشارة: { {24{a[7]}}, a } يُمدّد a بـ 8 بت إلى 32 بت بتكرار البت 7 (بت الإشارة) 24 مرة ثم إلحاق الأصل. للتمديد بالأصفار لـ unsigned، كرر 1'b0 أو دع الإسناد يفعل ذلك ضمنيًا عندما يكون الهدف أوسع.

هل يمكن استخدام concatenation على الطرف الأيسر للإسناد؟

نعم - هكذا تُسند أهدافًا متعددة من مصدر واسع واحد. {carry, sum} = a + b; يضع نتيجة الجمع في carry (البت العالية) وsum (الباقي) في جملة واحدة. كل هدف يحتفظ بعرضه؛ يوزّع المُحلّل بتات الجانب الأيمن وفقًا لذلك.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن