Verilog_RTL 설계

[Verilog_RTL]_7-Seg_DECODER

juniha 2025. 6. 20. 00:08

 

7-세그먼트 디코더

  • 숫자(digit) 7개, 소수점(dot point) 1개로 구성된 출력장치
  • 발광 다이오드의 배열
  • 단자: 애노드(anode), 캐소드(cathod)

seg_datasheet

사용 코드

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

 

Simulation

 

'Verilog_RTL 설계' 카테고리의 다른 글

[Verilog_RTL]_FSM_mealy  (0) 2025.06.20
[Verilog_RTL]_FSM_moore  (0) 2025.06.20
[Verilog_RTL]_2-to-10_DECODER  (0) 2025.06.16
[Verilog_RTL]_10-to-2_ENCODER  (0) 2025.06.16
[Verilog_RTL]_Binary_BCD 변환기  (0) 2025.06.14