Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Recursion
- KEYPAD
- hc-sr04
- FND
- Algorithm
- ATMEGA128A
- structural modeling
- Pspice
- i2c 통신
- Linked List
- behavioral modeling
- uart 통신
- D Flip Flop
- verilog
- vivado
- LED
- soc 설계
- pwm
- dataflow modeling
- java
- prescaling
- Edge Detector
- test bench
- BASYS3
- half adder
- stop watch
- atmega 128a
- ring counter
- DHT11
- gpio
Archives
- Today
- Total
거북이처럼 천천히
Verilog RTL 설계(8월 12일 - 2, ADC Converter - 2) 본문
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개의 아날로그 입력 채널을 지원한다. (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는 두 신호의 전압 차이를 구함에 있어 기준점이 이라고 볼 수 있다.
'RTL Design > Verilog RTL 설계' 카테고리의 다른 글
Verilog RTL 설계(7월 24일 - 1, HC-SR04 구현 ) (0) | 2024.08.21 |
---|---|
Verilog RTL 설계(7월 23일 - 5, DHT11 구현 (4) ) (0) | 2024.08.19 |
Verilog RTL 설계(8월 12일 - 1, ADC Converter - 1) (0) | 2024.08.18 |
Verilog RTL 설계(8월 2일 - 3, PWM을 통한 Servo-motor 제어 - 3) (0) | 2024.08.17 |
Verilog RTL 설계(8월 2일 - 2, PWM을 통한 Servo-motor 제어 - 2) (0) | 2024.08.16 |