|
|
  |
Хочу построить КВ трансивер на ПЛИС, что для этого нужно? |
|
|
|
Oct 17 2015, 22:40
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-01-15
Пользователь №: 84 516

|
Цитата(Golikov A. @ Oct 17 2015, 22:31)  VHDL и библиотеки - это известный дракон... И он многоглавый, потом еще конфликты между библиотеками пойдут и прочее  .... как то реально не с того конца вы начали, ну да ладно... все же лучше чем водку пить  Почему не с того конца? Я нашел формулы итераций CORDIC, промоделировал его в Exel, начал писать код модуля в VHDL и появились вопросы, как преобразовать integer в вектор и наоборот, на поиски ответа на которые я потратил много времени и моих экспериментов. Была бы литература именно по теме построения радиотрактов - было бы легче. С чего начинать-то тогда? Светодиодами я уже помигал
Сообщение отредактировал Aleksandr Vihorev - Oct 17 2015, 22:42
|
|
|
|
|
Oct 18 2015, 18:01
|
Местный
  
Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859

|
Цитата Вот вопрос - а где я ошибаюсь, пркидывая возможный диапазон регулировки как разность разрядности выхода FIR фильтра и разрядности аудикодека? Если не вдаваться в тонкости, то АРУ нужна чтобы любой сигнал на входе приемника привести к номинальной громкости. Минимально возможный сигнал - это уровень собственного шума приемника в полосе выбранного фильтра. Для слухового приема в полосе 3.1 кГц, если АЦП 122.8 МГц дает SNR 80 дБ, то уровень собственного шума будет -80-10Log(61400/3.1) = -123 дБ. Значит для режима 3.1 кГц потребуется усиление не больше 123 дБ. Разрядность и тип кодека значение не имеет. Будет нормально работать и на 12 битах. Разрядность АЦП/ЦАП кодека больше 16 бит явно избыточна для этой задачи. Геннадий, а в чем "фишка" спортивного АРУ по сравнению с "плоской"?
|
|
|
|
|
Oct 20 2015, 09:08
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Genadi Zawidowski @ Oct 16 2015, 11:30)  Сейчас фильтр со входной разрядностью 32 бита (ограничено используемой IP FIR COMPILER). 1) АРУ сделано за фильтром, приблизительно 90 дБ. Хотелось чуть-чуть больше. 2) хотелось отодвинуть шумы округления подальше. Хоть на 4 разряда. У меня коэффициенты 24бита, данные 48бит, диапазон АРУ более 130дБ. Правда это не на ПЛИС и не с DDC, но разницы применительно к данному вопросу не вижу. 24бита для наших применений было однозначно мало, 32 по идее должно хватать. У меня выбор был 24 или 48, т.к. процессор 24битный. Цитата(Genadi Zawidowski @ Oct 16 2015, 13:24)  ФНЧ сформирован в FPGA, меняет полосу от 50 до 6000 герц. При 48 кГц sample rate от CIC и 961 порядке нормально получается частота среза ФНЧ от 100 герц. А почему не хотите сделать фильтрацию на более низкой частоте дискретизации? При такой структурной схеме вообще логично по мере сужения полосы понижать частоту дискретизации. У меня на 12кГц и 50Гц с красивой АЧХ получается.
|
|
|
|
|
Oct 20 2015, 15:58
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 20-04-12
Из: Нижний Новгород
Пользователь №: 71 488

|
У нас в КВ-радиостанции используется 16-битная АЦП на тактовой 80 МГц. Написанный мной (к слову, вообще без применения всяких корегенераторов) в ПЛИС DDC имеет следующие ступени: 1) HPF(high-pass filter) - удаляет постоянку. На выходе 18 бит. 2) Генератор комплексной синусоиды на основе LUT+коррекция разложением в ряд Тейлора 1 порядка (теория подробно описана у xilinx). SFDR 112dB, выход 18 бит. CORDIC в этом месте не рекомендую, так как его конвейерная реализация для достижения аналогичного SFDR потребует примерно в 20 раз больше логических ячеек. Мой вариант на cyclone III занимает 180 ячеек, 3 умножителя 18х18 и один блок памяти. 3) Перенос на нулевую частоту. Результат комплексного умножения обрезается с 36 до 24 бит. 4) CIC 6 ступеней, понижает частоту дискретизации в 125 раз до 640 кГц. Вход 24-битный, выход 32. CIC изначально генерился из матлаба, потом я его переписал в виде красивого параметризованного модуля. Вся дальнейшая обработка только в 32-битной разрядности. 5) Полифазный FIR дециматор x3/10 240 порядка. Понижает частоту дискретизации до 192 кГц. Полоса +-60 кГц. Вам столько вряд ли понадобится, но нам нужно для линеаризации усилителя.  Кстати сказать, этот модуль я на форуме выкладывал. Он имеет кучу параметров, поэтому я его применяю повсеместно, циферки только при инстанциировании меняю. Единственное что - он написан на SystemVerilog с использованием почти всех его новых-удобных фишек.  6) FIR дециматор /4 100-го порядка. Понижает частоту дискретизации до 48 кГц. Полоса +-20 кГц. Вам опять же вряд ли понадобится многоканальность, поэтому тоже так много ни к чему. 7) "Расканаливание" на 4 канала. 8) 4-хканальный FIR дециматор /5. 90-го порядка. Понижает частоту дискретизации до 9.6 кГц. 9) 4-хканальный FIR селектор до 128-го порядка. Вырезает нужную полосу. Дальше проц Blackfin забирает 32-битные данные каналов из ПЛИС, пропускает через АРУ (она сделана во float), и преобразует в fract_16. Чувствительность приёмника в итоге получилась на уровне ~100 нановольт. Передающий тракт в ПЛИС такой же, только наоборот. Ну, плюс авторегулировка мощности с линеаризацией на основе алгоритма NLMS. Как-то так.  ЗЫ: крайне рекомендую бросить VHDL и изучать SystemVerilog.
|
|
|
|
|
Oct 20 2015, 17:34
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(~Elrond~ @ Oct 20 2015, 18:58)  У нас в КВ-радиостанции используется 16-битная АЦП на тактовой 80 МГц. Написанный мной (к слову, вообще без применения всяких корегенераторов) в ПЛИС DDC имеет следующие ступени: 1) HPF(high-pass filter) - удаляет постоянку. На выходе 18 бит. 2) Генератор комплексной синусоиды на основе LUT+коррекция разложением в ряд Тейлора 1 порядка (теория подробно описана у xilinx). SFDR 112dB, выход 18 бит. CORDIC в этом месте не рекомендую, так как его конвейерная реализация для достижения аналогичного SFDR потребует примерно в 20 раз больше логических ячеек. Мой вариант на cyclone III занимает 180 ячеек, 3 умножителя 18х18 и один блок памяти. 3) Перенос на нулевую частоту. Результат комплексного умножения обрезается с 36 до 24 бит. 4) CIC 6 ступеней, понижает частоту дискретизации в 125 раз до 640 кГц. Вход 24-битный, выход 32. CIC изначально генерился из матлаба, потом я его переписал в виде красивого параметризованного модуля. Вся дальнейшая обработка только в 32-битной разрядности. 5) Полифазный FIR дециматор x3/10 240 порядка. Понижает частоту дискретизации до 192 кГц. Полоса +-60 кГц. Вам столько вряд ли понадобится, но нам нужно для линеаризации усилителя.  Кстати сказать, этот модуль я на форуме выкладывал. Он имеет кучу параметров, поэтому я его применяю повсеместно, циферки только при инстанциировании меняю. Единственное что - он написан на SystemVerilog с использованием почти всех его новых-удобных фишек.  6) FIR дециматор /4 100-го порядка. Понижает частоту дискретизации до 48 кГц. Полоса +-20 кГц. Вам опять же вряд ли понадобится многоканальность, поэтому тоже так много ни к чему. 7) "Расканаливание" на 4 канала. 8) 4-хканальный FIR дециматор /5. 90-го порядка. Понижает частоту дискретизации до 9.6 кГц. 9) 4-хканальный FIR селектор до 128-го порядка. Вырезает нужную полосу. Дальше проц Blackfin забирает 32-битные данные каналов из ПЛИС, пропускает через АРУ (она сделана во float), и преобразует в fract_16. Чувствительность приёмника в итоге получилась на уровне ~100 нановольт. Передающий тракт в ПЛИС такой же, только наоборот. Ну, плюс авторегулировка мощности с линеаризацией на основе алгоритма NLMS. Как-то так.  ЗЫ: крайне рекомендую бросить VHDL и изучать SystemVerilog. Я прошу прощения за вопросы, но мне интересно... 1. Нафига убирать DC на входе, если смеситель и так ее уберет? 2. По скольки точкам надо делать интерполяцию и какой степени, чтобы получить -118дБ SFDR ? Каков размер LUT? 3. Что делать с оставшимися 8ю битами в которых шум? (у меня в спектре сигнала, при наличии избыточных битов, появляется "забор", который смещает выход) 4. Что делать с 5ю битами в которых тоже непонатно какой шум? (125 раз это ~21дБ, значит реально вылезут только 3.5 информативных бита) 5. Что делать с 32я битами если: допустим что макс размах сигнала на входе АЦП 2.25В. тогда в полосе 500Гц будет -147дБм шума, а диапазон, ограниченный шумом тогда 147+11 = 158 дБ полного размаха. А это 26 бит. Если надо слушать голос, то полоса +- 3-4кГц, а это уменьшит диапазон на 14дБ до 142дБ, а это получится 23 бита. Кстати, если сначала отфильтровать по 4кГц, а потом накапливать (для CW я полагаю), то это даже лучше чем фильтр. 6-9. ... Спрашиваю, ибо у меня чудеса творятся... типа шума меньше, чем должно быть...
|
|
|
|
|
Oct 20 2015, 18:19
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(diwil @ Oct 20 2015, 20:34)  2. По скольки точкам надо делать интерполяцию и какой степени, чтобы получить -118дБ SFDR ? Каков размер LUT? Это наверное тот же алгоритм, которым я генерирую cos/sin (правда в DSP а не FPGA, но какая разница). Я использую первые три члена ряда, в итоге получается так: sin(X+x)=sin(X)+cos(X)*x-sin(X)*x*x/2=sin(X)+x*(cos(X)-x*sin(X)/2) cos(X+x)=cos(X)-sin(X)*x-cos(X)*x*x/2=cos(X)-x*(sin(X)+x*cos(X)/2) sin(X) и cos(X) это табличные значения, остальное думаю понятно. Если таблица на 256 значений, то макс. ошибку можно оценить так: Код (PI/256.0)^3 R(3) < ---------------- = 3.08E-7 3!
|
|
|
|
|
Oct 20 2015, 19:28
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(Шаманъ @ Oct 20 2015, 21:19)  Это наверное тот же алгоритм, которым я генерирую cos/sin (правда в DSP а не FPGA, но какая разница). Я использую первые три члена ряда, в итоге получается так: sin(X+x)=sin(X)+cos(X)*x-sin(X)*x*x/2=sin(X)+x*(cos(X)-x*sin(X)/2) cos(X+x)=cos(X)-sin(X)*x-cos(X)*x*x/2=cos(X)-x*(sin(X)+x*cos(X)/2) sin(X) и cos(X) это табличные значения, остальное думаю понятно. Если таблица на 256 значений, то макс. ошибку можно оценить так: Код (PI/256.0)^3 R(3) < ---------------- = 3.08E-7 3! эээ... насколько я понимаю в этом случае разрядность sin/cos должна быть сравнима с разрядностью X+x. т.е. если, скажем аккумулятор 28 бит, sin/cos должен быть тоже около того, чтобы был эффект. конвеерная реализация чой-то в голову тоже пока не лезет... в любом случае спасибо. буду пробовать.
|
|
|
|
|
Oct 20 2015, 19:28
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 20-04-12
Из: Нижний Новгород
Пользователь №: 71 488

|
ШаманъНет, таблица на 512 значений, и содержится в ней четверть круга [0..pi/2]. Остальные три четверти получаются путём нехитрых манипуляций с адресом и выходом, что даёт нам фактический размер в 2048 значений, то есть 11 бит от аккумулятора фазы. Ещё 18 бит используются для тейлоровской коррекции, три оставшихся игнорятся. Формулы следующие: sin(X+x) = sin(X) + (x * PHASE_UNIT * cos(X)); cos(X+x) = cos(X) - (x * PHASE_UNIT * sin(X)); где PHASE_UNIT = (2 * pi / 2^11) * (2^25); Здесь 11 - это разрядность X, а 25 - это расширение разрядности для того чтобы умножить fract18xfract18. diwilЦитата 1. Нафига убирать DC на входе, если смеситель и так ее уберет? У нас нет аналогового смесителя, сигнал на несущей частоте подаётся на АЦП. Цитата 2. По скольки точкам надо делать интерполяцию и какой степени, чтобы получить -118дБ SFDR ? Каков размер LUT? Написал выше. У меня 112 dB, но этого вполне достаточно. Очень просто конвейеризуется, всего 4 ступени. В дальнейших вопросы не понял, какие "лишние" биты вы имеете ввиду. У CIC-фильтра огромный коэффициент усиления, там на выходе, если его не обрезать, получается вообще 60+ бит.
|
|
|
|
|
Oct 20 2015, 19:38
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 20-04-12
Из: Нижний Новгород
Пользователь №: 71 488

|
Golikov A.Цитата Я ошибаюсь или разложения в ряд Тейлора предполагает точку в окрестности которой мы имеем разложение Точка определяется старшими битами аккумулятора фазы (в моём случае 11-ю). В таблице хранится четверть круга. А вторая таблица вам зачем, если суть метода как раз и заключается в уточнении табличных значений вычисленными членами ряда Тейлора?
|
|
|
|
|
Oct 20 2015, 19:58
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Точка определяется старшими битами аккумулятора фазы это понятно, но только ряд вблизи 0 и ряд вдали от 0 по разному выглядят, нельзя одинаковое действие совершать для разных точек. Если у вас нет 2 таблицы с разными коэффициентами перед Х то это либо не тейлоровское уточнение либо я чего-то не понимаю.... Цитата А вторая таблица вам зачем, если суть метода как раз и заключается в уточнении табличных значений вычисленными членами ряда Тейлора ну собственно я говорил не про ряд тейлора, стандартный табличный метод sin(x) = Table1(x); из таблицы выбирается точка по координате для 10 битного Х нужна таблица на 256 значений (четверть круга) теперь мы берем 16 битный x, 2 бита уйдут на определение четверти и остается 14 бит, так что получается нужна таблица на 16К ячеек, вместо этого можно сделать так заводим 2 таблицы по 256 значений. Оставшиеся 14 бит мы делим на 8 старших и 6 младших. по 8 старшим из таблицы выбираем к и b, собственно b - это наша первая таблица, а k - это коэффициент наклона между b(i) и b(i+1). И считаем sin(x) = Table1(XH) + Table2(XH)*XL/(2^6), естественно деление на 2 в 6 надо уже в таблице сохранить, чтобы надо было только умножить на XL. Что-то мне говорит что вы делаете тоже самое, только называете это тейлоровским уточнением%)
|
|
|
|
|
Oct 20 2015, 20:10
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(~Elrond~ @ Oct 20 2015, 22:28)  Шаманъ Нет, таблица на 512 значений, и содержится в ней четверть круга [0..pi/2]. Остальные три четверти получаются путём нехитрых манипуляций с адресом и выходом, что даёт нам фактический размер в 2048 значений, то есть 11 бит от аккумулятора фазы. Ещё 18 бит используются для тейлоровской коррекции, три оставшихся игнорятся. Формулы следующие: sin(X+x) = sin(X) + (x * PHASE_UNIT * cos(X)); cos(X+x) = cos(X) - (x * PHASE_UNIT * sin(X)); где PHASE_UNIT = (2 * pi / 2^11) * (2^25); Здесь 11 - это разрядность X, а 25 - это расширение разрядности для того чтобы умножить fract18xfract18. diwil У нас нет аналогового смесителя, сигнал на несущей частоте подаётся на АЦП.Написал выше. У меня 112 dB, но этого вполне достаточно. Очень просто конвейеризуется, всего 4 ступени. В дальнейших вопросы не понял, какие "лишние" биты вы имеете ввиду. У CIC-фильтра огромный коэффициент усиления, там на выходе, если его не обрезать, получается вообще 60+ бит. мне казалось, что перенос на нулевую частоту и есть смеситель... ... усиление это да... это хорошо... в любом случае спасибо. буду пробовать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|