реклама на сайте
подробности

 
 
> Синтезатор частоты, Как задействовать ЦАП?
azizcheg
сообщение Jan 24 2011, 11:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Добрый день.
Есть Altera Cyclone III Starter Board и THDB-ADA. Мне надо научиться работать с этой плиской. Работаю в Quartus II. Сейчас работаю над тестированием работы АЦП и ЦАП. Сперва - ЦАП. Надо на выходе ЦАПа получить синусоиду, которую надо зафиксировать осциллографом. Для этого синус надо подать на цап в цифровом виде...
На THDB-ADA есть AD9767. Подсказали сгенерировать синус на плиске, и подать ее на цап. Сказали попробовать DDS. Почитал про это на 'http://rf.atnn.ru/s6/DDS_1.htm' и еще кое-где. По схеме получается, что на плис я собираю регистр, аккумулятор фазы, ПЗУ, и использую clock на самой плате StarterBoard. И должен отправить всё это на THDB-ADA в ЦАП.
1. Добавил в схему lpm_add_sub и lpm_ff (аккум-р фазы) и lpm_rom (ПЗУ).
2. У пзу есть файл sin_tab.mif, куда я записал в ячейки 90 значений синуса в hexadecimal-формате.
3. На рисунке (см. аттач.) видны все выходы с ПЗУ, которые пойдут с StarterKit через HSMC на THDB-ADA и далее на параллельный вход AD9767.

Как clock_50MHz с платы плиски отправить на THDB-ADA?
И вроде надо как-то энейблить этот цап?

Кто делал или понимает - подскажите.

P.s. Здесь на форуме была немного открыта подобная тема, но что-то она осталась непродолженной...
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vadimuzzz
сообщение Jan 26 2011, 10:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



вот генератор sin/cos на кордике, на вход дайте пилу со счетчика. разрядность любая до 32 включительно
CODE

/********************************************************************************
*************/
module cordic_rotate
/********************************************************************************
*************/
#(parameter dw = 12)
/********************************************************************************
*************/
(
input clk,
input reset_n,
input signed [dw-1:0] phase,
input signed [dw-1:0] mag,
input dv,
output signed [dw-1:0] sin_out,
output signed [dw-1:0] cos_out,
output out_valid
);
/********************************************************************************
*************/
typedef logic signed [dw:0] d_type;
localparam p_level = dw-1;
localparam odw = dw+1;
localparam d_type atan_table [0:30] =
'{
pr_round(536870912),
pr_round(316933406),
pr_round(167458907),
pr_round(85004756),
pr_round(42667331),
pr_round(21354465),
pr_round(10679838),
pr_round(5340245),
pr_round(2670163),
pr_round(1335087),
pr_round(667544),
pr_round(333772),
pr_round(166886),
pr_round(83443),
pr_round(41722),
pr_round(20861),
pr_round(10430),
pr_round(5215),
pr_round(2608),
pr_round(1304),
pr_round(652),
pr_round(326),
pr_round(163),
pr_round(81),
pr_round(41),
pr_round(20),
pr_round(10),
pr_round(5),
pr_round(3),
pr_round(1),
pr_round(1)
};
/********************************************************************************
*************/
function integer pr_round;
input integer full_data;
logic one;
logic flag;
begin
one = |full_data[2:0];
flag = ( (!full_data[31])&&(full_data[3]) ) || ( (full_data[31])&&(full_data[3])&&(one) );
pr_round = (flag) ? full_data[31:32-dw-1] + 1 : full_data[31:32-dw-1];
end
endfunction
/********************************************************************************
*************/
reg signed [odw-1:0] x[p_level-1:0];
reg signed [odw-1:0] y[p_level-1:0];
reg signed [odw-1:0] z[p_level-1:0];
integer i;
reg [p_level-1:0] valid_reg;
reg flag[p_level-1:0];
/********************************************************************************
*************/
always_ff @(posedge clk)
begin
if (!reset_n) begin
for(i=0;i<p_level;i++) begin
x[i] <= '0;
y[i] <= '0;
z[i] <= '0;
flag[i] <= 1'b0;
end
end
else if ((dv)||(valid_reg[p_level-1])) begin
x[0] <= mag;
y[0] <= '0;
z[0] <= (phase[dw-1]^phase[dw-2]) ? (2**dw)-2*phase: 2*phase;
flag[0] <= phase[dw-1]^phase[dw-2];
for(i=1;i<p_level;i++) begin
if (z[i-1]<0) begin
x[i] <= x[i-1] + (y[i-1]>>>i);
y[i] <= y[i-1] - (x[i-1]>>>i);
z[i] <= z[i-1] + atan_table[i];
end
else begin
x[i] <= x[i-1] - (y[i-1]>>>i);
y[i] <= y[i-1] + (x[i-1]>>>i);
z[i] <= z[i-1] - atan_table[i];
end
flag[i] <= flag[i-1];
end
end
end
/********************************************************************************
*************/
always_ff @(posedge clk)
begin
if (!reset_n) begin
for(i=0;i<p_level;i++) begin
valid_reg[i] <= 1'b0;
end
end
else begin
valid_reg[0] <= dv;
for(i=1;i<p_level;i++) begin
valid_reg[i] <= valid_reg[i-1];
end
end
end
/********************************************************************************
*************/
assign sin_out = y[p_level-1][odw-1:odw-dw];
assign cos_out = (flag[p_level-1]) ? -$signed(x[p_level-1][odw-1:odw-dw]) : x[p_level-1][odw-1:odw-dw];
assign out_valid = valid_reg[p_level-1];
/********************************************************************************
*************/
endmodule
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Jan 26 2011, 12:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



не. мне не кордика метод нужен.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 26 2011, 12:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(azizcheg @ Jan 26 2011, 18:28) *
не. мне не кордика метод нужен.

а какая разница? те же яйца, только памяти ест меньше
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Jan 26 2011, 13:43
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Я понимаю.
Мне вообще изначально посоветовали 2 метода - DDS и алгоритм Кордика. Второй чуть посложнее на логику. Я реализую пока первый.
Но, собственно проблема инициализации ЦАП (AD9767), мешает мне получить результат. В общем... тема еще открыта.
Go to the top of the page
 
+Quote Post
almost
сообщение Jan 27 2011, 06:05
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 27-05-09
Из: Москва
Пользователь №: 49 648



Цитата(azizcheg @ Jan 26 2011, 16:43) *
Я понимаю.
Мне вообще изначально посоветовали 2 метода - DDS и алгоритм Кордика. Второй чуть посложнее на логику. Я реализую пока первый.
Но, собственно проблема инициализации ЦАП (AD9767), мешает мне получить результат. В общем... тема еще открыта.


Вот готовый проект DDS на VHDl.
Прикрепленные файлы
Прикрепленный файл  dds_synthesizer_latest.tar.gz ( 508.35 килобайт ) Кол-во скачиваний: 37
 
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Jan 27 2011, 08:29
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Исправил кое-какие недочеты.
1. подал клок на ОБА входа ЦАПа
2. также и с WRT
3. сделал старший бит слова данных старшим битом ЦАПа. Иначе было: LSB слова сопоставлялся LSB ЦАПа и 2 последних MSB ЦАПа выкидывал. Теперь же выкидываются 2 LSB ЦАПа.

Результат лучше :-) Однако какие-то непонятные искажения в синусоиде(скрин с осциллографа прикрепил).
Что не так может быть?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jan 27 2011, 08:43
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(azizcheg @ Jan 27 2011, 14:29) *
Что не так может быть?

биты перепутаны?
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Jan 27 2011, 09:28
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Раза 4 или 5 перепроверял. Думаю с битами в порядке.
Ненужные скачки образуются в области нуля синуса. Как будто приближаясь к нулю, к значению модуля синуса прибавляется некоторое значение...
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Jan 27 2011, 09:46
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Блин. Так и есть. Перепутал пин.
Есть синус на выходе! sm.gif
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Feb 1 2011, 09:34
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



После того, как получил посредством DDS синус на SMA-коннекторе DA-channel-A, сразу же его послал на SMA-вход AD-channel-A AD9248. У ацп установил "0" на OEB_A и клок как и у всей системы. POWERON, как я понял, если включен у ЦАП, значит и у АЦП тоже включен(по схеме вроде так). Вых. шину соединил с вх. шиной "B" ЦАПа.
Но на выходе DA-channel-B что-то не синусное, но "частички" синуса по-моему там есть. (прикрепил рисунок с осциллографа).
Пробовал менять соответствие MSB и LSB - ничего...
Есть догадки?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Feb 1 2011, 09:39
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Unsigned воспринимается как signed.
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Feb 1 2011, 11:51
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Цитата(DmitryR @ Feb 1 2011, 12:39) *
Unsigned воспринимается как signed.

А можно немного популярнее? Просто подавая сигнал с одной шины на другую я же не могу учитывать или менять это "sign"
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Feb 1 2011, 12:16
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Цитата(azizcheg @ Feb 1 2011, 14:51) *
А можно немного популярнее? Просто подавая сигнал с одной шины на другую я же не могу учитывать или менять это "sign"

Если у вас один блок выдает например синусоиду 16 bit unsigned (0-65535), а другой блок на входе хочет 16 bit signed (-32768 - 32767) то что надо сделать? Правильно, вычесть 32768 по дороге.
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Feb 1 2011, 12:46
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Цитата(DmitryR @ Feb 1 2011, 15:16) *
Правильно, вычесть 32768 по дороге.

А может прибавить? sm.gif если верить математике...

Цитата(ViKo @ Feb 1 2011, 15:13) *
Паяете хорошо?

Не паяю же. Всё спаяно и готовое на плате с разъемами и коннекторами.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2011, 13:33
Сообщение #16


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(azizcheg @ Feb 1 2011, 14:46) *
А может прибавить? если верить математике...
Не паяю же. Всё спаяно и готовое на плате с разъемами и коннекторами.

Старший бит могли и самом проекте потерять
Go to the top of the page
 
+Quote Post
azizcheg
сообщение Feb 1 2011, 14:20
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-11
Из: Махачкала
Пользователь №: 62 364



Проблема вылезает вот где.
АЦП не задействован.
При подаче сигнала DDS на ЦАП DA-channel-A появляется нормальный синус. Параллельно, этот же сигнал отправляя на DA-channel-B - появляется сдвиги. Похоже на то, что и говорили вы про signed и unsigned.
Вот что написано в даташите к ЦАПу.
Цитата
DAC TRANSFER FUNCTION
Both DACs in the AD9767 provide complementary current outputs, IOUTA and IOUTB. IOUTA provides a near full-scale current output (IOUTFS) when all bits are high (for example, DAC CODE = 16383), while IOUTB, the complementary output, provides no current. The current output appearing at IOUTA and IOUTB is a function of both the input code and IOUTFS and can be expressed as
IOUTA = (DAC CODE/16384) × IOUTFS (1)
IOUTB = (16383 – DAC CODE)/16384) × IOUTFS (2)
where DAC CODE = 0 to 16383 (decimal representation).

Только вот не разберусь, сколько прибавлять? или отнимать...
На скрине сверху - DA-channel-A, снизу - DA-channel-B.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 1 2011, 15:12
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(azizcheg @ Feb 1 2011, 20:20) *
Только вот не разберусь, сколько прибавлять? или отнимать...

старший бит инвертировать
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2011, 15:24
Сообщение #19


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(vadimuzzz @ Feb 1 2011, 17:12) *
старший бит инвертировать

Нет, он там постоянно в одном (нулевом, надо думать) состоянии.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Feb 1 2011, 15:40
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(ViKo @ Feb 1 2011, 21:24) *
Нет, он там постоянно в одном (нулевом, надо думать) состоянии.

если ТС покажет/посмотрит сам сигналы в цифровом виде (в том же сигналтапе), то вопросы отпадут.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- azizcheg   Синтезатор частоты   Jan 24 2011, 11:09
- - almost   Готовый генератор синуса можно взять здесь: http:/...   Jan 24 2011, 11:27
|- - azizcheg   Вроде установил режим работы и подал клок на цап. ...   Jan 24 2011, 14:26
|- - almost   Цитата(azizcheg @ Jan 24 2011, 17:26) Вро...   Jan 24 2011, 16:04
|- - azizcheg   Вибирая ПЗУ LPM_ROM, в визарде увидел надпись, что...   Jan 26 2011, 09:47
|- - vadimuzzz   Цитата(azizcheg @ Jan 26 2011, 19:43) Но,...   Jan 26 2011, 14:04
||- - ViKo   Цитата(vadimuzzz @ Feb 1 2011, 17:40) есл...   Feb 1 2011, 18:12
|- - ViKo   Цитата(azizcheg @ Jan 27 2011, 11:46) Бли...   Feb 1 2011, 12:13
- - vadimuzzz   а схему гоняли в тестбенче?   Jan 27 2011, 09:38
- - ViKo   Думаю, у вас в проекте переполнение числа происход...   Feb 1 2011, 14:37
|- - azizcheg   Цитата(ViKo @ Feb 1 2011, 17:37) Думаю, у...   Feb 1 2011, 14:59
|- - ViKo   Цитата(azizcheg @ Feb 1 2011, 16:59) Сдел...   Feb 1 2011, 15:08
|- - azizcheg   Цитата(ViKo)А вы поменяйте местами, что подаете в ...   Feb 2 2011, 06:21
|- - ViKo   Цитата(azizcheg @ Feb 2 2011, 08:21) ЦАП ...   Feb 2 2011, 07:41
- - vadimuzzz   сигналтап - это логический анализатор http://www.a...   Feb 2 2011, 06:55
- - azizcheg   Просимулировал. Все такты на месте. Биты каналов Ц...   Feb 2 2011, 08:03
- - ViKo   Цитата(azizcheg @ Feb 2 2011, 10:03) Прос...   Feb 4 2011, 07:30
- - azizcheg   Цитата(ViKo @ Feb 4 2011, 10:30) И какие ...   Feb 4 2011, 12:32
- - ViKo   Цитата(azizcheg @ Feb 4 2011, 14:32) Ниче...   Feb 4 2011, 13:47
- - azizcheg   Упс. Ошибочка вышла. Исправил. И теперь показания ...   Feb 7 2011, 07:12
- - ViKo   Цитата(azizcheg @ Feb 7 2011, 09:12) Упс....   Feb 7 2011, 07:52
- - azizcheg   По логике вещей - если для одного канала соблюдают...   Feb 7 2011, 08:54
- - ViKo   Цитата(azizcheg @ Feb 7 2011, 10:54) Я пр...   Feb 7 2011, 09:40


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01658 секунд с 7
ELECTRONIX ©2004-2016