|
Синтезатор частоты, Как задействовать ЦАП? |
|
|
|
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 ЦАПа. Результат лучше :-) Однако какие-то непонятные искажения в синусоиде(скрин с осциллографа прикрепил). Что не так может быть?
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
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       azizcheg Раза 4 или 5 перепроверял. Думаю с битами в порядк... Jan 27 2011, 09:28        azizcheg Блин. Так и есть. Перепутал пин.
Есть синус на вых... Jan 27 2011, 09:46         azizcheg После того, как получил посредством DDS синус на S... Feb 1 2011, 09:34          DmitryR Unsigned воспринимается как signed. Feb 1 2011, 09:39           azizcheg Цитата(DmitryR @ Feb 1 2011, 12:39) Unsig... Feb 1 2011, 11:51            DmitryR Цитата(azizcheg @ Feb 1 2011, 14:51) А мо... Feb 1 2011, 12:16             azizcheg Цитата(DmitryR @ Feb 1 2011, 15:16) Прави... Feb 1 2011, 12:46              ViKo Цитата(azizcheg @ Feb 1 2011, 14:46) А мо... Feb 1 2011, 13:33               azizcheg Проблема вылезает вот где.
АЦП не задействован.
... Feb 1 2011, 14:20                vadimuzzz Цитата(azizcheg @ Feb 1 2011, 20:20) Толь... Feb 1 2011, 15:12                 ViKo Цитата(vadimuzzz @ Feb 1 2011, 17:12) ста... Feb 1 2011, 15:24                  vadimuzzz Цитата(ViKo @ Feb 1 2011, 21:24) Нет, он ... Feb 1 2011, 15:40                   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
|
|
|