Jump to content

    

porty

Свой
  • Content Count

    240
  • Joined

  • Last visited

Everything posted by porty


  1. стоп, вопрос был как из M_ADDR[17..0] : Output; M_DATA[15..0] : Output; M_TAG : Output; M_REQ : Output; M_ACK : Input; сделать одно имя и как это описать чтоб в сотнях местах не лепить и не наделать ошибки, и только в этом, давайте о TRI и CHETYRE поговорим в личке или другой ветке.
  2. Где то в самих исходниках альтеры видел что бидир внутри компонентов использовался. М.б. не сам бидир а TRI буфер нельзя использовать, т.к. Z состояние реально можно получить только драйверами пинов.
  3. Добрый день Имеется SubDesign например такой SubDesign t_Arbitr ( clock : Input; A_ADDR[17..0] : Input; A_DATA[15..0] : Input; A_TAG : Input; A_REQ : Input; A_ACK : Output; B_ADDR[17..0] : Input; B_DATA[15..0] : Input; B_TAG : Input; B_REQ : Input; B_ACK : Output; M_ADDR[17..0] : Output; M_DATA[15..0] : Output; M_TAG : Output; M_REQ : Output; M_ACK : Input; ) У которого A_xxxx и B_xxxx - соединяется с подчинёнными ведомыми арбитрами а M_xxxx с ведущим. Как это переписать на ADHL чтоб было только одно символьное имя? Т.е. типа: SubDesign t_Arbitr ( clock : Input; A_BIND[36..0] : BiDir; B_BIND[36..0] : BiDir; M_BIND[36..0] : BiDir; ) а внутри арбитра уже разделить на конкретные имена? Проблема в том что если сделать так как я описал то напрямую соеденить невозможно при попытке написать arbitr_master.a_bind = arbitr_slave.m_bind; жалуется на то что невозможно присвоить к порту вывода. Приходится извращаться: variable ... n[36..0]:node; ... begin ... n=arbitr_master.a_bind; n=arbitr_slave.m_bind; ... что читается плохо и можно наделать ошибок столько же сколько в исходном Как описать чтоб можно было сделать напрямую arbitr_master.a_bind = arbitr_slave.m_bind;
  4. 16 звеньев это 16 независимых по частоте и фазе каналов? Что такое звено?
  5. Не спорю что спорное. Только что на практике проверил, нормально, но естественно не работает если сигнал имеет постоянное смещение. Тут нужны фильтры ВЧ.
  6. Нужно было сделать так чтоб на моём осциллографе сигнал рисовался красиво а не дёргался как попало и в то же время отображался в режиме реального времении с макс. количеством кадров (до 25фпс) т.е. простой способ когда отрисовывают раз в секунду а остальное время картинка статична не катит никак. Рисовать постоянно не стирая а затухая градиентом цвета переходя от белого до чёрного тоже не катит - выходит сказачная каша. Оставался единственный способ - найти похожий сигнал чтоб был близко похож. Сделал так : 1. храним старую картинку, например в 1000 точек, 2. и получаем новые выборки, например 1000 новых выборок. 3. Но так как нужно искать подобие в каком то диапазоне а выводить нужно те же 1000 точек, то берём за новый диапазон побольше точек, например в 2 раза. т.е. 2000 точек. 3. Далее берём нулевое смещение и перемножаем выборки старого и нового между собой а потом их результат складываем: Старый0 * Новый0 + Старый1*Новый1 + Старый2 * Новый2 + ... + Старый999*Новый999 Это будет первый коэфициент подобия. 4. Вычисляем второй, просто сдвинув индекс нового на 1 Старый0 * Новый1 + Старый1*Новый2 + Старый2 * Новый3 + ... + Старый999*Новый1000 Это уже второй коэфициент подобия 5. Вычисляем остальные так же, просто сдвинув индекс нового на N Старый0 * Новый(0+N) + Старый1*Новый(1+N) + Старый2 * Новый(2+N) + ... + Старый999*Новый(999+N) Это уже N коэфициент подобия 6. Ищем в коэфициентах подобия максимальное значение. Их будет 1000 шт. 7. Максимум и будет самым похожим смещением, т.е. если например максимум 123, то максимально похожим будет подмассив в новом массиве из 2000 тысячь точек, под массив от 123 до 1123 будет максимально похожим. Его и рисуем как отстабилизированное изображение. И принимаем за максимально похожий Добавлено - если нужен максимально похожий но перевернутый относительно оси Х то нужно просто найти в массиве подобия не максимально большой а максимальной малый коэффициент.
  7. подобное делал: Стабилизация сигнала, т.е. новый кадр осцилограмы должен быть как можно более похожый на старый, чтоб синусойда или голос не бегал как попало, т.е. очень хорошая стабилизация и очень интеллектуальный триггер. Видео как оно работает: http://www.youtube.com/watch?v=Q5qWt__qzqY Сделано так: Количество выборок Count нового сигнала Новый сигнал New - он в 2 раза больше нового, чтоб найти похожесть в окне размером в 2*Count Старый сигнал Old это тот сигнал который был выведен на экран Массив похожестей Sum - размера нового сигнала; for j:=0 to Count-1 do for i:=0 to Count-1 do sum[j]=sum[j]+Old[i+j]*New; далее нужно найти макс значение в массиве sum[j]; - начиная с него и выводим на экран Т.е. максимум суммы произведений старого и нового сигнала. Вроде так. стабилизация делается в функции find_sync unit oscilogramm; interface uses windows, sysutils, math, extctrls, graphics, controls, classes; type tOSC_mode=(auto, normal, accumulate); tOSC=class(tobject) private bmp:tbitmap; paintbox:tpaintbox; data:array of smallint; old_data:array of smallint; cursor_x, cursor_y:integer; procedure SlowFFTPaintBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SlowFFTPaintBoxMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SlowFFTPaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); public line_color:tcolor; x_mult:integer; data_window:integer; mode:tOSC_mode; stop:boolean; constructor create(v_paintbox:tpaintbox; size:integer); destructor destroy;override; procedure add_data(v_data:psmallint; count:integer); procedure draw; end; implementation uses hsv2rgb; constructor tosc.create; begin inherited create; paintbox := v_paintbox; bmp := tbitmap.create; bmp.Width := paintbox.Width; bmp.Height := paintbox.Height; setlength(data, size); fillchar(data[0], length(data)*sizeof(data[0]), 0); setlength(old_data, size); x_mult := 1; line_color := rgb(0,255,0); data_window := length(data); mode := normal; paintbox.OnMouseDown:=Self.SlowFFTPaintBoxMouseDown; paintbox.OnMouseMove:=Self.SlowFFTPaintBoxMouseMove; // paintbox.OnMouseUp:=Self.SlowFFTPaintBoxMouseUp; end; destructor tosc.destroy; begin bmp.Free; bmp:=nil; setlength(data,0); inherited destroy; end; procedure tosc.add_data(v_data:psmallint; count:integer); begin if self=nil then exit; if length(data)=0 then exit; if stop then exit; count:=min(length(data), count); if count<length(data) then move(data[count], data[0], (length(data)-count)*sizeof(data[0])); move(v_data^, data[length(data)-count], count*sizeof(data[0])); end; procedure _inf(var v); begin end; //САМА ПРОЦЕДУРА СТАБИЛИЗАЦИИ!!! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< function find_sync(etalon, where_find:psmallint; count:integer):integer; //САМА ПРОЦЕДУРА СТАБИЛИЗАЦИИ!!! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< function array_mult(a,b:psmallint; count:integer):double; begin result:=0.0; while count>0 do begin result:=result+integer(a^)*integer(b^); inc(a); inc(B); dec(count); end; end; function array_max_pos(a:pdouble;count:integer):integer; var max_val:double; pos:integer; begin pos:=0; result:=0; max_val:=MinDouble; while count>0 do begin if a^>max_val then begin result:=pos; max_val:=a^; end; inc(a); inc(pos); dec(count); end; end; var results:array of double; k:integer; begin setlength(results, count); for k:=0 to count-1 do begin results[k]:=array_mult(etalon, where_find, count); dec(where_find); end; result:=array_max_pos(@(results[0]), count); setlength(results, 0); end; procedure tosc.draw; var maxx,maxy:integer; pos:integer; getx:integer; xadd:integer; scale:double; midle:integer; function gety:integer; begin gety:=0; getx:=getx+xadd; if pos<0 then exit; if pos>=length(data) then exit; gety:=round(midle-scale*data[pos]); inc(pos); end; var k,r,g,b:integer; s:string; line_cnt:integer; line_pos:integer; color_cnt:integer; color_pos:integer; begin if self=nil then exit; if length(data)=0 then exit; if paintbox=nil then exit; maxx := paintbox.Width; maxy := paintbox.Height; pos := 0; xadd := min(maxx, max(1, x_mult)); getx := -xadd; midle := maxy div 2; scale := (1/(1 shl (8*sizeof(data[0])-1)))*midle*((midle-2)/midle); bmp.Canvas.Brush.Color := rgb(0,0,0); bmp.Canvas.Brush.Style := bsSolid; bmp.Canvas.Pen.Color := rgb(0,0,0); bmp.Canvas.Pen.Style := psSolid; bmp.Canvas.Rectangle(-1, -1, maxx+1, maxy+1); bmp.Canvas.Pen.Color:=rgb(64,64,64); bmp.Canvas.Pen.Style:=psSolid; bmp.Canvas.MoveTo(0, midle); bmp.Canvas.LineTo(maxx, midle); bmp.Canvas.Pen.Color:=rgb(50, 50, 100); bmp.Canvas.Pen.Style:=psSolid; bmp.Canvas.Font.Name:='Courier New'; bmp.Canvas.Font.Size:=12; bmp.Canvas.Font.color:=rgb(128,128,128); bmp.Canvas.MoveTo(0, cursor_y); bmp.Canvas.LineTo(maxx, cursor_y); bmp.Canvas.MoveTo(cursor_x, 0); bmp.Canvas.LineTo(cursor_x, maxy); s:=''; if mode=Normal then s:=s+'Stab'; if mode=Auto then s:=s+'Free'; if mode=accumulate then s:=s+'Summ'; s:=s+' '; bmp.Canvas.TextOut(maxx-bmp.Canvas.TextWidth(s),0, s); s:=' '+inttostr(cursor_x)+':'+inttostr(round((midle-cursor_y)/scale)); if cursor_x<>-1 then bmp.Canvas.TextOut(0, 0, s); if (mode=normal) or (mode=Auto) then begin pos := max(0, length(data)-1-(maxx div xadd)); if mode=normal then begin pos := pos - find_sync(@old_data[0], @data[pos], (maxx div xadd)+1); if pos<0 then pos:=0; for k:=0 to maxx div xadd do old_data[k]:=round(old_data[k]*0.9+0.1*data[pos+k]); //move(data[pos], old_data[0], (maxx div xadd)+1); end; bmp.Canvas.MoveTo(0, midle); bmp.Canvas.Pen.Color:=line_color; bmp.Canvas.Pen.Style:=psSolid; bmp.Canvas.MoveTo(getx, gety); while getx<=maxx do bmp.Canvas.LineTo(getx, gety); end; if mode=accumulate then begin line_cnt := maxx div xadd; color_cnt := length(data) div line_cnt; for color_pos:=0 to color_cnt-1 do begin { if mode=spectr then HSVToRGB(1-color_pos/color_cnt, 1, round(255*(color_pos/color_cnt)), r, g, B) else} begin r:=round(256*(color_pos/color_cnt)); b:=r; g:=r; end; bmp.Canvas.MoveTo(0, midle); bmp.Canvas.Pen.Color:=rgb(r,g,B); bmp.Canvas.Pen.Style:=psSolid; pos:=line_cnt*color_pos; bmp.Canvas.MoveTo(0, gety); for line_pos:=1 to line_cnt-1 do bmp.Canvas.LineTo(line_pos*xadd, gety); end; end; paintbox.Canvas.Draw(0,0, bmp); end; procedure tosc.SlowFFTPaintBoxMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin cursor_x:=-1; cursor_y:=-1; end; procedure tosc.SlowFFTPaintBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ssmiddle in Shift then stop:=not stop; if not (ssright in Shift) then exit; if mode=normal then mode:=auto else if mode=auto then mode:=accumulate else if mode=accumulate then mode:=normal; end; procedure tosc.SlowFFTPaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ssleft in Shift then begin cursor_x:=x; cursor_y:=y; end else begin cursor_x:=-1; cursor_y:=-1; end; end; end.
  8. алгоритмом ньютона я вписался в 200 ячеек на каждый индивидуальный канал + 200 ячеек на мультиплексор с умножителем из 8 дсп блоков на 4 канала, итого на 18 каналов вышло 4 916 ячеек и 36 умножителей. Точность каждого канала -130дб, THD - 0.0001% Кордик изначально пробовал в NCO - изначально он мне не понравился из за размеров потребляемых ресурсов
  9. Добрый день Начальство запросило информацию о знаке СЕ и сертификации в евпропе на компоненты тех изделий что делаем. Смотрел даташиты, ничего подобного не нашел, на сайтах производителей тоже. 1. Ставится ли на компоненты (от резисторов и проводов до GSM модулей и RF сборок) знак СЕ и проходят ли они сертификацию в европе на знак СЕ? 2. Как найти эту информацию в даташитах или у производителей? (Дилеры и поставщики компонентов пока либо не дали ответ либо сами не знают). 3. Если этого нет то где об этом явно написано чтоб показать и доказать что компоненты не проходят сертификацию СЕ?
  10. Да, это FFT себя так ведёт когда разница фаз синусоиды относительно окна FFT почти совпадает с разницей в 2 герца, отсюда и колебания по частоте. Повезло значит =) Когда писал компонент для ФФТ не парился и взял готовые генераторы и окна с готовыми примерами которые были вылезаны и отшлифованы так чтоб при параметрах в примере было всё ну идеальнее некуда.
  11. 1. Нормально вышло. Точность достаточная для наших практических целей. Хоть и реально меньше, но соответствует 16 разрядам. 2. Частота задаётся статически не правильно, но я с этим разобрался, был формат Q16.16 на предыдущее значение синуса и Q16.16 на коэффициент умножения, сделал коэффициент в Q1.31 стало гораздо точнее. Но частота по времени плавает чуток - на доли герца, примерно плавает на 0.5Гц с периодом в 0.5-1 секунду при 12345.567Гц требуемой на 192кГц дискретизации. Но это уже не критично, просил для саморазвития. Просто, интересно стало почему плавает. =) NСО не приемлем из за большого потребления ресурсов (по памяти не влезло). Всё-таки нужно 18 каналов сделать с разными частотами и фазами каждый. На канал 15-25кбит требуется, в 200кбитный Циклон никак не влазило.
  12. Спасибо, эта штука заработала, и как я только умудрился забыть то что сдавал давным давно в универе когда только пришли комплекты "Умка" на базе КР580, я тогда с преподом наспор за зачот сделал расчёт таблицы синусов по этой итерационной формуле ньютона если не ошибаюсь с названием. Штука заработала но я не осилил расчёт погрешностей статических и динамических в итоге чуток частота плавает и не точно задаётся, например задал pi*200 = 628.318531Hz, а вышла pi*203=637.743309Hz в арифметике с фикс. запятой 16/16. 16 бит на числа после запятой по идее должно хватить, странно что частота не точно выставлена оказалось, умножитель 64 битный, округляю правильно по правилам арифметики округления.
  13. получить можно, и я ошибся - нужны любые фиксированные частоты так чтоб выборки как можно дольше не повторялись. Смысл отладки такой таблицей в том что если в каналах связи потеряется пакет любой длинны в любом положении фазы, то ФФТ на это среагировало и резко подпрыгнули боковые лепестки или выскочили побочные гармоники и прочие артифакты (выше 100дб) и была возможность продетектировать это. Если сигнал берётся из таблицы темболее степени двойки то большой шанс того что период целиком выпадет и на ФФТ это не продетектируется.
  14. Спасибо, я это всё понимаю, но мне нужно 18 каналов, т.е. 18 генераторов с определёнными фиксированными характеристиками и высокой точностью, но к сожалению у меня вышел низкоточный т.к. мало точек и линейная интерполяция между ними. Либо высокоточный но не влазит ни по количеству ячеек ни по памяти т.к. нужно место для основного алгоритма. Я хочу найти готовый т.к. не хочу тратить время, и не вижу сысла вести исследования ради отладочной функции (с тем же успехом можно наделать пилу но с помощью её ряд ошибок в каналах данных и мультиплексорах не проверишь), в добавок мне не требуется мегаскорость. Достаточно 100кГц за глаза. Мне интересно как это сделать и как получить быстро результат не потратив кучу времени на изучение интерполяций и способов и разрабатывая самому генератор его ещё нужно проверять и тд. Интереснее готовый или из минимального числа готовых блоков. Как впихнуть в 7.5к бит памяти и 9к ячеек 18 более менее точных 16 битных генераторов выборок синусов затратив максимум неделю, вот в чём вопрос.
  15. Мне нужно получить внутри ПЛИС цифровые отсчёты якобы полученые из АЦП для отладки. Т.е. генератор данных который бы заменил АЦП и качество работы которого не вызывало бы сомнений. Это нужно чтоб проверить надёжность всей системы сбора данных в целом.
  16. Добрый день Для проверки 18 ультразвуковых трактов нужен любой точный (побочные гармоники не более -110дб) генератор отсчётов синусов произвольной частоты внутри ПЛИС с периодом не кратным целому числу и степени двойки. Поэтому заранее рассчитанная таблица в памяти не пригодна. Частота дискретизации от 100кГц до 500кГц. Как проще сделать? Теорию прямого цифрового синтеза я знаю, и примерно представляю как реализовать, но вряд ли я сделаю чистый синус сразу затратив минимум времени и хотелось бы сразу получить результат т.к. это нужно исключительно для отладки (Подставить вместо АЦП в качестве источника сигнала). ПЛИС - Аltera Cyclon II 20k Разрядность 16 бит целые. Частота дискр. от 100 до 500кГц. Какие есть готовые решения для создания такого генератора? Или как самому быстро накидать достаточно точный генератор? Есть готовые компоненты в Квартусе для генерации синуса или реализующую функцию синуса? Заранее спасибо.
  17. какие частоты? плис? память? Если меньше 10мгц и современная плис то скорее всего проблемы с организацией, скорее всего банальная описка или ляп в исходниках. Или асинхронный дизайн явно или не явно. Данные откуда берутся и управляющие сигналы? из вне или внутри? Они защёлкиваются по тактовой или нет?
  18. АЦП в LPC1768

    насчёт стабильности у LPC1768 проблемы не только с АЦП а вообще с любым внешним интерфейсом, как оказалось что захват значения таймера по фронту сигнала очень сильно глючит если этот фронт имеет время нарастания/спада более 1нс и тд. А так же с SPI - выхода SPI имеют время нарастания и спада от 5 до 10нс что очень плохо для FPGA без входов шмитта ибо у них быстродействие сотни МГц и приводит к ложному клоку во время перехода в области неопределённого состояния. Тут сам чип весьма неудачный. но если нужно дёшево то в принципе фильтрами обвешать реально возможно и всё будет стабильно работать.
  19. АЦП в LPC1768

    опыт показал что это ошибка внутреннего устройства контроллера, где то результат либо не защелкивается либо мультипликсируется как попало. Но если подшаманить настройками никак не влияющими на ADC, например скоростью SPI то можно получить гарантированную работоспособность ADC на разных кристаллах в разных условиях с полным циклом испытаний (климатика, е-м совместимость и тд). Как побобрать - мы подбирали наугад. Просто брали например настройки делителя SPI и повышали или понижали скорость благо запас был. При этом всё стабильно работало, как бы не дорабатывай программу алгоритмически не изменяя скорости работы переферии и частот. Так же можно было изменять режимы работы ADC и разные периоды оцифровки.
  20. Спасибо, но Если самим присваивать, то на каких основаниях? нам не сам знак нужен, а соответствие стандартам и соответствующие документы для диллеров в Европе (без них они отказываются брать продукцию), поэтому и необходимо узнать как минимум к какой директиве он относится, и на основании какого документа мы можем присвоить знак СЕ?
  21. Добрый день Необходимо получить "Сертификат соответствия с нормами, стандартами и директивами ЕвроСоюза" так называемый СЕ значок. У нас очень простое устройство - USB ключ, без внешнего питания, напряжений выше 5 вольт нет. Пытались провести через спец фирмы, судя по документам и тем директивам что они выбрали, у них напрочь отсутствует понимание того что нам необходимо. Начиная с того что они скидывают документы касающиеся розеток питания 220-250В и разветвителей, заканчивая директивами относящимися скорее к микроволновкам судя по мощности излучения (сотни ватт, киловатты). Либо просто вываливают гору стандартов, многие из них рассчитаны на питание от 220 и высокую мощность. Как самим получить данный сертификат? Какие документы и директивы выбрать для нашего изделия: усб ключ, 5В макс напряжение, частот выше 100Мгц нет (сам измерял, гармоники тактовой 16Мгц, до 50-100мгц доходят уже на пределе измерений)? Что проверяют для этой сертификации чтоб провести убедиться что наше устройство соответствует? Какую фирму можете посоветовать или как проверить те что есть? Какой минимум они должны сделать и какие документы они нам должны предоставить? Вообще как это должно проходить в целом не понятно.
  22. в том то и дело что нужно на пределе, или делать для одного-двух голосовых каналов одну архитектуру а для 8 каналов другую что не интересно. Пробовал в делфи, реально треск после медианного и оверсемплинга уменьшается раза в 2-3 на слух по сравнению когда нет оверсемплинга и даунсемплинга , но частотка не портится т.к. оверсемплинг, но появляется мелкий джитинг (на ффт выглядит как амплитудная модуляция - рядом с палкой частоты вылазит ещё две на -40 ... -50дб), и то только на FFT в 128-256тыщь точек виден, но на слух не слышен так что на него пофиг.
  23. отлично, просто велликолепно удаляются шумы и устраняются проблемы фазового дребезга, для варианта в 32кГц очень даже норм, но не для 100+кГц, там уже некуда оверсемплинг разгонять, а если разгонять АЦП сверх рекомендаций то вылазят такие помехи и шумы что ничем не поможеш
  24. нет, я не использую ДМА, я не использую ADGDR, я не использую Burst mode
  25. в этом документе описывается процедура минимизации шума, и мало сказано про глитч только про его возможность при подключенном программаторе. Медианный фильтр не помогает. да он почти полностью удаляет все иголки, но приводит к сильному фазовому биению (джиттинг в плюс минус несколько семплов) и уменьшает частотку и изменяет звук значительно (становиться жутко глухим будто звук играют динамики сотика заглушоного подушкой). Фильтры ренджирования, гауса и прочие тоже не особо помогают. Битые выборки АЦП это фактически потерянные данные и не один фильтр их не додумает даже приблизительно правильно. Нужны все восемь каналов на максимальной скорости АЦП по даташиту, т.е. 190кило семплов в сек. да одиночные, в лучшем случае одна выборка раз 1000 выборок во всём диапазоне АЦП, в худшем каждая десятая выборка рандомом