Altifigence Academy

51 / 63 · Konsep

ALU dan flag zero, negative, carry, serta overflow

Berbagi adder ADD/SUB dan pisahkan carry dari overflow signed untuk menurunkan perbandingan.

Prasyarat: komplemen duaKomplemen dua Representasi bilangan bulat bertanda dengan pola bit berlebar tetap. Rentang n bit adalah −2^(n−1) hingga 2^(n−1)−1. Selengkapnya, adder, MUXMultiplekser Rangkaian kombinasional yang menghubungkan satu dari beberapa masukan ke keluaran menurut seleksi. Hubungan bit seleksi dan nomor masukan harus ditetapkan. Selengkapnya kombinasional, dan perluasan lebar bit.

ALU menghasilkan hasil dan status

ALU memilih hasil rangkaian operasi serta menghasilkan bit status untuk menafsirkannya. Masukan A,BA,B dan hasil RR selebar WW bit; operasinya ADD,SUB,AND,OR,XOR. Hasil aritmetika selalu dipotong menjadi WW bit rendah. Karena pola sama dapat dibaca sebagai unsignedUnsigned Interpretasi pola bit sebagai bilangan bulat nonnegatif. Rentang n bit adalah 0 hingga 2^n−1 dan dapat berbeda dari interpretasi signed pola yang sama. Selengkapnya atau komplemen dua, carry dan overflow dikeluarkan terpisah. Tidak perlu dua adder hanya untuk interpretasi tanda berbeda.

Flag-nya Z=(R=0)Z=(R=0) dan N=RW−1N=R_{W-1}. Z adalah reduksi NOR seluruh hasil terpilih, sedangkan N bit tertinggi. N=1 menunjukkan interpretasi signed negatif dari pola tersimpan. Jika overflow, tanda ini dapat berbeda dari hasil tepat dengan presisi tak terbatas.

Pisahkan carry dan overflow

Pada penjumlahan, C adalah bit tertinggi jumlah diperluas TT.

T={0,A}+{0,B},R=T[W−1:0],C=T[W]T=\{0,A\}+\{0,B\},\qquad R=T[W-1:0],\quad C=T[W]

V=1 jika kedua masukan bertanda sama tetapi hasil bertanda berbeda. Dengan a,b,ra,b,r sebagai bit tertingginya:

Vadd=¬(a⊕b)∧(a⊕r)V_{\mathrm{add}}=\neg(a\oplus b)\land(a\oplus r)

Pada delapan bit, 255+1255+1 memberi R=0,C=1,V=0: dalam signed, −1+1=0-1+1=0 masih terwakili. Sebaliknya, 127+1127+1 memberi R=0x80,C=0,V=1: 128 muat dalam unsigned tetapi melebihi maksimum signed 127. Menyatukan C dan V menghilangkan perbedaan ini.

Pada pengurangan, balikNegasi Operasi NOT menukar 0 dan 1. Garis di atas ekspresi menerapkan NOT pada seluruh ekspresi yang dicakupnya. Selengkapnya hanya W bit B lalu perluas dengan nol: T={0,A}+{0,¬B}+1T=\{0,A\}+\{0,\neg B\}+1. Membalik seluruh W+1 bit mengubah makna carry tinggi. Di sini C=1 berarti tanpa borrow; jadi perbandingan unsigned A<BA<B adalah ¬C\neg C.

Vsub=(a⊕b)∧(a⊕r)V_{\mathrm{sub}}=(a\oplus b)\land(a\oplus r)

Overflow signed hanya mungkin jika tanda operand pengurangan berbeda. Perbandingan dapat memakai flag SUB tanpa menyimpan R. Untuk signed, A<BA<B adalah N⊕VN\oplus V dan A≤BA\le B adalah Z∨(N⊕V)Z\lor(N\oplus V). Misalnya −128−1-128-1 tersimpan sebagai +127, tetapi V=1 memperbaiki kesalahan jika hanya N dibaca.

Contoh ADD delapan bit berikut muat dalam unsigned tetapi melampaui signed. C=0 dan V=1 dapat terjadi bersamaan.

Bedakan C dan V pada 127 + 1
  1. A=7F · B=01: Bertanda: 127 + 1
  2. Jumlah T 9 bit: 0_10000000
  3. Hasil R 8 bit: 80 → bertanda −128
  4. Flag status: Z=0 · N=1 · C=0 · V=1

Adder bersama dan aturan keluaran eksplisit

RTL mengasumsikan W≥2. Opcode 0–4 adalah ADD,SUB,AND,OR,XOR. Operasi logika menetapkan C=V=0. Opcode tidak terpakai menghasilkan R=0,Z=1 dan flag lain 0. Ini kontrak ALU ini, bukan tiruan ISA tertentu.

SystemVerilog
module alu #(parameter int W = 8) (
  input  logic [W-1:0] a, b,
  input  logic [2:0] op,
  output logic [W-1:0] y,
  output logic z, n, c, v
);
  logic sub;
  logic [W-1:0] bx;
  logic [W:0] sum;
  always_comb begin
    sub = (op == 3'd1);
    bx = b ^ {W{sub}};
    sum = {1'b0, a} + {1'b0, bx}
        + {{W{1'b0}}, sub};
    y = '0;
    c = 1'b0;
    v = 1'b0;
    case (op)
      3'd0, 3'd1: begin
        y = sum[W-1:0];
        c = sum[W];
        if (sub)
          v = (a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
        else
          v = ~(a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
      end
      3'd2: y = a & b;
      3'd3: y = a | b;
      3'd4: y = a ^ b;
      default: y = '0;
    endcase
    z = ~(|y);
    n = y[W-1];
  end
endmodule

Pembalikan B bersyarat dan carry awal berbagi struktur adder untuk ADD/SUB. Menghitung y sebelum Z,N di setiap cabang memberi status konsisten termasuk operasi logika. Nilai bawaan mendefinisikan semua jalur dan mencegah latchLatch Elemen penyimpan yang mengikuti masukan ketika kontrol aktif dan mempertahankan nilai saat tidak aktif. Berbeda dari flip-flop yang hanya menangkap pada tepi. Selengkapnya. Tanpa registerRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya, tidak ada latensi siklus, tetapi tundaan fisik tetap ada. Seleksi operasi dan deteksi nol juga harus mencapai register berikutnya sebelum batas setup.

Uji pasangan yang memuat 0, maksimum unsigned, minimum/maksimum signed, dan tetangganya. Bandingkan R dengan acuan modulo 2W2^W, C dengan jumlah unsigned diperluas, dan V dengan pelampauan rentang signed. R benar masih dapat disertai flag salah.

Contoh nyata pemisahan tanda, nol, carry unsigned, dan overflow signed terdapat pada penjelasan flag Arm.

Coba sendiri

Pada delapan bit, hitung R,Z,N,C,V untuk (1) 0x7F+0x01, (2) 0xFF+0x01, (3) 0x00−0x01, (4) 0x80−0x01. Mengapa N saja salah membandingkan operand signed kasus 4?

Baca penjelasan

Urutan (R,Z,N,C,V): (1) (0x80,0,1,0,1), (2) (0x00,1,0,1,0), (3) (0xFF,0,1,0,0), (4) (0x7F,0,0,1,1). Kasus 3 memerlukan borrow unsigned sehingga C=0, tetapi signed −1 terwakili. Kasus 4 adalah 128−1=127 tanpa borrow sehingga C=1. Dalam signed, −128−1=−129 melampaui rentang sehingga V=1; N=0 hasil tersimpan tidak mencerminkan tanda sebenarnya. N xor V=1 memberi A<B benar.

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.