54 / 63 · Konsep
Pengali unsigned multisiklus shift-add
Bagi akumulasi ke W siklus dan verifikasi penerimaan, selesai, jumlah terakhir, lebar, serta invarian.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Prasyarat: rangkaian sekuensial, penugasan nonblockingNonblocking Penugasan <= pada RTL sekuensial: sisi kanan dievaluasi lalu pembaruan dijadwalkan, sehingga register pada tepi sama menghitung dari keadaan lama. Selengkapnya, pencacah, pergeseran, dan adder.
Menggunakan ulang satu adder selama beberapa siklus
Perkalian 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 W bit adalah jumlah produk parsial yang dipilih setiap bit B.
Menjumlahkan semuanya sekaligus memerlukan banyak logika. Di sini satu adder dipakai W kali: pertukaran luas dengan throughput. Loop RTL tidak otomatis menciptakan rangkaian multisiklus; diperlukan registerRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya keadaan perantara dan kondisi selesai.
Akumulator P serta multiplicand bergeser M memiliki 2W bit; multiplier Q yang bergeser kanan memiliki W bit. Inisialisasi P=0,M=zero-extend(A),Q=B. Tiap clock kerja, tambahkan M ke P jika Q[0]=1, geser M satu bit kiri dan Q satu bit kanan.
Setelah W operasi, Q=0 dan P adalah produk lengkap. 2W bit cukup karena dan jumlah parsial unsigned tidak melebihi produk akhir.
Untuk A=13,B=11,W=4, bit rendah Q berturut-turut 1,1,0,1. P bergerak 0→13→39→39→143; M yang dipakai 13,26,52,104. Pada operasi ketiga, meskipun Q[0]=0, pergeseran dan pencacah harus tetap maju.
Setiap kolom menunjukkan keadaan setelah tangkapan permintaan atau operasi. Kolom pertama inisialisasi, empat berikutnya perhitungan. Pada operasi ketiga, bit rendah Q lama nol: hanya P bertahan, M dan Q bergeser.
Lihat data gelombang
| Sinyal | Gelombang | Nilai bus |
|---|---|---|
| edge | 23452 | tangkap → kerja1 → kerja2 → kerja3 → kerja4 |
| P sesudah | 234.5 | 0 → 13 → 39 → 143 |
| M sesudah | 23452 | 13 → 26 → 52 → 104 → 208 |
| Q sesudah | 23452 | 11 → 5 → 2 → 1 → 0 |
| done sesudah | 0...1 |
Tetapkan waktu penerimaan dan selesai
Permintaan diterima pada tepi naikTepi naik Saat clock berubah 0 ke 1, berbeda dari tingkat yang mencakup seluruh interval CLK=1. Selengkapnya dengan start=1 saat idle. Pada t0, hanya masukan disimpan. W operasi dilakukan t1 hingga tW; product dan done valid setelah tW. Latensinya W periode, dengan W+1 tepi jika tepi mulai disertakan.
start diabaikan selama busy=1, termasuk tepi selesai karena busy sebelum tepi masih 1. Penerimaan berikutnya paling cepat tW+1: interval minimum W+1 periode. Jika start terus 1, operasi dimulai lagi pada tepi idle berikutnya; pemanggil biasanya memberi pulsa sesuai penerimaan.
module mul_iter #(parameter int W = 8) (
input logic clk, rst, start,
input logic [W-1:0] a, b,
output logic busy, done,
output logic [2*W-1:0] product
);
localparam int CW = (W <= 1) ? 1 : $clog2(W);
localparam logic [CW-1:0] LAST = CW'(W-1);
logic [CW-1:0] step;
logic [2*W-1:0] acc, m, next_acc;
logic [W-1:0] q;
assign next_acc = acc + (q[0] ? m : {2*W{1'b0}});
always_ff @(posedge clk) begin
if (rst) begin
busy <= 1'b0;
done <= 1'b0;
product <= '0;
acc <= '0;
m <= '0;
q <= '0;
step <= '0;
end else begin
done <= 1'b0;
if (!busy) begin
if (start) begin
busy <= 1'b1;
acc <= '0;
m <= {{W{1'b0}}, a};
q <= b;
step <= '0;
end
end else begin
acc <= next_acc;
m <= m << 1;
q <= q >> 1;
if (step == LAST) begin
product <= next_acc;
busy <= 1'b0;
done <= 1'b1;
end else begin
step <= step + 1'b1;
end
end
end
end
endmoduleKontraknya W≥1; CW minimal 1 agar W=1 tidak menghasilkan pencacah nol bit. Reset sinkron active-high mengalahkan operasi berjalan. Setelah tangkapan, perubahan a,b luar tidak memengaruhi m,q tersimpan. product hanya berubah saat reset atau selesai. done adalah pulsa satu periode, bukan valid yang ditahan sampai dikonsumsi.
Penugasan akhir adalah product<=next_acc, bukan product<=acc. Sisi kanan nonblocking membaca keadaan lama: acc saja menghilangkan produk parsial terakhir. Demikian pula, menulis pergeseran q lebih dahulu tidak mengubah Q[0] sekarang yang dipakai next_acc.
Invarian perhitungan dan pilihan implementasi
Setelah k operasi:
Pisahkan Q menjadi bagian genap dan bit rendah untuk membuktikan hubungan tetap pada langkah berikutnya. Saat k=W, Q=0 sehingga P=AB. InvarianInvarian Kondisi yang harus selalu benar pada setiap eksekusi yang diizinkan. Misalnya, okupansi FIFO kedalaman 4 selalu berada antara 0 dan 4. Selengkapnya ini menjelaskan urutan akumulasi/pergeseran lebih kuat daripada gelombang contoh kecil saja.
Jalur kritis satu operasi memuat adder 2W bit dan seleksi masukan. Menghilangkan simbol perkalian tidak menjamin lebih kecil atau cepat: bandingkan blok DSP FPGA, sintesis, dan throughputThroughput Jumlah pekerjaan diterima atau selesai per satuan waktu. Pipeline dapat meningkatkannya tanpa mengurangi latensi satu pekerjaan. Selengkapnya yang dibutuhkan. Modul tidak mendukung early-exit, signed, atau backpressure hasil; konsumen tidak boleh melewatkan done.
Uji 0,1,maksimum dan B dengan hanya bit tertinggi 1, juga start serta perubahan masukan selama busy dan pembatalan reset. B dengan satu bit tertinggi sangat berguna mengungkap akumulasi terakhir yang hilang.
Coba sendiri
W=4,A=9,B=10 diterima pada t0. Tentukan acc,q,done setelah t1–t4 dan penerimaan berikutnya paling cepat. Apa keluaran jika akhir ditulis product<=acc?
Baca penjelasan
Awalnya acc=0,m=9,q=1010. t1: bit rendah=0, acc=0,q=0101,done=0. t2: tambah m=18, acc=18,q=0010,done=0. t3: bit rendah=0, acc=18,q=0001,done=0. t4: tambah m=72, acc=90,q=0000,done=1,busy=0,product=90. Sebelum t4 busy=1, sehingga permintaan berikutnya paling cepat t5. product<=acc membaca acc lama=18 dan menghilangkan 72, menghasilkan 18.