10 / 37 · Konsep
RTL kombinasional dan penugasan lengkap
Nyatakan fungsi sama dengan operator kondisional dan always_comb serta temukan kelalaian yang membentuk latch.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Keluaran kombinasional ditentukan masukan sekarang
Penulisan MUXMultiplekser Rangkaian kombinasional yang menghubungkan satu dari beberapa masukan ke keluaran menurut seleksi. Hubungan bit seleksi dan nomor masukan harus ditetapkan. Selengkapnya paling langsung adalah assign y = sel ? b : a;. Untuk menghitung beberapa keluaran bersama, gunakan always_comb.
always_comb begin
y = a;
if (sel) y = b;
endPenugasan bawaan mendefinisikan jalur sel=0 juga. Jika hanya if (sel) y = b; yang tersisa, sel=0 harus mempertahankan y lama, sehingga bukan fungsi kombinasional murni. Jangan abaikan peringatan alat atau hanya mempercayai kata kunci always_comb.
Menetapkan y=a dahulu lalu memilih b hanya saat sel=1 memiliki fungsi 0/1 sama dengan rangkaian berikut. Keluaran tetap terdefinisi pada sel=0.
y = sel ? b : a
Jangan membaca sintaks prosedural hanya sebagai urutan perangkat lunak
Blok kombinasional umumnya menghitung hasil sementara dengan penugasan blocking =. Jika persamaan berikutnya membaca hasil yang ditugaskan sebelumnya, ketergantungan itu menjadi jalur kombinasional. Bedakan dari penugasan nonblockingNonblocking Penugasan <= pada RTL sekuensial: sisi kanan dievaluasi lalu pembaruan dijadwalkan, sehingga register pada tepi sama menghitung dari keadaan lama. Selengkapnya <= untuk memperbarui registerRegister Rangkaian penyimpan beberapa bit keadaan. Register sinkron mata kuliah ini menangkap masukan yang ditentukan pada tepi clock. Selengkapnya.
always_comb begin
next_y = sel ? b : a;
inverted_y = ~next_y;
endAturan dasar lainnya adalah satu keluaran tidak digerakkan beberapa blok. Saat membagi modul, telusuri satu-satunya penggerak setiap sinyal melalui antarmuka.
Samakan lebar kedua data terlebih dahulu
Jika memilih antara delapan dan dua belas bit, nyatakan lebar y dan perluasan tandanya. Tetapkan rentang sejak desain, bukan kebetulan memeriksa perluasan implisit pada gelombang. Di luar model 0/1, sel=X dapat membuat operator kondisional berbeda dari if biasa; jangan menggeneralisasi hasil dua keadaan menjadi seluruh empat keadaan.
Coba sendiri
Blok always_comb hanya berisi if(en) y=d;. Bagaimana mengubahnya menjadi rangkaian kombinasional yang menghasilkan 0 ketika enable tidak aktif?
Baca penjelasan
Tetapkan y=0 pada awal blok lalu timpa dengan d jika en, atau gunakan ekspresi berlebar jelas setara assign y = en ? d : 0. Menahan nilai lama saat en=0 adalah kontrak register/latch tersendiri, bukan keluaran nol.