Menu
Coddy logo textTech

אופרטורי צמצום

חלק מהיחידה יסודות במסלול ה-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 0

OR מצמצם (<strong>|</strong>):

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // לפחות ביט אחד הוא 1
|4'b1111 = 1   // all bits are 1

‏XOR מצמצם (<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
challenge icon

אתגר

כתוב את ביטויי הצמצום הנכונים עבור כל משימה.

מה לעשות:

  1. בדוק אם כל הביטים של a הם 1 ושמור את התוצאה ב־all_ones
  2. בדוק אם אחד מהביטים של b הוא 1 ושמור את התוצאה ב־any_one
  3. בדוק אם ב־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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: קומפיילר Verilog אונליין