52 / 63 · Konsep
Barrel shifter dan tahap MUX
Implementasikan geser variabel melalui tahap MUX 1,2,4,8, berbagi arah, serta tangani tanda dan jumlah geser berlebih.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Prasyarat: MUXMultiplekser Rangkaian kombinasional yang menghubungkan satu dari beberapa masukan ke keluaran menurut seleksi. Hubungan bit seleksi dan nomor masukan harus ditetapkan. Selengkapnya, geser logis/aritmetika, dan tundaan kombinasionalTundaan propagasi Waktu sejak masukan berubah hingga keluaran stabil pada nilai benar. Kesetaraan logika berbeda dari karakteristik waktu. Selengkapnya.
Mengubah geser variabel menjadi pilihan pengawatan tetap
RegisterRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya yang bergeser satu bit memakai clock sebanyak jumlah perpindahan. Barrel shifter menerima jumlah geser dan menghasilkan hasil melalui satu jalur kombinasional. Bit tidak bergerak berulang sepanjang waktu; jalur sambungan dipilih untuk menghubungkan tiap keluaran ke bit masukan yang diperlukan.
Untuk 16 bit dan geser 0–15, . Susun empat tahap seri dengan geser 1,2,4,8. Setiap MUX memilih antara lewat langsung dan geser tetap.
11=1011 memilih tahap 1,2,8 dan melewati tahap 4. Untuk digeser logis ke kanan, nilai berturut-turut 0x6952,0x1A54,0x1A54,0x001A. Ini empat tahap kombinasional, bukan empat clock.
Empat kelompok berisi 16 MUX memberikan 64 pilihan 2:1 satu bit sebelum optimisasi pengawatan dan konstanta. Secara umum, untuk , struktur seleksi sebanding dan kedalaman . MUX W:1 terpisah pun dapat disintesis menjadi pohon; jumlah baris RTL tidak menentukan luas atau frekuensi.
Gambar memerinci empat tahap yang dikendalikan 1011 untuk menggeser 0xD2A5 ke kanan sebelas posisi. Ini bukan eksekusi empat siklus.
- Tahap 1 bit · s0=1: D2A5 → 6952
- Tahap 2 bit · s1=1: 6952 → 1A54
- Tahap 4 bit · s2=0: 1A54 diteruskan tanpa perubahan
- Tahap 8 bit · s3=1: 1A54 → 001A
Memakai geser kanan untuk geser kiri
Balik urutan bit, geser logis kanan s posisi, lalu balik lagi: hasilnya geser kiri. Empat tahap dapat dipakai bersama, tetapi MUX arah pada masukan dan keluaran menambah biaya di atas 64. Pembalikan urutan bit tetap hanyalah pengawatan.
Geser kanan aritmetika mengisi posisi tinggi dengan bit tanda masukan asli. Geser kiri tetap mengisi nol walaupun mode aritmetika aktif. Dalam 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, geser kiri aritmetika dan logis memindahkan bit sama serta tidak otomatis memeriksa overflow signed.
Rentang jumlah geser adalah bagian kontrak. shamt lima bit menerima 0–31. Untuk ≥16, hasil logis dan geser kiri nol; geser kanan aritmetika menghasilkan 16 salinan tanda. Memakai hanya empat bit rendah menganggap geser 16 sebagai geser 0.
module barrel16 (
input wire [15:0] x,
input wire [4:0] shamt,
input wire left,
input wire arithmetic,
output wire [15:0] y
);
wire fill;
wire [15:0] stage [0:4];
assign fill = (!left) && arithmetic && x[15];
for (genvar i = 0; i < 16; i++) begin : direction
assign stage[0][i] = left ? x[15-i] : x[i];
assign y[i] = shamt[4] ? fill :
(left ? stage[4][15-i] : stage[4][i]);
end
for (genvar k = 0; k < 4; k++) begin : shift_stage
localparam int D = 1 << k;
assign stage[k+1] = shamt[k]
? {{D{fill}}, stage[k][15:D]}
: stage[k];
end
endmodulek pada generate adalah konstanta elaborasi, bukan loop yang dijalankan empat kali saat runtime. Panjang part-select dan pengulangan tetap, membentuk empat pengawatan tetap serta MUX. fill sama di setiap tahap sehingga tanda tetap konsisten saat beberapa tahap dipilih.
RTL menuliskan pengisian tanda secara eksplisit sehingga aritmetika bekerja pada vektor 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 juga. Jika memakai operator, diperlukan >>> dan operand signed. Simbol saja atau deklarasi signed variabel sebelum part-select tidak cukup: konkatenasi dan slice dapat kehilangan interpretasi signed. Konversikan dahulu ke nilai signed dengan lebar yang diinginkan. Dukungan operator dijelaskan dalam dokumentasi ekspresi Verilog AMD.
Pisahkan tundaan dan kehilangan informasi
Empat tahap ditambah seleksi arah/rentang serta tundaan kabel. Jika timing memerlukan register perantara, tundakan juga jumlah geser tersisa dan arah selama jumlah siklus sama. LatensiLatensi Waktu atau jumlah siklus antara penerimaan masukan dan keluaran terkait. Berbeda dari throughput, jumlah yang diproses per satuan waktu. Selengkapnya serta antarmuka lalu berbeda dari modul kombinasional murni.
Pergeseran tidak memulihkan bit terbuang. Pada geser kiri unsigned, bit tinggi terbuang bernilai 1 menunjukkan overflow; signed memerlukan pemeriksaan tanda awal dan bit terbuang. Modul ini tidak menghasilkan flag tersebut. Geser kanan aritmetika membulatkan ke bawah: −3 digeser satu bit menjadi −2, berbeda dari −1 pada pembagian bulat menuju nol.
Coba sendiri
Untuk x=0x8123 16 bit, hitung (1) kanan logis 3, (2) kanan aritmetika 3, (3) kiri logis 16, (4) kanan aritmetika 20. Sebutkan tahap kasus 2 dan kesalahan kasus 3 jika shamt[4] diabaikan.
Baca penjelasan
(1) 0x1024, (2) 0xF024, (3) 0x0000, (4) 0xFFFF. Karena 3=1+2, tahap 1 dan 2 dipilih. Pada aritmetika, 0xC091→0xF024 dengan pengisian tanda awal 1. Untuk 16, shamt=10000: mengabaikan bit tinggi melewati semua tahap dan menghasilkan 0x8123 tanpa perubahan. Jadi ≥16 harus dideteksi. Pada geser kiri, bit rendah baru tetap 0 meskipun mode aritmetika aktif.