반응형
디코더?
2X4 디코더 설계
입력 | 출력 | |||||
en |
DigitSelect[1]
|
DigitSelect[0]
|
digit[3]
|
o_digit[2]
|
o_digit[1]
|
o_digit[0]
|
H | X | X | H | H | H | H |
L | 0 | 0 | 1 | 1 | 1 | 0 |
L | 0 | 1 | 1 | 1 | 0 | 1 |
L | 1 | 0 | 1 | 0 | 1 | 1 |
L | 0 | 0 | 0 | 1 | 1 | 1 |
Design Source
`timescale 1ns / 1ps
// input, output wire 타입이 디폴트
// wire타입은 저장이 안 됨
module FND_Select_Decoder(
input [1:0] i_DigitSelect,
input i_en,
output [3:0] o_digit
);
reg [3:0] r_digit; // reg는 메모리 기능
assign o_digit = r_digit; // 메모리에 저장해 놓고 선에 연결
always @(i_DigitSelect or i_en) begin // 항상 (입력)안을 보고 있다
if (i_en) begin // 1이면 항상 참 -> 동작X
r_digit = 4'b1111; // 4비트 2진수 1111
end
// if, case 문은 always 안에서만 사용 가능
else begin // i_en = 0
case (i_DigitSelect) // case (입력)
2'h0 : r_digit = 4'b1110; // 입력 : 출력
2'h1 : r_digit = 4'b1101; // 입력이 ~이면 출력 ~이다
2'h2 : r_digit = 4'b1011;
2'h3 : r_digit = 4'b0111;
endcase
end
end
endmodule
Schematic
Simulation Source
`timescale 1ns / 1ps
module tb_BCDtoFND();
reg [1:0] i_DigitSelect;
reg i_en;
wire [3:0] o_digit;
FND_Select_Decoder dut(
.i_DigitSelect(i_DigitSelect),
.i_en(i_en),
.o_digit(o_digit)
);
initial begin
#00 i_en = 1'b1; i_DigitSelect = 2'b00;
#10 i_en = 1'b1; i_DigitSelect = 2'b01;
#10 i_en = 1'b1; i_DigitSelect = 2'b10;
#10 i_en = 1'b1; i_DigitSelect = 2'b11;
#10 i_en = 1'b0; i_DigitSelect = 2'b00;
#10 i_en = 1'b0; i_DigitSelect = 2'b01;
#10 i_en = 1'b0; i_DigitSelect = 2'b10;
#10 i_en = 1'b0; i_DigitSelect = 2'b11;
#10 $finish;
end
endmodule
Timing Chart
3X8 디코더 설계
Design Source
`timescale 1ns / 1ps
module BCDtoFND_Decoder(
input [3:0] i_value,
input i_en,
output [7:0] o_font
);
reg [7:0] r_font;
assign o_font = r_font;
always @(i_value or i_en) begin
if (i_en) begin
r_font = 8'hff;
end
else begin
r_font = 8'hff; // latch를 방치하기 위한 초기값 설정
case (i_value)
4'h0 : r_font = 8'hc0;
4'h1 : r_font = 8'hf9;
4'h2 : r_font = 8'ha4;
4'h3 : r_font = 8'hb0;
4'h4 : r_font = 8'h99;
4'h5 : r_font = 8'h92;
4'h6 : r_font = 8'h82;
4'h7 : r_font = 8'hf8;
4'h8 : r_font = 8'h80;
4'h9 : r_font = 8'h90;
4'ha : r_font = 8'h7f;
endcase
end
end
endmodule
Schematic
Simulation Source
`timescale 1ns / 1ps
module tb_BCDtoFND();
reg [1:0] i_DigitSelect;
reg i_en;
wire [3:0] o_digit;
reg [3:0] i_value;
wire [7:0] o_font;
FND_Select_Decoder dut(
.i_DigitSelect(i_DigitSelect),
.i_en(i_en),
.o_digit(o_digit)
);
BCDtoFND_Decoder dut1(
.i_value(i_value),
.i_en(i_en),
.o_font(o_font)
);
initial begin
#00 i_en = 1'b1; i_DigitSelect = 2'b00;
#10 i_en = 1'b1; i_DigitSelect = 2'b01;
#10 i_en = 1'b1; i_DigitSelect = 2'b10;
#10 i_en = 1'b1; i_DigitSelect = 2'b11;
#10 i_en = 1'b0; i_DigitSelect = 2'b00; i_value = 4'h0;
#10 i_en = 1'b0; i_DigitSelect = 2'b01; i_value = 4'h1;
#10 i_en = 1'b0; i_DigitSelect = 2'b10; i_value = 4'h2;
#10 i_en = 1'b0; i_DigitSelect = 2'b11; i_value = 4'h3;
#10 i_en = 1'b0; i_DigitSelect = 2'b11; i_value = 4'h4;
#10 i_en = 1'b0; i_DigitSelect = 2'b11; i_value = 4'h5;
#10 i_en = 1'b0; i_DigitSelect = 2'b11; i_value = 4'h6;
#10 i_en = 1'b0; i_DigitSelect = 2'b11; i_value = 4'h7;
#10 i_en = 1'b0; i_DigitSelect = 2'b11; i_value = 4'ha;
#10 i_en = 1'b0; i_DigitSelect = 2'b11; i_value = 4'ha;
#10 $finish;
end
endmodule
Timing Chart
반응형