Mạch decoder là mạch tổ hợp, được sử dụng rất phổ biến trong thiết kế IC. Mục đích của mạch này là xác định dữ liệu tại ngõ ra, dựa trên địa chỉ, dữ liệu tại ngõ vào và các tín hiệu điều khiển khác. Mạch decoder có thể được tìm thấy hầu hết các chuẩn bus, dùng để đọc dữ liệu từ thanh ghi.
Ví dụ về cách viết decoder, dựa trên dữ liệu ngõ vào và địa chỉ như sau:
Cách viết 1: Sử dụng assign statement.
module dec_assign_ex (addr,data_out);
input [2:0] addr;
output [7:0] data_out;
wire [7:0] data_out;
assign data_out = (addr == 3’b000 ) ? 8’b0000_0001 :
(addr == 3’b001 ) ? 8’b0000_0010 :
(addr == 3’b010 ) ? 8’b0000_0100 :
(addr == 3’b011 ) ? 8’b0000_1000 :
(addr == 3’b100 ) ? 8’b0001_0000 :
(addr == 3’b101 ) ? 8’b0010_0000 :
(addr == 3’b110 ) ? 8’b0100_0000 :
(addr == 3’b111 ) ? 8’b1000_0000 : 8’h00;
endmodule
Cách viết 2: sử dụng always statement
module dec_always_ex (addr,data_out);
input [2:0] addr;
output [7:0] data_out;
reg [7:0] data_out;
always @ (addr)
begin
data_out = 8’h00;
case (addr)
3’b001 : data_out = 8’b0000_0001;
3’b010 : data_out = 8’b0000_0010;
3’b011 : data_out = 8’b0000_0100;
3’b100 : data_out = 8’b0000_1000;
3’b101 : data_out = 8’b0001_0000;
3’b110 : data_out = 8’b0100_0000;
3’b111 : data_out = 8’b1000_0000;
endcase
end
endmodule