אופרטורי צמצום
חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 25 מתוך 90.
אופרטורי צמצום פועלים על כל הסיביות של וקטור יחיד ומצמצמים אותן לתוצאה של סיבית אחת. בניגוד לאופרטורים סיביים שמשווים בין שני מספרים סיבית אחר סיבית, אופרטורי צמצום מקבלים מספר אחד ומבצעים פעולה על כל הסיביות שלו כדי להפיק תוצאה יחידה.
| אופרטור | פעולה | תוצאה |
|---|---|---|
& | AND מצמצם | 1 אם כל הביטים הם 1 |
| | OR מצמצם | 1 אם לפחות ביט אחד הוא 1 |
^ | XOR מצמצם | 1 אם מספר אי-זוגי של ביטים הוא 1 |
~& | NAND מצמצם | 0 אם כל הביטים הם 1 |
~| | NOR מצמצם | 0 אם לפחות ביט אחד הוא 1 |
~^ | XNOR מצמצם | 1 אם מספר זוגי של ביטים הוא 1 |
איך הם פועלים
AND מצמצם (<strong>&</strong>):
&4'b1111 = 1 // all bits are 1
&4'b1011 = 0 // לא כל הביטים הם 1
&4'b0000 = 0 // all bits are 0OR מצמצם (<strong>|</strong>):
|4'b0000 = 0 // no bits are 1
|4'b0100 = 1 // לפחות ביט אחד הוא 1
|4'b1111 = 1 // all bits are 1XOR מצמצם (<strong>^</strong>):
^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-ים):
odd_parity = ^data; // 1 אם מספר ה-1-ים אי-זוגיבדקו אם כל הביטים הם 0:
all_zeros = ~|data; // 1 אם data == 0אתגר
כתוב את ביטויי הצמצום הנכונים עבור כל משימה.
מה לעשות:
- בדוק אם כל הביטים של
aהם 1 ושמור את התוצאה ב־all_ones - בדוק אם אחד מהביטים של
bהוא 1 ושמור את התוצאה ב־any_one - בדוק אם ב־
cיש מספר אי־זוגי של 1's ושמור את התוצאה ב־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 אונליין