이번에 다룰 논리회로는 Decoder 입니다.
Decoder는 N개의 입력을 해독하여 2^N개의 출력으로 내보내는 역할을 합니다.
2 to 4 Decoder의 진리표부터 보겠습니다.
INPUT | OUTPUT | ||||
A0 | A1 | D0 | D1 | D2 | D3 |
0 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 0 | 1 |
D0 = A0'A1'
D1 = A0'A1
D2 = A0A1'
D3 = A0A1
위 결과를 게이트로 나타내면 다음과 같습니다.
Decoder를 반대로 만들면 Encoder입니다.
Encoder는 2^N개의 신호를 N개로 만들어주는 역할을 합니다.
Verilog Code
Decoder를 Verilog로 설계하였습니다.
이번에는 이전과는 조금 다르게 clock을 이용하여 Synchronous하게 설계해보았습니다.
DUT
`timescale 1ns / 1ps
module decoder_2to4(
i_clk,
i_a,
o_d
);
input i_clk;
input [1:0] i_a;
output reg [3:0] o_d;
always @ (posedge i_clk) begin
case (i_a)
2'b00: o_d = 4'b1000;
2'b01: o_d = 4'b0100;
2'b10: o_d = 4'b0010;
2'b11: o_d = 4'b0001;
default: o_d = 4'b0000;
endcase
end
endmodule
Testbench
`timescale 1ns / 1ps
module tb_decoder_2to4();
reg i_clk;
reg [1:0] i_a;
wire [3:0] o_d;
decoder_2to4 dec ( .i_clk (i_clk) ,
.i_a (i_a) ,
.o_d (o_d) );
always #5 i_clk = ~i_clk;
initial begin
i_clk = 1'b0;
i_a = 2'b00; #10
i_a = 2'b01; #10
i_a = 2'b10; #10
i_a = 2'b11; #10
$finish;
end
endmodule
Simulation
Waveform을 보면 5ns까지 o_d의 값이 정의되어 있지 않습니다.
이유는 always 블럭이 clock의 rising edge에서 동작하도록 설계하였기 때문입니다.
'Digital Design > 논리회로' 카테고리의 다른 글
[논리회로] Combinational Circuit, Sequential Circuit (1) | 2023.01.02 |
---|---|
[논리회로] Multiplexer (Design with Verilog) (1) | 2023.01.02 |
[논리회로] Full Subtractor (Design with Verilog) (1) | 2023.01.02 |
[논리회로] Half Subtractor (Design with Verilog) (1) | 2022.12.30 |
[논리회로] Full Adder (Design with Verilog) (1) | 2022.12.29 |
댓글