Notice
Recent Posts
Recent Comments
Link
관리 메뉴

거북이처럼 천천히

Verilog RTL 설계(8월 12일 - 2, ADC Converter - 2) 본문

RTL Design/Verilog RTL 설계

Verilog RTL 설계(8월 12일 - 2, ADC Converter - 2)

유로 청년 2024. 8. 18. 19:33

1. XADC (Xilinx Analog-to-Digital Converter) 모듈의 Parameter 역활 및 의미

  • 생성된 XADC 모듈는 아래와 같은 parameter 값을 갖는다.
module xadc_wiz_1(
          daddr_in,            // Address bus for the dynamic reconfiguration port
          dclk_in,             // Clock input for the dynamic reconfiguration port
          den_in,              // Enable Signal for the dynamic reconfiguration port
          di_in,               // Input data bus for the dynamic reconfiguration port
          dwe_in,              // Write Enable for the dynamic reconfiguration port
          reset_in,            // Reset signal for the System Monitor control logic
          vauxp6,              // Auxiliary channel 6
          vauxn6,
          busy_out,            // ADC Busy signal
          channel_out,         // Channel Selection Outputs
          do_out,              // Output data bus for dynamic reconfiguration port
          drdy_out,            // Data ready signal for the dynamic reconfiguration port
          eoc_out,             // End of Conversion Signal
          eos_out,             // End of Sequence Signal
          alarm_out,           // OR'ed output of all the Alarms    
          vp_in,               // Dedicated Analog Input Pair
          vn_in);
          
          (''' 모듈의 코드 생략 ''')
          
endmodule

 

 

1.1.  XADC 모듈의 각각의 parameter들은 아래와 같은 역활과 의미를 갖는다.

  • daddr_in: 동적 재구성 포트의 주소 버스입니다. XADC 레지스터에 접근하기 위한 주소를 지정합니다.
  • dclk_in: 동적 재구성 포트의 클럭 입력입니다. XADC 인터페이스의 타이밍을 제어합니다.
  • den_in: 동적 재구성 포트의 활성화 신호입니다. 데이터 전송을 시작할 때 사용됩니다.
  • di_in: 동적 재구성 포트의 입력 데이터 버스입니다. XADC에 쓰기 작업을 수행할 때 사용됩니다.
  • dwe_in: 동적 재구성 포트의 쓰기 활성화 신호입니다. 쓰기 작업을 수행할 때 사용됩니다.
  • reset_in: 시스템 모니터 제어 로직을 위한 리셋 신호입니다.
  • vauxp6, vauxn6: 보조 채널 6의 차동 입력 쌍입니다. 아날로그 신호를 입력받습니다.
  • busy_out: ADC 작동 중 신호입니다. 변환 진행 중임을 나타냅니다.
  • channel_out: 채널 선택 출력입니다. 현재 선택된 채널을 나타냅니다.
  • do_out: 동적 재구성 포트의 출력 데이터 버스입니다. XADC로부터 읽은 데이터를 출력합니다.
  • drdy_out: 동적 재구성 포트의 데이터 준비 신호입니다. 데이터가 유효함을 나타냅니다.
  • eoc_out: 변환 종료 신호입니다. 단일 변환이 완료되었음을 나타냅니다.
  • eos_out: 시퀀스 종료 신호입니다. 모든 활성화된 채널의 변환이 완료되었음을 나타냅니다.
  • alarm_out: 모든 알람의 OR 연산 출력입니다. 임계값 초과 등의 상황을 나타냅니다.
  • vp_in, vn_in: 전용 아날로그 입력 쌍입니다. 주 아날로그 입력으로 사용됩니다.

 

1.2. XADC 모듈의 parameter의 의미와 사용법에 대해서는 구현을 통해 알아보자.

 

 

 

 

 

2. 조도 센서의 아날로그 값을 디지털 값으로 변환한 뒤, FND로 출력

  • 조도 센서로 부터 얻은 아날로그 신호를 XADC 모듈을 통해 디지털 값으로 변환한 뒤, 디지털 값을 256단계로 나누어 Basys3의 FND 으로 출력하도록 설계하였다.

 

< Source, PWM Control Module >

// PWM Control
module pwm_cntr_5 #(
    parameter sys_clk = 100_000_000,
    parameter duty_step = 256,
    parameter pwm_freq = 10_000,
    
    parameter temp = sys_clk / duty_step / pwm_freq,
    parameter temp_half = temp / 2)(
    input clk, reset_p,
    input [31: 0] duty,
    output pwm);
    
    // temp 분주화
    integer cnt_temp;
    always @(posedge reset_p or posedge clk) begin
        if(reset_p) cnt_temp = 0;
        else begin
            if(cnt_temp >= temp-1) cnt_temp = 0;
            else cnt_temp = cnt_temp + 1;
        end
    end
    
    wire pwm_temp, pwm_temp_nedge;
    assign pwm_temp = (cnt_temp < temp_half) ? 0 : 1;
    edge_detector edge_detector_0 (.clk(clk), .reset_p(reset_p),                       
         .cp(pwm_temp), .n_edge(pwm_temp_nedge));
    
    
    // duty_step 분주화
    integer cnt_step;
    
    always @(posedge clk or posedge reset_p) begin
        if(reset_p) cnt_step = 0;
        else if(pwm_temp_nedge) begin
            if(cnt_step >= duty_step -1 ) cnt_step = 0;
            else cnt_step = cnt_step + 1;
        end
    end
    
    assign pwm = (cnt_step < pwm) ? 1 : 0;
endmodule
  • 첫 번째 분주화 작업은 pwm_freq 주파수를 갖는 PWM을 생성하기 위한 분주화 작업이다. 이를 위해 Basys3의 clock pulse을 temp 분주화를 하며, 이를 통해 얻어진 PWM은 sys_clk / temp 주파수를 갖게 된다.
  • 두 번째 분주화 작업은 PWM의 duty step 단계로 나누어 컨트롤하기 위한 분주화 작업이다. 이를 위해 1단계 분주화 작업에서 얻은 pwm을 duty_step 분주화를 하며, 이를 통해 얻어진 PWM은 sys_clk / temp / duty_step == pwm_freq 주파수를 갖게 된다.

 

< Source, Top module of XADC Converter module >

// Top module of Converting from analog to digital.
module adc_converter_0_ch6(
    input clk, reset_p,
    input vauxp6, vauxn6,
    output [3:0] com,
    output [7:0] seg_7);
    
    // Declare variables.
    wire eoc_out; // End of convert, 변환 종료 신호
    wire [4:0] channel_out; // 현재 선택된 채널
    wire [15:0] do_out;
    
    // Instance of XADC Converter 
    xadc_wiz_1 adc_ch6 (
          .daddr_in({2'b0, channel_out}),   // XADC 레지스터에 접근하기 위한 주소를 지정
          .dclk_in(clk),                    // xadc 모듈의 clk 설정
          .den_in(eoc_out),                 // den_in는 eoc_out로 부터 디지털 변환 신호를 끝났다는 신호를 
                                            // 받으면 데이터 전송을 시작하게 된다.
   
          .reset_in(reset_p),               // 시스템 제어를 위한 리셋 신호
          .vauxp6(vauxp6),                  // Auxiliary channel 6
          .vauxn6(vauxn6),
          .channel_out(channel_out),        // 채널 선택 출력, 현재 선택된 채널을 나타낸다.
          .do_out(do_out),                  // 아날로그 신호를 디지털 값으로 변환된 결과 값
          .eoc_out(eoc_out));               // 변환 종료 신호 );
    
    
    // PWM Control
    pwm_cntr_5 #(.duty_step(256), .pwm_freq(10000)) pwm_control (.clk(clk), .reset_p(reset_p),
                 .duty(do_out[15:8]), .pwm(pwm));
    
    // Convert from binary to BCD code
    wire [15:0] bcd_duty;
    bin_to_dec convert_bin_to_bcd (.bin({4'b0, do_out[15:8]}), .bcd(bcd_duty));
    
    // FND Control
    fnd_cntr control_fnd (.clk(clk), .reset_p(reset_p), .hex_value(bcd_duty), .com(com), .seg_7(seg_7));
    
endmodule

Basys3는 4개의 아날로그 입력 채널을 지원한다.

  • Basys3는 최대 4개의 아날로그 입력 채널을 지원한다. (6번, 7번, 14번, 15번)
  • 이번 ADC Converter를 위한 6번 아날로그 입력 채널을 사용할 것이다.

    ★★★★★★★★★★★★
  •  Q) 아날로그 신호 값을 디지털 값으로 변환된 결과 값인, do_out 에서 왜 최상위 비트(MSB)부터 8bit
         데이터를 가져오는가? LSB부터 8bit 데이터를 가져오면 안되는가?
    A) 
    아날로그 신호를 디지털 값으로 변환된 결과 값은 최상위 비트에서부터 12bit 영역에 채워지게 된다.
         따라서 아날로그 신호 값을 디지털로 변환된 값을 얻고 싶다면 MSB부터 가져와야 한다.

    ★★★★★★★★★★★★
  • Q) do_out 변수의 크기는 16bit인데, 왜 MSB부터 12bit 까지가 디지털로 변환된 값인가?
    A)
    Basys3는 12bit 해상도를 갖기 때문에 아날로그 신호를 Sampling한 후, Quantization하는 과정에서 12bit 
        로 양자화를 하게 되며, 이로 인해 아날로그의 신호를 2^12 = 4096개 디지털 레벨로 나누어 디지털 값으로
        표현된다. 

  • 조도 센서의 아날로그 신호를 256단계로 나누어 디지털 값으로 표현할 것이기 때문에 do_out 변수에서 MSB부터 8bit 데이터를 가져오게 된다.

 

 

 

< 구현  >

 

  • Converting from analog to digital 하기 위해서는 JXADCD Port를 이용한다.
  • vanxp6, vanxn6 핀을 위와 같이 설정하였다.

    ★★★★
  • Q) vanxn6 은 어떤 역활을 수행하는가?
    A)
    두 신호는 차동 쌍(differential pair)을 형성하며, XADC는 이 두 신호의 전압 차이를 측정하여 디지털 값으로 변환한다. 따라서 vanxn6는 두 신호의 전압 차이를 구함에 있어 기준점이 이라고 볼 수 있다.