Перейти к содержанию
    

dorian-kv

Участник
  • Постов

    31
  • Зарегистрирован

  • Посещение

Весь контент dorian-kv


  1. еще раз спасибо за наводку на чипскоп, до этого никогда как то не пользовался, даже не задумывался об этом инструменте... косяк в программе нашел. но возник вопрос по самому чипскопу - а по какому принципу он выводит список контактов для установки тригеров? почему то в этом списке присутствуют не все связи между блоками и модулями...некоторых сигналов я не нашел, хотя было интересно посмотреть
  2. проблема в следующем - система состоит из несколько плат, одна отвечает за сбор информации от остальных и передачи ее на пк, остальные занимаются сбором, фильтрацией и прочим. написана программа по обмену данными по 485 интерфейсу, сейчас в тестовом режиме - она просто с периодичностью шлет пакеты по 5к байт. модуль рабочий т.к. был проверен на первой плате - на компьютер пакеты доходили без потерь и пропусков. проблемы возникли при заливки этой программы в плис(используется спартан 6) на одной из оконечных плат для приема их первой платой. суть проблемы в том что при включении данной платы пакеты информации в большинстве случаев вообще не появляются на данном выводе плис, изредка - на 8-14 включений она начинает штатно работать. в начале я думал что возможно проблема в плисине, но в заливаемой программе параллельно работает модуль по приему данных с ацп, фильтрации и заливки их в цап(для отладки обработки информации в тестовом режиме вывод сделан) - так вот он функционирует всегда. было предположение что что-то с выводами, для эксперимента на вывод по которому должны идти пакеты я вывел клоки идущие на цап, а данные вывел соответственно на вывод клоков(в файле ucf поменял местами номера пинов) - клоки стабильно шли при каждом включении, а вот на выводе клоков блоки данных так же появлялись раз в 8-15 включений. я долго опять выверял модуль обмена и снова его уже в месте с модулем фильтрации зашил в плис на приемной плате - там все работает как часы. тогда ради интереса зашил всю программу в плис указав в качестве выводом для данных произвольный пин - произошло чудо - на том пине данные идут при каждом включении. в чем может быть проблема? может ли как-то влиять расположение программы в самой плис? просто получается что на 46 выводе данные идут раз в 8-15 включений, но клоки идут стабильно(когда я их туда ставлю), на 1-ом пине(где клоки на цап идут штатно) - данные тоже идут раз в 8-15 включений, а на 142 пине, если я задаю его выходом для данных - они идут стабильно при каждом включении. при этом все варнинги при компиляции относятся исключительно к модулю работающему с ацп и цап. аппаратную часть платы перепроверил - все питания есть, запитка портов есть, при этом на второй плисине не этой плате - программа стабильно идет на штатных пинах... может кто подскажет хотя бы в каком направлении копать?
  3. здравствуйте, чтобы не создавать новой темы, спрошу тут- не подскажете есть ли отечественные цап с двуполярным выходом,типа DAC8420?
  4. вообщем попытка реализовать Герцеля не очень удалась, но причину пока найти не могу. расчет, в том числе и целочисленный в экселе дает нужный результат, но тут получается ерунда... entity gertsel is Port ( reset : in STD_LOGIC; clk : in STD_LOGIC; x : in STD_LOGIC_VECTOR (9 downto 0); en : in STD_LOGIC; y : out STD_LOGIC_VECTOR (9 downto 0)); end gertsel; architecture arc_gertsel of gertsel is constant coeff0:signed(10 downto 0):=to_signed(485,11);--integer range 0 to 1024; signal n: integer range 0 to 35; signal q0:signed(10 downto 0);--integer range 0 to 2048; signal q1:signed(10 downto 0);--integer range 0 to 2048; signal q2:signed(10 downto 0);--integer range 0 to 2048; signal input:signed(9 downto 0);--integer range 0 to 1024; signal output:signed(9 downto 0);--integer range 0 to 1024; signal mul1: signed(26 downto 0); signal mul2: signed(31 downto 0); signal mul3: signed(31 downto 0); signal mul4: signed(42 downto 0); signal sum1: signed(42 downto 0); begin process(clk) begin if(rising_edge(clk)) then if(reset='1') then n<=0; --q0<=0; --q1<=0; --q2<=0; --coeff0<=879; --output<=0; q0<=(others=>'0'); q1<=(others=>'0'); q2<=(others=>'0'); mul1<=(others=>'0'); mul2<=(others=>'0'); mul3<=(others=>'0'); mul4<=(others=>'0'); sum1<=(others=>'0'); input<=(others=>'0'); output<=(others=>'0'); else --******************************** if(en='1' and clk='1') then input<=signed(x);--to_INTEGER(unsigned(x(9 downto 0))); --input<=input-to_signed(511,10); n<=n+1; q2<=q1; q1<=q0; end if; mul1<=(coeff0*q1)/1024; q0<=mul1(9 downto 0)+input-511-q2; if(n=36 ) then n<=n+1; mul2<=q1*q1/1024; mul3<=q2*q2/1024; mul4<=coeff0*q1*q1/1024; sum1<=(mul2+mul3-mul4); output(9 downto 0)<=sum1(9 downto 0); y<=std_logic_vector(output); end if; if(n=37) then q1<=(others=>'0'); q2<=(others=>'0'); end if; --******************************** end if; end if; end process; end arc_gertsel;
  5. в данный момент я опрашиваю АЦП с частотой 10 МГц, в корке фильтра дискретизацию задаю 10 МГц, а частоту тактирования 100МГц, временных ограничений не прописывал.
  6. о переносе частоты мысли были, но пока не пробовал реализовать. а вот что значит правильно? я старался подбирать частоты чтобы не были кратными, нижнюю частоту выбирал исходя из того чтобы в длину единичной информационной посылки влезло 5-6 периодов. а вот в ноль я не скидываю, как то об этом не задумывался а на счет переполнения не совсем понял, сигнал на входе АЦП по амплитуде не изменяется от того сколько каналов. я рассчитал таблички для периода синусоиды на каждой частоте, но с одинаковым шагом, и на цап подаю суммарный код деленный на кол-во присутствующих каналов. - этот расчет проверен и в матлабе и в экселе и на осциллографе.
  7. Эм, особого алгоритма в моем варианте и нет, просто на каждый канал по FIR-фильтру с децимацией(иначе не влезают). но в симулинке моделировал - на фильтрах с флоатами работало, на фиксированной точке из-за небольшой путаницы с отведением под целую часть и дробную не все работало, точнее местами отдельные фильтры показывали картинку хуже, нежели в железе(честно я не профи в симулинке) я использую FIR с децимацией. в принципе частотное разделение каналов вообще в данный момент у меня есть мысли про использование FFT, а в частности алгоритм Герцеля читаю, но не уверен что будет успевать, да и хватит ли 90 точек
  8. здравствуйте. у меня даже скорее не вопрос, а поиск совета. вообщем есть два спартана 6xls9, цап и ацп. основная задумка сделать линию с 8-10 каналами на разных частотах(это основная мысль, есть запасной вариант с двумя частотами). длительность бита 10 мкс, полоса фильтра взята 90 КГц+30КГц на спад, коэффициенты считались с помощью матлаба, а затем грузились в корку. использую децимацию т.к. иначе не влезают фильтры. частота дискретизации 10 Мгц. частота нижнего канала 450 КГц и далее с шагом 240КГц. частота ПЛИС 100Мгц так вот, когда в линии связи присутствует 4-5 частот - фильтры выделяют их нормально, а вот когда частот становится больше 7 и начинаются проблемы - частоты каналов выделяются раз на несколько посылок, а то и вовсе не выделяются. вот и отсюда возник вопрос - реально ли тут добиться результата - не меняя ПЛИС и тп. а если возможно то, может выбранное мной направление решения тупиковое, и есть более интересные варианты? хотя бы направление поиска решения задать. спасибо
  9. уважаемые профи не подскажете по следующему вопросу: есть фильтр полученный из fir compilera с использованием матлабовского СОЕ, работает хорошо по нему самому вопросов нет. но если смотреть временную диаграмму в ISim то ориентируясь по выводам фильтра rfd и rdy - один отвечает за начало приема отсчета x(n), второй за вывод y(n) - соответственно время между этими двумя импульсами - время расчета фильтра. соответственно в интервал между двумя отсчетами спокойно помещаются где то четыре таких интервала, а если частоту дискретизации фильтра уменьшить то может и пятый влезть. так вот вопрос можно ли на одном ядре реализовать четыре фильтра с заменой набора коэффициентов?(сами фильтры по кол-ву коэффициентов одинаковые) вообще мне кажется что такое возможно, только вот как тогда на каждый фильтр СОЕ файл грузить? можно конечно все коэффициенты загрузить копированием в один файл, но вот как разделять фильтры на выходе? сформулировал вопрос конечно коряво, но все же.
  10. нашел косяк...я все изменения производил с размерностями входных и выходных слов, а размерности аккумулятора и пр не учитывал...симулинк показал хорошие графики... но в плисине пока не заработало, хотя хоть и генерации нет, только простые тычки редкие
  11. а куда больше?у меня получается длина слова - 10 бит, а на дробную часть отведено уже 16 - и тогда появляется ослабленный полезный сигнал 1.111111111111111 _._____1111111111 - получается я использую число такого вида (fix10_16), а не (fix10_9 скажем): 1.111111111______ Но если скажем симулинк в этом смысле особо не ограничивает, в fir compilere в параметрах ставится диапазон не больше чем заданное слово на входе, если 10 бит как у меня, то соответственно после точки максимум 10 бит...(хотя могу ошибаться, но кажись так) а кстати русскоязычные статьи-описания по logicore есть?
  12. спасибо за советы, Active_hdl оказалась интересной средой, но проблему не решила...в принципе что в железе на осциллографе, что в симулинке, что в симуляции в ise все равно генерация...кстати fir compiler из logicore такой же результат дал... где то я туплю...но вот в fdatool получается что на выходе фильтра получается отфильтрованная частота только когда я ставлю параметр fraction length больше чем кол-во бит для входа и выхода (т.е. на вход и выход у меня 10 бит, а fraction length в районе 16...но сигнал очень низкоамплитудный, а вот fir compiler ограничивает диапазон аналогичного параметра значением входного слова, но в симулинке в данном диапазоне я не получаю полезного сигнала. кстати параметры fixed point мне наглядно объяснила табличка в даташите на fir compiler)
  13. точнее именно определение кол-ва бит интересует, точнее методика. но возможно причина в : я использую AD9201, у него выход параллельный 10-ти битный или я все же что-то не досмотрел в даташите?! частота дискретизации взята 3 МГц. меня пока что интересует только одиночный фильтр, точнее его реализация в железке, чтобы сократить расстояние отделяющее от теории до практики в ПЛИС. в Матлабе проигрывал - все устраивало, а вот RTL-симуляцию не пробовал. она подразумевает симуляцию в iSim? фильтра и типового сигнала?
  14. здравствуйте. раньше не занимался фильтрацией на плис,поэтому столкнулся с проблемой при реализации полосового фильтра на xilinx. реализую пф с полосой 100кгц на частоте 450кгц. ацп и цап 10-разрядные. в fdatool использую следующие настройки fixed point: коэфф. использую 16-ти разрядные, вход и выход 10-разрядные,а вот величина fraction length вызвала некоторые вопросы, я не могу понять исходя из чего она выбирается... при синтезе нескольких вариантов я на выходе цап получаю или 0 вне зависимости от того что на входе ацп,или просто какую то генерацию импульсов не зависимо от входа(как предполагаю от переполнения...). правильность работы с ацп и цап проверял соединив их в плис на прямую. поэтому возникли два вопроса: 1.как правильно выбирать разрядность fixed point 2.данные ацп прежде чем подавать на фильтр надо преобразовывать?
  15. вопрос,а как у него с потреблением?какой ток?
  16. а может дело в флагах которые ставит дма,а я не сбрасываю?
  17. в каком смысле перестраивается? я с битом разобрался, он стал ставится когда я отдельно начал слать команду на разрешение записи: buffSPI_Tx[0]=WREN; SPI_FLASH_CS_LOW(); TX_DMA_SPI(); SPI_FLASH_CS_HIGH(); а тут уже запрос на регистр статуса аналогично buffSPI_Tx[0]=код команды запроса; DMA2_Channel1->CNDTR = 3; DMA2_Channel2->CNDTR = 3; SPI_FLASH_CS_LOW(); TX_DMA_SPI(); SPI_FLASH_CS_HIGH(); и в ответ получаю заветную 0х02 - как раз 1-ка в том бите но потом: buffSPI_Tx[0]=WRITE; buffSPI_Tx[1]=0x00; buffSPI_Tx[2]=0x00; buffSPI_Tx[3]=0x00; DMA2_Channel1->CNDTR = 256; DMA2_Channel2->CNDTR = 256; SPI_FLASH_CS_LOW(); TX_DMA_SPI(); SPI_FLASH_CS_HIGH(); и записи нет(((( на осциллографе всю передачу вижу
  18. про команду я знаю и сейчас уже локализовался - по dma эта команда не идет...не ставится бит...и не могу понять почему.в даташите про времена ничего не сказано,а подаю ее так же как и просто через spi писал. по обычным функциям стандартной библиотеки spi все пишется
  19. я нули шлю,при чтении нужно тактирование делать,нулями и делаю. массив buffSPI_Tx у меня нулевой,только в его нулевой элемент записываю команду на чтение READ,а три следующие адрес,в данном случае нулевой.далее указываю буффер приема и передачи и включаю два канала... по завершению передачи в buffSPI_Rx я имею страницу считанную из флеша(за исключением последних 4 байт,но это мелочь,буффер увеличить на 4 и всю страницу получу или както по другому-это не важно)-это все работает!проблема с записью...чую где то глупый косяк,да опыта мало еще с 32-х разрядными
  20. я провожу очистку сектора.но тут дело даже не в защитных битах-запись просто через spi проходит нормально,и чтение этой записи через dma успешное,массивы совпадают,а вот запись через dma-нет...
  21. задам вопрос по другому! вот написан модуль у меня общения с DMA (инициализацию не привожу) { for(int k=0;k<255;k++) { data[k]=k; buffSPI_Tx[k]=k; buffSPI_Rx[k]=0; buff[k]=0; } init_DMA_SPI(); //начало записи buffSPI_Tx[0]=WREN; buffSPI_Tx[1]=WRITE; buffSPI_Tx[2]=0x00; buffSPI_Tx[3]=0x00; buffSPI_Tx[4]=0x00; SPI_FLASH_CS_LOW(); TX_DMA_SPI(); SPI_FLASH_CS_HIGH(); //конец записи //начало чтения buffSPI_Tx[0]=READ; buffSPI_Tx[1]=0x00; buffSPI_Tx[2]=0x00; buffSPI_Tx[3]=0x00; DMA2_Channel1->CNDTR = 256; DMA2_Channel2->CNDTR = 256; SPI_FLASH_CS_LOW(); TX_DMA_SPI(); SPI_FLASH_CS_HIGH(); //конец чтения buffSPI_Rx[3]=0x00; //контрольный buff[0]=0; // } а теперь функция: void TX_DMA_SPI(void) { DMA_Cmd(DMA2_Channel2,ENABLE); DMA_Cmd(DMA2_Channel1,ENABLE); while(!DMA_GetFlagStatus(DMA2_FLAG_TC2)); DMA_ClearITPendingBit(DMA2_IT_TC2); //DMA_ClearITPendingBit(DMA2_IT_TC1|DMA2_IT_GL1|DMA2_IT_HT1); DMA_Cmd(DMA2_Channel2,DISABLE); DMA_Cmd(DMA2_Channel1,DISABLE); } дело все в том что в таком виде в память ничего не пишется...читаю только 0xFF... а если вместо функции записи через ДМА я ставлю просто функцию записи через SPI, а читаю через DMA - все работает
  22. снова вопрос:а может флешка не успеть сохранить? дело в том что запись через dma не происходит...на осциллографе вижу всю посылку,а считываю ff в тоже время если просто через spi пишу,а считываю через dma-все нормально...
  23. осциллографом на шинах miso или mosi и clk.я через sw отладчик отдель запускаю цикл записи сектора,потом остановка и цикл чтения. паузы при чтении вижу,наравне с размером страницы,даже чуть больше.а между самими байтами тоже. я сейчас через дма начал делать,посмотрим что будет. спасибо за наведение на путь и разъяснение))узнал кое-что.
  24. спасибо за разъяснение но маленькое уточнение, не совсем понял просто или не совсем ясно сформулировал свой вопрос: у меня в контроллере SPI подключен к шине APB1, у которой частота 36МГц, предделитель стоит 2, т.е. на SPI используется 18 время на запись всего сектора (256 страниц по 256 байт) занимает около 500мс по старому осциллографу точнее измерить не сумел, но с даташитом сходится - там написано что время записи одной страницы от 1,4 до 5 мс(от 359 мс до 1,28 с) но время чтения получается таким же практически, ну может чуть меньше...хотя по логике при 18 МГц я должен читать за 30-40 мс (если частоту тактирования брать 18МГц) единственное в начале грешил на слишком большое кол-во вызовов разных функция в цикле приема - ограничился написал по возможности одну функцию с прямым обращениям к регистру чтения и регистру флагов, но время не поменялось.. <-вот это верно?т.е. как бы само уточнение вот. почему то кажется что ДМА тоже выигрыша не даст я прав? ммм...я эту таблицу смотрел не раз, но там же указано что 3 байта адреса и 0 байт Dumme bytes или я не так ее трактую?
×
×
  • Создать...