|
Синтезатор частоты, Как задействовать ЦАП? |
|
|
|
Jan 24 2011, 11:09
|
Участник

Группа: Участник
Сообщений: 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. Здесь на форуме была немного открыта подобная тема, но что-то она осталась непродолженной...
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Jan 26 2011, 10:05
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 26 2011, 12:28
|
Участник

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

|
не. мне не кордика метод нужен.
|
|
|
|
|
Jan 26 2011, 13:43
|
Участник

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

|
Я понимаю. Мне вообще изначально посоветовали 2 метода - DDS и алгоритм Кордика. Второй чуть посложнее на логику. Я реализую пока первый. Но, собственно проблема инициализации ЦАП (AD9767), мешает мне получить результат. В общем... тема еще открыта.
|
|
|
|
|
Jan 27 2011, 06:05
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 27-05-09
Из: Москва
Пользователь №: 49 648

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

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

|
Исправил кое-какие недочеты. 1. подал клок на ОБА входа ЦАПа 2. также и с WRT 3. сделал старший бит слова данных старшим битом ЦАПа. Иначе было: LSB слова сопоставлялся LSB ЦАПа и 2 последних MSB ЦАПа выкидывал. Теперь же выкидываются 2 LSB ЦАПа. Результат лучше :-) Однако какие-то непонятные искажения в синусоиде(скрин с осциллографа прикрепил). Что не так может быть?
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 27 2011, 09:28
|
Участник

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

|
Раза 4 или 5 перепроверял. Думаю с битами в порядке. Ненужные скачки образуются в области нуля синуса. Как будто приближаясь к нулю, к значению модуля синуса прибавляется некоторое значение...
|
|
|
|
|
Jan 27 2011, 09:46
|
Участник

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

|
Блин. Так и есть. Перепутал пин. Есть синус на выходе!
|
|
|
|
|
Feb 1 2011, 09:34
|
Участник

Группа: Участник
Сообщений: 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 - ничего... Есть догадки?
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 1 2011, 11:51
|
Участник

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

|
Цитата(DmitryR @ Feb 1 2011, 12:39)  Unsigned воспринимается как signed. А можно немного популярнее? Просто подавая сигнал с одной шины на другую я же не могу учитывать или менять это "sign"
|
|
|
|
|
Feb 1 2011, 12:46
|
Участник

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

|
Цитата(DmitryR @ Feb 1 2011, 15:16)  Правильно, вычесть 32768 по дороге. А может прибавить?  если верить математике... Цитата(ViKo @ Feb 1 2011, 15:13)  Паяете хорошо? Не паяю же. Всё спаяно и готовое на плате с разъемами и коннекторами.
|
|
|
|
|
Feb 1 2011, 14:20
|
Участник

Группа: Участник
Сообщений: 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.
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|