Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Verilog

Memahami Pernyataan Case Verilog: Implementasi Multiplexer yang Efisien

Pernyataan case memeriksa apakah ekspresi yang diberikan cocok dengan salah satu ekspresi lain dalam daftar dan cabang sesuai. Biasanya digunakan untuk mengimplementasikan multiplexer. Konstruksi if-else mungkin tidak cocok jika ada banyak kondisi yang harus diperiksa dan akan sintetis menjadi encoder prioritas daripada multiplexer.

Sintaks

Pernyataan case Verilog dimulai dengan kata kunci case dan diakhiri dengan kata kunci endcase. Ekspresi dalam tanda kurung akan dievaluasi tepat sekali dan dibandingkan dengan daftar alternatif dalam urutan yang ditulis dan pernyataan untuk alternatif yang cocok dengan ekspresi yang diberikan akan dieksekusi. Blok beberapa pernyataan harus dikelompokkan dan berada dalam begin dan end.

// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
  case_item1 : <single statement>
  case_item2, case_item3 : <single statement>
  case_item4 : begin <multiple statements> end
  default : <statement>
endcase

Jika tidak ada item case yang cocok dengan ekspresi yang diberikan, pernyataan dalam item default akan dieksekusi. Pernyataan default bersifat opsional, dan hanya boleh ada satu pernyataan default dalam pernyataan case. Pernyataan case dapat bersarang.

Eksekusi akan keluar dari blok case tanpa melakukan apa pun jika tidak ada item yang cocok dengan ekspresi dan pernyataan default tidak diberikan.

Contoh

Modul desain yang ditunjukkan di bawah ini memiliki sinyal seleksi 2-bit untuk merute salah satu dari tiga input 3-bit lainnya ke sinyal output yang disebut out. Pernyataan case digunakan untuk menugaskan input yang benar ke output berdasarkan nilai sel. Karena sel adalah sinyal 2-bit, dapat memiliki 22 kombinasi, 0 hingga 3. Pernyataan default membantu untuk mengatur output menjadi 0 jika sel adalah 3.

module my_mux (
  input [2:0] a, b, c, // Three 3-bit inputs
  input [1:0] sel,     // 2-bit select signal to choose from a, b, c
  output reg [2:0] out // Output 3-bit signal
);
  // This always block is executed whenever a, b, c or sel changes in value
  always @ (a, b, c, sel) begin
    case(sel)
      2'b00 : out = a; // If sel=0, output is a
      2'b01 : out = b; // If sel=1, output is b
      2'b10 : out = c; // If sel=2, output is c
      default : out = 0; // If sel is anything else, out is always 0
    endcase
  end
endmodule

Skema Hardware

Kode rtl diedarkan untuk mendapatkan skema hardware yang mewakili multiplexer 4 ke 1.

Lihat bahwa output adalah nol ketika sel adalah 3 dan sesuai dengan input yang ditetapkan untuk nilai lain.

Log Simulasi

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0
[10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5
[20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5
[30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1
[40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

Dalam pernyataan case, perbandingan hanya berhasil ketika setiap bit dari ekspresi cocok dengan salah satu alternatif termasuk 0, 1, x dan z. Dalam contoh yang ditunjukkan di atas, jika salah satu bit dalam sel adalah x atau z, pernyataan default akan dieksekusi karena tidak ada alternatif lain yang cocok. Dalam hal ini, output akan semua nol.

Log Simulasi

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0
ncsim: *W,RNQUIE: Simulation is complete.

Jika pernyataan case dalam desain memiliki x dan z dalam alternatif item case, hasilnya akan cukup berbeda.

module my_mux (
  input [2:0] a, b, c,
  input [1:0] sel,
  output reg [2:0] out
);
  // Case items have x and z and sel has to match the exact value for
  // output to be assigned with the corresponding input
  always @ (a, b, c, sel) begin
    case(sel)
      2'bxz : out = a;
      2'bzx : out = b;
      2'bxx : out = c;
      default : out = 0;
    endcase
  end
endmodule

Log Simulasi

ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5
ncsim: *W,RNQUIE: Simulation is complete.

Bagaimana perbedaan case dengan if-else ?

Pernyataan case berbeda dari if-else-if dalam dua hal:

Verilog

  1. Menguasai Pernyataan Switch C#: Sintaks, Contoh, dan Praktik Terbaik
  2. Pernyataan Break C#: Kapan dan Cara Menggunakannya
  3. Menguasai Pernyataan Continue C#: Cara Melewati Iterasi Perulangan Secara Efektif
  4. Menguasai Switch-Case C++: Sintaks, Penggunaan, dan Contoh Praktis
  5. Menguasai Verilog: Tutorial Lengkap untuk Desain Sirkuit Digital
  6. Menguasai Konkatenasi Verilog: Panduan Praktis
  7. Memahami Penugasan Verilog: Jenis, Sintaks, dan Praktik Terbaik
  8. Perbedaan Kunci Penugasan Blokir dan Non-Blokir Verilog
  9. Menguasai Fungsi Verilog untuk Desain RTL yang Efisien
  10. Memahami Tugas Verilog: Fungsi vs Tugas, Sintaks, dan Penggunaan