معامل الدمج
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 27 من 90.
يقوم عامل التسلسل { } بدمج إشارات أو ثوابت أو تعبيرات متعددة في متجه واحد أكبر. ويُستخدم كلما احتجت إلى دمج البتات معاً لتكوين قيم أوسع.
ما هي القيم التي تدعم عملية الدمج (Concatenation)
يمكنك دمج:
- Wires و regs — أي إشارة
- الثوابت — أرقام مثل
4'b1010أو8'hFF
- التعبيرات — نتائج العمليات مثل
a + b - التكرارات — تكرار قيمة عدة مرات
يجب أن يكون لجميع القيم المتسلسلة عروض ثابتة ومعروفة.
الصيغة الأساسية: {value1, value2, value3, ...} عرض النتيجة هو مجموع كل العروض الفردية.
أمثلة
دمج قيمتين بحجم 4 بت في 8 بت:
reg [3:0] high, low;
reg [7:0] word;
word = {high, low}; // تصبح high هي الـ 4 بتات العليا، و low هي الـ 4 بتات السفلىالدمج مع الثوابت:
data = {4'b1010, 4'b0000}; // 8'b10100000دمج أكثر من اثنين:
full = {a, b, c, d}; // جميع العروض تُجمعالتكرار
يمكنك تكرار قيمة عدة مرات باستخدام {n{value}}:
repeat = {4{4'b1010}}; // 16'b1010101010101010 (تكرار 4 مرات)هذا مفيد لتوسيع الإشارة (sign extension):
signed_8bit = {4{sign_bit}, value_4bit};مثال على الكود
module concatenation_demo;
reg [3:0] upper, lower;
reg [7:0] combined;
reg [11:0] repeated;
initial begin
upper = 4'b1010;
lower = 4'b1100;
combined = {upper, lower}; // 10101100
repeated = {3{4'b1010}}; // 101010101010
$display("{upper, lower} = %b", combined);
$display("{3{4'b1010}} = %b", repeated);
$finish;
end
endmoduleالمخرجات:
{upper, lower} = 10101100
{3{4'b1010}} = 101010101010ملاحظات هامة
- الترتيب مهم:
{a, b}يختلف عن{b, a} - يجب أن يكون لجميع الأجزاء عروض ثابتة (لا توجد أرقام غير محددة الحجم)
- يمكن استخدام التسلسل على كلا الجانبين الأيسر والأيمن من عمليات التعيين
التحدي
اكتب تعبيرات الدمج (concatenation) الصحيحة لكل مهمة.
ما يجب القيام به:
- قم بدمج
aوbفي نتيجة بحجم 8 بت وقم بتخزينها فيcombine1 - قم بدمج
cوdوeفي نتيجة بحجم 12 بت وقم بتخزينها فيcombine2 - قم بدمج
fونسختين منgفي نتيجة بحجم 12 بت وقم بتخزينها فيcombine3
ورقة مرجعية
يقوم عامل الدمج { } بجمع البتات معاً في متجه أوسع. عرض النتيجة = مجموع كل العروض الفردية.
// أساسي: {value1, value2, ...}
reg [3:0] high, low;
reg [7:0] word;
word = {high, low}; // high = البتات العليا، low = البتات السفلى
// مع الثوابت
data = {4'b1010, 4'b0000}; // 8'b10100000
التكرار {n{value}} يكرر قيمة n من المرات:
repeated = {3{4'b1010}}; // 12'b101010101010
signed_8bit = {4{sign_bit}, val_4b}; // تمديد الإشارة (sign extension)
القواعد الأساسية:
- الترتيب مهم:
{a, b}≠{b, a} - يجب أن يكون لجميع الأجزاء عروض ثابتة ومعروفة
- يمكن استخدامه على كلا جانبي عمليات التعيين (assignments)
جرّب بنفسك
module concatenation_challenge;
reg [3:0] a, b;
reg [3:0] c, d, e;
reg [3:0] f, g;
reg [7:0] combine1;
reg [11:0] combine2, combine3;
initial begin
a = 4'b1010;
b = 4'b0101;
c = 4'b1111;
d = 4'b0000;
e = 4'b1100;
f = 4'b1001;
g = 4'b0110;
combine1 = ______; // Combine a and b into an 8-bit result
combine2 = ______; // Combine c, d, and e into a 12-bit result
combine3 = ______; // Combine f and two copies of g into a 12-bit result
$display("{a, b} = %b", combine1);
$display("{c, d, e} = %b", combine2);
$display("{f, g, g} = %b", combine3);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة