module 7_seg_decoder(
iCLK, // 클록 신호 (ex. 1MHz)
iRESETn, // Active-Low 리셋 신호 (0이면 리셋, 1이면 동작)
iBCD, // 4비트 BCD 입력 (0~9)
oCOM_FND, // 7-Segment 공통 단자 출력 (여기서는 고정값 출력)
oDATA_FND // 7-Segment LED에 출력할 제어 신호
);
// 입력 포트 선언
input iCLK; // 클록 입력
input iRESETn; // 리셋 입력 (Active-Low)
input [3:0] iBCD; // BCD 값 (0~9)
// 출력 포트 선언
output [3:0] oCOM_FND; // FND 공통 단자 (고정 출력)
output [7:0] oDATA_FND; // FND 데이터 출력
// 내부 레지스터
reg [7:0] data_fnd; // FND 데이터 (세그먼트 제어 코드)
// 클록 상승 에지 또는 리셋 신호의 음의 에지에서 동작
always @ (posedge iCLK or negedge iRESETn) begin
if (!iRESETn)
// 리셋 시 모든 세그먼트 OFF
data_fnd <= 8'b1111_1111;
else
// BCD 입력 값에 따라 7-Segment 제어 코드 설정
case(iBCD)
4'd0 : data_fnd <= 8'b1111_1100; // 숫자 0
4'd1 : data_fnd <= 8'b0110_0000; // 숫자 1
4'd2 : data_fnd <= 8'b1101_1010; // 숫자 2
4'd3 : data_fnd <= 8'b1111_0010; // 숫자 3
4'd4 : data_fnd <= 8'b0110_0110; // 숫자 4
4'd5 : data_fnd <= 8'b1011_0110; // 숫자 5
4'd6 : data_fnd <= 8'b1011_1110; // 숫자 6
4'd7 : data_fnd <= 8'b1110_0100; // 숫자 7
4'd8 : data_fnd <= 8'b1111_1110; // 숫자 8
4'd9 : data_fnd <= 8'b1110_0110; // 숫자 9
default : data_fnd <= 8'b1111_1111; // 잘못된 값이면 모든 세그먼트 OFF
endcase
end
// FND 공통 단자는 고정 출력 (모든 자리 점등으로 설정)
assign oCOM_FND = 4'b0000;
// 7-Segment 출력 데이터 연결
assign oDATA_FND = data_fnd;
endmodule
Schematic
Zybo z7_16 Pmod Ports
I/O port 설정
구현 사진
Testbench
`timescale 1ns/10ps // 시뮬레이션 시간 단위: 1ns, 해상도: 10ps
module tb_7_seg_decoder;
localparam TCLK = 100; // 클록 주기: 100ns (10MHz 클록)
reg iCLK; // 클록 신호
reg iRESETn; // 리셋 신호 (Active-Low)
reg [3:0] iBCD; // BCD 입력 값
wire [3:0] oCOM_FND; // FND 공통 단자 출력
wire [7:0] oDATA_FND; // FND 세그먼트 출력
integer i; // 루프 카운터
// DUT 인스턴스화 (7-seg decoder)
7_seg_decoder U0 (
.iCLK(iCLK),
.iRESETn(iRESETn),
.iBCD(iBCD),
.oCOM_FND(oCOM_FND),
.oDATA_FND(oDATA_FND)
);
// 초기 조건 + 테스트 시나리오
initial begin
iCLK = 1;
iRESETn = 1;
iBCD = 4'd0;
#(TCLK/2);
iRESETn = 0; #(TCLK/2); // 리셋 동작 (Active-Low)
iRESETn = 1; // 리셋 해제
// BCD 0 ~ 9 + 1회 초과 카운트 시뮬레이션
for (i = 0; i < 11; i = i + 1) begin
#(TCLK); // 클록 주기마다 BCD 변화
if (iBCD == 9)
iBCD = 4'd0; // 9 -> 0으로 롤오버
else
iBCD = iBCD + 4'd1; // BCD 값 증가
end
$stop; // 시뮬레이션 종료
end
// 10MHz 클록 생성 (100ns 주기, 50ns마다 반전)
always #(TCLK/2) iCLK = ~iCLK;
endmodule