التعيين باستخدام العمليات
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 38 من 90.
بمجرد فهمك للتعيين المستمر (continuous assignment)، يمكنك دمجه مع المعاملات (operators) لإنشاء منطق مفيد. يمكن لبيان assign استخدام أي معامل لتشغيل سلك (wire).
الصيغة الأساسية
assign wire_name = expression;يمكن أن يتضمن التعبير ما يلي:
- عوامل التشغيل الحسابية (
+,-,*,/) - عوامل تشغيل البت (
&,|,^,~) - عوامل التشغيل المنطقية (
&&,||,!)
- عوامل المقارنة (
>,<,==,!=) - عوامل الإزاحة (
<<,>>) - العامل الشرطي (
? :)
أمثلة مع معاملات مختلفة
عملية AND على مستوى البت (Bitwise AND):
assign out = a & b;الجمع:
assign sum = a + b;مقارنة:
assign is_greater = (a > b);شرطي (multiplexer):
assign out = sel ? a : b;الإزاحة:
assign shifted = data << 2;الدمج:
assign bus = {high_byte, low_byte};مثال على الكود
module assign_operators (
input [3:0] a, b,
input sel,
output [3:0] and_out,
output [4:0] sum_out,
output is_equal,
output mux_out
);
assign and_out = a & b; // عملية AND على مستوى البتات
assign sum_out = a + b; // عملية الجمع
assign is_equal = (a == b); // عملية المقارنة
assign mux_out = sel ? a : b; // شرطي (مبدل)
endmoduleعوامل تشغيل متعددة في تعيين واحد
يمكنك دمج عوامل التشغيل في تعبير واحد:
assign result = (a & b) | (c ^ d);
assign final = (a + b) > (c - d);
assign parity = ^data; // XOR الاختزالي (عدد فردي من الـ 1)أسبقية العمليات
تتبع لغة Verilog أسبقية العمليات القياسية. استخدم الأقواس ( ) لجعل قصدك واضحاً:
// غير واضح
assign out = a & b | c;
// واضح
assign out = (a & b) | c;التحدي
أضف بيانات assign المفقودة بناءً على المهام.
ما يجب فعله:
- اجعل
and_resultمساوياً لـinput_a AND input_b(على مستوى البتات) - اجعل
or_resultمساوياً لـinput_a OR input_b(على مستوى البتات) - اجعل
xor_resultمساوياً لـinput_a XOR input_b(على مستوى البتات) - اجعل
not_resultمساوياً لـNOT input_a(على مستوى البتات)
ورقة مرجعية
تدعم جملة assign عوامل تشغيل متنوعة للمنطق التوافقي (combinational logic):
assign wire_name = expression;أنواع عوامل التشغيل:
- على مستوى البت (Bitwise):
&،|،^،~ - حسابية (Arithmetic):
+،-،*،/ - منطقية (Logical):
&&،||،! - مقارنة (Comparison):
>،<،==،!= - إزاحة (Shift):
<<،>> - شرطية (Conditional):
? : - دمج (Concatenation):
{ }
assign and_out = a & b; // عملية AND على مستوى البت
assign sum_out = a + b; // جمع
assign is_equal = (a == b); // مقارنة
assign mux_out = sel ? a : b; // ناخب (Multiplexer)
assign bus = {high, low}; // دمج
assign parity = ^data; // عملية XOR اختزاليةاستخدم الأقواس لتوضيح الأسبقية:
assign out = (a & b) | c;جرّب بنفسك
module assign_challenge (
input input_a,
input input_b,
output and_result,
output or_result,
output xor_result,
output not_result
);
// TODO: أضف عبارات التعيين (assign) لكل من:
// and_result = input_a & input_b
// or_result = input_a | input_b
// xor_result = input_a ^ input_b
// not_result = ~input_a
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة