אופרטורי צמצום
חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 25 מתוך 90.
אופרטורי צמצום פועלים על כל הביטים של וקטור יחיד ומצמצמים אותם לתוצאה של ביט יחיד. בניגוד לאופרטורים ביטיים שמשווים בין שני מספרים ביט אחר ביט, אופרטורי צמצום מקבלים מספר אחד ומבצעים פעולה על כל הביטים שלו כדי להפיק תוצאה יחידה.
| אופרטור | פעולה | תוצאה |
|---|---|---|
& | AND מצמצם | 1 אם כל הביטים הם 1 |
| | OR מצמצם | 1 אם לפחות ביט אחד הוא 1 |
^ | XOR מצמצם | 1 אם מספר אי-זוגי של ביטים הם 1 |
~& | NAND מצמצם | 0 אם כל הביטים הם 1 |
~| | NOR מצמצם | 0 אם לפחות ביט אחד הוא 1 |
~^ | XNOR מצמצם | 1 אם מספר זוגי של ביטים הם 1 |
איך הם פועלים
AND מצמצם (&):
&4'b1111 = 1 // all bits are 1
&4'b1011 = 0 // לא כל הביטים הם 1
&4'b0000 = 0 // all bits are 0OR מצמצם (|):
|4'b0000 = 0 // no bits are 1
|4'b0100 = 1 // לפחות ביט אחד הוא 1
|4'b1111 = 1 // all bits are 1XOR מצמצם (^):
^4'b1010 = 0 // two 1's (even) → 0
^4'b1000 = 1 // one 1 (odd) → 1
^4'b1111 = 0 // ארבע ספרות 1 (זוגי) → 0דוגמת קוד
module reduction_demo;
reg [3:0] a, b, c;
reg and_red, or_red, xor_red;
initial begin
a = 4'b1111;
b = 4'b1010;
c = 4'b1000;
and_red = &a; // 1111 → 1
or_red = |b; // 1010 → 1
xor_red = ^c; // 1000 → 1
$display("&4'b1111 = %d", and_red);
$display("|4'b1010 = %d", or_red);
$display("^4'b1000 = %d", xor_red);
$finish;
end
endmoduleפלט:
&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1שימושים נפוצים
בדיקה אם כל הביטים הם 1:
all_ones = &data; // 1 אם data == 8'b11111111בדיקה אם אחד הביטים הוא 1:
any_one = |data; // 1 אם data != 0בדיקת זוגיות (מספר אי־זוגי של 1's):
odd_parity = ^data; // 1 אם מספר הספרות 1 הוא אי־זוגיבדקו אם כל הביטים הם 0:
all_zeros = ~|data; // 1 אם data == 0אתגר
כתוב את ביטויי הצמצום הנכונים עבור כל משימה.
מה לעשות:
- בדוק אם כל הביטים של
aהם 1 ושמור ב-all_ones - בדוק אם אחד מהביטים של
bהוא 1 ושמור ב-any_one - בדוק אם ל-
cיש מספר אי-זוגי של 1 ושמור ב-odd_parity
נסו בעצמכם
module reduction_challenge;
reg [3:0] a, b, c;
reg all_ones, any_one, odd_parity;
initial begin
a = 4'b1111;
b = 4'b0100;
c = 4'b1011;
all_ones = ______; // all bits 1?
any_one = ______; // any bit 1?
odd_parity = ______; // odd number of 1's?
$display("&4'b1111 = %d", all_ones);
$display("|4'b0100 = %d", any_one);
$display("^4'b1011 = %d", odd_parity);
$finish;
end
endmoduleהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין