본문 바로가기

VERILOG

ZCU102-G + AD7606C18 Simultaneous Sampling ADC 8ch 18Bit -4 parallel

마지막 글입니다.

 

이번 글에서는 ad7606_test top모듈을 만들어보고 디버깅을 해보겠습니다

`timescale 1ns/1ps

//////////////////////////////////////////////////////////////////////////////////
// Module Name:    ad706_test 
//////////////////////////////////////////////////////////////////////////////////
module ad7606_test(
    input        CLK_74_25_P,
    input        CLK_74_25_N,                  // 50MHz 클럭
input        rst_n,                // 리셋 신호

input [15:0] ad_data,              // ad7606 데이터 입력
input        ad_busy,              // ad7606 비지 바쁨 신호
    input        first_data,           // ad7606 첫 데이터 신호     
    output [2:0] ad_os,                // ad7606 오버샘플링 신호
    output       ad_cs,                // ad7606 CS 신호
    output       ad_rd,                // ad7606 데이터 읽기 신호
    output       ad_reset,             // ad7606 리셋 신호
    output       ad_convstab,          // ad7606 변환 시작 신호

input        rx,                   // UART 입력
output       tx                    // UART 출력
);

(* MARK_DEBUG = "TRUE" *) wire [4:0] state;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch1;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch2;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch3;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch4;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch5;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch6;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch7;
(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch8;

wire [19:0] ch1_dec;
wire [19:0] ch2_dec;
wire [19:0] ch3_dec;
wire [19:0] ch4_dec;
wire [19:0] ch5_dec;
wire [19:0] ch6_dec;
wire [19:0] ch7_dec;
wire [19:0] ch8_dec;

wire [7:0] ch1_sig;
wire [7:0] ch2_sig;
wire [7:0] ch3_sig;
wire [7:0] ch4_sig;
wire [7:0] ch5_sig;
wire [7:0] ch6_sig;
wire [7:0] ch7_sig;
wire [7:0] ch8_sig;

wire clk;
// IBUFDS: Differential Input Buffer
// 7 Series
// Xilinx HDL Language Template, version 2017.4
IBUFDS #(
.DIFF_TERM("FALSE"), // Differential Termination
.IBUF_LOW_PWR("TRUE"), // Low power="TRUE", Highest performance="FALSE"
.IOSTANDARD("DEFAULT") // Specify the input I/O standard
) IBUFDS_inst (
.O(clk), // Buffer output    "clk" in your case
.I(CLK_74_25_P), // Diff_p buffer input (connect directly to top-level port)   "clk_p" in your case
.IB(CLK_74_25_N) // Diff_n buffer input (connect directly to top-level port)  "clk_n" in your case
);
// End of IBUFDS_inst instantiation

// ad7606 모듈 인스턴스화
ad7606c18 u1(
.clk              (clk),
.rst_n            (rst_n),
.ad_data          (ad_data),
.ad_busy          (ad_busy),
.first_data       (first_data),
.ad_os            (ad_os),
.ad_cs            (ad_cs),
.ad_rd            (ad_rd),
.ad_reset         (ad_reset),
.ad_convstab      (ad_convstab),
.ad_ch1           (ad_ch1),           // ch1 ad 데이터 16비트
.ad_ch2           (ad_ch2),           // ch2 ad 데이터 16비트
.ad_ch3           (ad_ch3),           // ch3 ad 데이터 16비트
.ad_ch4           (ad_ch4),           // ch4 ad 데이터 16비트
.ad_ch5           (ad_ch5),           // ch5 ad 데이터 16비트
.ad_ch6           (ad_ch6),           // ch6 ad 데이터 16비트
.ad_ch7           (ad_ch7),           // ch7 ad 데이터 16비트
.ad_ch8           (ad_ch8),            // ch8 ad 데이터 16비트
    .state            (state)
);

// AD 변환된 값을 전압으로 변환하는 모듈 인스턴스화
volt_cal u2(
.clk              (clk),
.ad_reset         (ad_reset),
.ad_ch1           (ad_ch1),           // ch1 ad 데이터 16비트 (입력)
.ad_ch2           (ad_ch2),           // ch2 ad 데이터 16비트 (입력)
.ad_ch3           (ad_ch3),           // ch3 ad 데이터 16비트 (입력)
.ad_ch4           (ad_ch4),           // ch4 ad 데이터 16비트 (입력)
.ad_ch5           (ad_ch5),           // ch5 ad 데이터 16비트 (입력)
.ad_ch6           (ad_ch6),           // ch6 ad 데이터 16비트 (입력)
.ad_ch7           (ad_ch7),           // ch7 ad 데이터 16비트 (입력)
.ad_ch8           (ad_ch8),           // ch8 ad 데이터 16비트 (입력)

.ch1_dec           (ch1_dec),         // ch1 ad 전압 (출력)
.ch2_dec           (ch2_dec),         // ch2 ad 전압 (출력)
.ch3_dec           (ch3_dec),         // ch3 ad 전압 (출력)
.ch4_dec           (ch4_dec),         // ch4 ad 전압 (출력)
.ch5_dec           (ch5_dec),         // ch5 ad 전압 (출력)
.ch6_dec           (ch6_dec),         // ch6 ad 전압 (출력)
.ch7_dec           (ch7_dec),         // ch7 ad 전압 (출력)
.ch8_dec           (ch8_dec),         // ch8 ad 전압 (출력)

.ch1_sig           (ch1_sig),         // ch1 ad 신호 (출력)
.ch2_sig           (ch2_sig),         // ch2 ad 신호 (출력)
.ch3_sig           (ch3_sig),         // ch3 ad 신호 (출력)
.ch4_sig           (ch4_sig),         // ch4 ad 신호 (출력)
.ch5_sig           (ch5_sig),         // ch5 ad 신호 (출력)
.ch6_sig           (ch6_sig),         // ch6 ad 신호 (출력)
.ch7_sig           (ch7_sig),         // ch7 ad 신호 (출력)
.ch8_sig           (ch8_sig)          // ch8 ad 신호 (출력)
);

// UART 통신 모듈 인스턴스화
uart u3(
.clk50                (clk),
.reset_n             (rst_n),

.ch1_dec                 (ch1_dec),         // ad1 BCD 전압
.ch2_dec                 (ch2_dec),         // ad2 BCD 전압
.ch3_dec                 (ch3_dec),         // ad3 BCD 전압
.ch4_dec                 (ch4_dec),         // ad4 BCD 전압
.ch5_dec                 (ch5_dec),         // ad5 BCD 전압
.ch6_dec                 (ch6_dec),         // ad6 BCD 전압
.ch7_dec                 (ch7_dec),         // ad7 BCD 전압
.ch8_dec                 (ch8_dec),         // ad8 BCD 전압

.ch1_sig                 (ch1_sig),          // ch1 ad 신호
.ch2_sig                 (ch2_sig),          // ch2 ad 신호
.ch3_sig                 (ch3_sig),          // ch3 ad 신호
.ch4_sig                 (ch4_sig),          // ch4 ad 신호
.ch5_sig                 (ch5_sig),          // ch5 ad 신호
.ch6_sig                 (ch6_sig),          // ch6 ad 신호
.ch7_sig                 (ch7_sig),          // ch7 ad 신호
.ch8_sig                 (ch8_sig),          // ch8 ad 신호

.tx                      (tx)
);

endmodule

 

탑모듈을 작성했습니다.

 

일반적으로 RTL 코딩한 것을 점검하기 위해서는 시뮬레이션 기능을 돌립니다.

 

기본적으로는 설계(Design) 과정에서는 Simulation을 통해서 RTL을 먼저 검증합니다. Simulation에서 검증이 되었다면

이후 합성(Synthesis)과 구현(Implementation)된 Design을 검증해야 됩니다.

 

TOP모듈을 만들고 따로 TB 테스트벤치를 만들지 않고 set up debug 기능을 통해서 파형을 확인하도록 하겠습니다.

 

 

위의 그림과 같이

 

내가 확인하고자 하는 데이터 앞에 

(* MARK_DEBUG = "TRUE" *) wire [17:0] ad_ch1; 라고 써줍니다.

 

다음 Run Synthesis 를 해줍니다

 

다 완료가 되면

 

 

Seu up Debug 를 눌러줍니다. Next

 

 

Next

 

 

Set Up Debug 화면 중에 정상화면이고

 

이 화면은 에러 뜬 화면입니다. 에러를 설명드리기 위해 사진을 올렸고

 

위의 화면에서 Clock Domain의 clk_BUFG가 통일이 아니고 에러가 뜬다면 그 에러를 클릭해줘서 clk를 맞춰주면 됩니다.

Next 

 

 

 

이렇게 Finish 해줍니다.

 

그리고 ad7606_test 밑에 u1 에 ad_ch_1 밑의 채널들을

 

위의 그림을 보시면 ad7606_test 아래에 u1에서 

 

 

보고자 하는 데이터를 Mark Debug 해줍니다.

 

한번 더 Set Up Debug 해줍니다

 

 

u1/ad_ch1 ~ ch6 등 추가 된 것이 확인됩니다 next 눌러줍니다.

 

Finish 누릅니다.

 

그리고 Run Implementation 을 해줍니다.

 

다 되었다면

다음 순서인 Generate Bitstream 을 해줍니다

 

다 되었다면

 

보드 연결을 해줍니다.

 

 

Program Device 해줍니다.

 

Bitstream file 뿐만 아니라

 

Debug Probes file 이 생성된 것을 확인할 수 있습니다. 저게 생성되지 않았다면 위의 과정들을 다시 밟으시면 됩니다.

 

 

프로그램 디바이스를 했다면 이와같은 화면이 나옵니다.

 

 

재생버튼을 눌러줍니다.

 

 

파형 확인

 

126.85 MHz ADC

 

10KHz 파형