Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AD9254 и Cyclone IV
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Grizzzly
Не получается получить верные данные с АЦП AD9254. Отладочная плата Terasic.
На вход АЦП подаю синус частотой 10 МГц с внешнего генератора, данные с выхода АЦП передаю на ЦАП DAC5672. На спектроанализаторе смотрю данные с ЦАП.
Если входное напряжение маленькое (до 5 мВ), то присутствует пик на 10 МГц. При увеличении напряжения хотя бы на 1 мВ появляются паразитные гармоники на кратных частотах, т.е. 20, 30, ... МГц. На плате генератор 50 МГц, тактовая частота, на которой работают плата, ЦАП и АЦП, - 100 МГц. Получена с помощью PLL.
Файл .sdc:
CODE
create_clock -period 20 [get_ports OSC_50[0]]
create_clock -period 20 [get_ports OSC_50[1]]
create_clock -period 20 [get_ports OSC_50[2]]

create_clock -period 10 [get_ports ADA_DCO]
create_clock -period 10 [get_ports FPGA_CLK_A_P]
create_clock -period 10 [get_ports FPGA_CLK_A_N]
#**************************************************************
# Create Generated Clock
#**************************************************************
derive_pll_clocks

# Set Clock Uncertainty
#**************************************************************
derive_clock_uncertainty

Сам проект:
CODE
module adc
(
OSC_50,
ADA_DCO,
AD,
DA,
FPGA_CLK_A_N,
FPGA_CLK_A_P,
ADA_OE,
ADA_SPI_CS,
J1_152,
XT_IN_N,
XT_IN_P
);

input [2:0] OSC_50;
input ADA_DCO;
input [13:0] AD;
inout FPGA_CLK_A_N;
inout FPGA_CLK_A_P;
output ADA_OE;
output ADA_SPI_CS;


wire sys_clk;
wire sys_clk_90deg;
wire sys_clk_180deg;
wire sys_clk_270deg;
wire pll_locked;

reg [13:0] per_a2da_d;
reg [13:0] ddd;

assign ADA_OE = 1'b0; // enable ADA output

assign ADA_SPI_CS = 1'b1; // disable ADA_SPI_CS (CSB)

inout J1_152;
input XT_IN_N;
input XT_IN_P;

output [13:0] DA;
assign FPGA_CLK_A_N = ~sys_clk_180deg;
assign FPGA_CLK_A_P = sys_clk_180deg;
//assign FPGA_CLK_B_P = sys_clk_270deg;
//assign FPGA_CLK_B_N = ~sys_clk_270deg;

//--- pll
pll pll_inst(
.inclk0(OSC_50[0]),
.c0(sys_clk),
.c1(sys_clk_90deg),
.c2(sys_clk_180deg),
.c3(sys_clk_270deg),
.locked(pll_locked)
);

always @(posedge ADA_DCO)
begin
per_a2da_d <= AD;
end

assign DA = ddd;

always @(posedge sys_clk)
begin
ddd <= per_a2da_d;
end
endmodule

В даташите написано, что Vpp = 2 В, а у меня уже при 6 мВ появляются нелинейные искажения. Подскажите, пожалуйста, что я неверно делаю?
DmitryR
Посмотреть, что этих гармоник нет на выходе генератора.
Посмотреть соотношение фаз частот ADA_DCO и sys_clk.
Пропустить ADA_DCO через 1:1 PLL в source-synchronous режиме, ибо АЦП выдаёт клок одновременно с данными, а в FPGA у них пути совершенно разные, поэтому компенсация как минимум не повредит.
Я последнее: я у вас нигде что-то не вижу, где формируется тактовая частота DAC.
Grizzzly
Спасибо большое!
На выходе генератора этих гармоник нет. Проверялось. На АЦП и ЦАП подаются одинаковые частоты FPGA_CLK_A_P и FPGA_CLK_A_P. На дополнительной плате - data connection card - они подводятся сразу и к DAC, и к ADC. Да, с фазами надо будет разобраться. Буду внимательно смотреть на фазовые соотношения.
DmitryR
Цитата(Grizzzly @ Aug 9 2013, 16:15) *
На АЦП и ЦАП подаются одинаковые частоты FPGA_CLK_A_P и FPGA_CLK_A_P.

Это тоже неправильно. Данные у вас выходят с регистра, клок - с выхода PLL, пути разные. Данные, которые захлопнуты фронтом клока выйдут на лапы совершенно необязательно одновременно с фронтом этого клока. Надо делать так: данные выпускать как у вас (только констрейнами загнать эти триггеры в лапы), а клок выдавать через DDR триггер, на который подан сам клок, на верхний триггер подана всегда 1, а на нижний - 0 (или наоборот, в зависимости от необходимой фазы). Таким образом времянка прохождения данных и клока становится строго одинаковой (и то, и то идёт с триггеров в лапах).
Grizzzly
Спасибо огромное за помощь! К сожалению, у меня нет большого опыта работы с ПЛИС, только что институт закончил. Не понял про "триггеры в лапах" и DDR... Когда учился, работал на полставки, но там в основном генерировал VHDL/Verilog из MATLAB под Xilinx, а АЦП и ЦАП были другими.
Сейчас разбираюсь с примерами к отладочной плате. Этот SDC, частично изменив, брал оттуда. Значит, где-то ошибся.
Подскажите, пожалуйста, как это реализовать.
P. S. Реализую QPSK модулятор и демодулятор. По теории и алгоритмической реализации всё понятно. А вот с "железом" пока трудновато.
DmitryR
DDR - это просто мегафункция, ddio_out. Реализует вывод по двум фронтам. Чтобы триггеры загнать в лапы - в Assignmebt Editor используйте Fast output trigger on. Ну и в документации почитайте, что это такое.
Grizzzly
Спасибо за помощь. Оказывается, основная проблема была в другом. АЦП выдает данные в формате signed, а ЦАП работает с unsigned данными. Нужно было инвертировать старший бит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.