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

dorian-kv

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

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

  • Посещение

Сообщения, опубликованные dorian-kv


  1. ИМХО где то виснет конечный автомат из-за асинхронных входов 96%. ищется элементарно чипскопом.

     

    еще раз спасибо за наводку на чипскоп, до этого никогда как то не пользовался, даже не задумывался об этом инструменте...

    косяк в программе нашел.

    но возник вопрос по самому чипскопу - а по какому принципу он выводит список контактов для установки тригеров? почему то в этом списке присутствуют не все связи между блоками и модулями...некоторых сигналов я не нашел, хотя было интересно посмотреть

  2. ИМХО где то виснет конечный автомат из-за асинхронных входов 96%. ищется элементарно чипскопом.

     

    спасибо, попробую.

  3. проблема в следующем - система состоит из несколько плат, одна отвечает за сбор информации от остальных и передачи ее на пк, остальные занимаются сбором, фильтрацией и прочим. написана программа по обмену данными по 485 интерфейсу, сейчас в тестовом режиме - она просто с периодичностью шлет пакеты по 5к байт. модуль рабочий т.к. был проверен на первой плате - на компьютер пакеты доходили без потерь и пропусков. проблемы возникли при заливки этой программы в плис(используется спартан 6) на одной из оконечных плат для приема их первой платой.

    суть проблемы в том что при включении данной платы пакеты информации в большинстве случаев вообще не появляются на данном выводе плис, изредка - на 8-14 включений она начинает штатно работать.

    в начале я думал что возможно проблема в плисине, но в заливаемой программе параллельно работает модуль по приему данных с ацп, фильтрации и заливки их в цап(для отладки обработки информации в тестовом режиме вывод сделан) - так вот он функционирует всегда.

     

    было предположение что что-то с выводами, для эксперимента на вывод по которому должны идти пакеты я вывел клоки идущие на цап, а данные вывел соответственно на вывод клоков(в файле ucf поменял местами номера пинов) - клоки стабильно шли при каждом включении, а вот на выводе клоков блоки данных так же появлялись раз в 8-15 включений.

    я долго опять выверял модуль обмена и снова его уже в месте с модулем фильтрации зашил в плис на приемной плате - там все работает как часы. тогда ради интереса зашил всю программу в плис указав в качестве выводом для данных произвольный пин - произошло чудо - на том пине данные идут при каждом включении.

     

     

    в чем может быть проблема? может ли как-то влиять расположение программы в самой плис? просто получается что на 46 выводе данные идут раз в 8-15 включений, но клоки идут стабильно(когда я их туда ставлю), на 1-ом пине(где клоки на цап идут штатно) - данные тоже идут раз в 8-15 включений, а на 142 пине, если я задаю его выходом для данных - они идут стабильно при каждом включении.

    при этом все варнинги при компиляции относятся исключительно к модулю работающему с ацп и цап. аппаратную часть платы перепроверил - все питания есть, запитка портов есть, при этом на второй плисине не этой плате - программа стабильно идет на штатных пинах...

    может кто подскажет хотя бы в каком направлении копать?

  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. Еще раз - с какой частотой у Вас данные собираются после АЦП, на какой частоте работает фльтр, фильтр имеет собственную частоту или используется чип енэйбл (ce)? Временные ограничения прописываете?

    В зависимости от ответов ситуаций может быть масса, нопример, данные после АЦП идут на частоте 100МГЦ и Вы берете каждый десятый отсчет и напрямую загоняете в фильтр, не прописывая ограничений - в этом случае будет сразу три ошибки - нет пересинхронизации при переходе от 100 к 10МГц и возможны гонки сигналов, нет ограничений и тоже не гарантируется правильная работа в принципе, беря каждый 10 отсчет будете хватать мусор и побочные гармоники.

    Насчет БПФ - стоит вставить для того, чтобы посмотреть спектр входного сигнала (если другого способа нет посмотреть спектр после выхода АЦП), используйте готовую корку для начала и грамотно возьмите кол-во точек. В реальности БПФ - дорогое удовольствие.

    В конкретно Вашем случае скорее всего подойдет классическая схема - на каждый канал ставить NCO на входе, потом цепочка из гребенчатых фильтров и ФНЧ на срез двойной частоты для переноса в ноль ну и ФАПЧ с обратной связью, но это уже надо писать в раздел по ЦОС, там другие спецы.

     

    в данный момент я опрашиваю АЦП с частотой 10 МГц, в корке фильтра дискретизацию задаю 10 МГц, а частоту тактирования 100МГц, временных ограничений не прописывал.

     

  6. Походу, Вы где-то про нормирование забыли. Каналы добавили -> диапазон сигнала увеличился - > АЦП/ЦАП в насыщение/переполнение улетели.

     

    Еще интересно: а как Вы в приемнике каждый канал в ноль скидываете?:) Про явный перенос по частоте ничего не видно. Или у Вас только косвенный перенос за счет децимирования работает? Уверены, что правильно все частоты выбрали?

     

    о переносе частоты мысли были, но пока не пробовал реализовать. а вот что значит правильно? я старался подбирать частоты чтобы не были кратными, нижнюю частоту выбирал исходя из того чтобы в длину единичной информационной посылки влезло 5-6 периодов. а вот в ноль я не скидываю, как то об этом не задумывался

    а на счет переполнения не совсем понял, сигнал на входе АЦП по амплитуде не изменяется от того сколько каналов. я рассчитал таблички для периода синусоиды на каждой частоте, но с одинаковым шагом, и на цап подаю суммарный код деленный на кол-во присутствующих каналов. - этот расчет проверен и в матлабе и в экселе и на осциллографе.

  7. Вы бы сначала на функциональном уровне свои идеи отладили (Матлаб,Симулинк, далее RTL и функциональная отладка в симуляторе) прежде чем всё это реализовывать в железе. Не исключено что ошибка у вас в алгоритме.

     

    Эм, особого алгоритма в моем варианте и нет, просто на каждый канал по FIR-фильтру с децимацией(иначе не влезают). но в симулинке моделировал - на фильтрах с флоатами работало, на фиксированной точке из-за небольшой путаницы с отведением под целую часть и дробную не все работало, точнее местами отдельные фильтры показывали картинку хуже, нежели в железе(честно я не профи в симулинке)

     

    Вообще лучше модель для начала сделать и все отладить, как Bad0512 советовал.

    Вы децимацию как делаете - просто частоту понижаете и все? Если да, то каким образом делаете пересинхронизацию? Обычно CIC - фильтры ставят для этих целей, а далее восстанавливающий ФНЧ.

    А так информации вообще мало и лично я вообще ничего не понял. Вы хотите сделать частотное разделение каналов?

     

    я использую 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. или я вас не понял?

    (если вопрос в том - сколько бит? - тогда нужно считать ошибку и смотреть при скольки дробных битах она начинает вас устраивать)

     

    точнее именно определение кол-ва бит интересует, точнее методика.

    но возможно причина в :

     

    Что за ЦАП/АЦП ? У меня, например, после ацп в плис заходят многоразрядные p и n компоненты, где I и Q составляюшие одного канала идут попеременно, поэтому я ставлю DDR регистр, после них обычные и получаю многоразрядные I и Q компоненты. Если Вы просто взяли выход после дифференциального пина и подали на фильтр (а реально там несколько каналов или I и Q компоненты), то у Вас и будет мусор на выходе. Плюс еще этот мусор неправильно подается на вход ЦАП

     

    я использую AD9201, у него выход параллельный 10-ти битный или я все же что-то не досмотрел в даташите?!

     

     

    Ну плюс, даже если сигнал с АЦП вещественный, какая частота дискритезации АЦП, и согласован ли используемый фильтр с ней, может быть разумно децимацию сделать перед фильтрацией.

    Есть ли антиалайзинговый фильтр в системе?

     

    Ну и самое главное, проведена ли симуляция проекта, перед тем как что-то делать с железкой?

    Если работаете с матлаб, то вообще замечательно.

    Делаете исходный тестовый сигнал, прогоняете через RTL симуляцию, потом обратно в матлаб и сравниваете с референсной моделью.

    На симуляции вы решите большинство вопросов с тем, что на что влияет. Какой должен быть порядок фильтра, какая должна быть разрядность данных, аккумуляторов, коэффициентов

    для обеспечения приемлемого для вас качества фильтрации.

     

    частота дискретизации взята 3 МГц. меня пока что интересует только одиночный фильтр, точнее его реализация в железке, чтобы сократить расстояние отделяющее от теории до практики в ПЛИС.

    в Матлабе проигрывал - все устраивало, а вот RTL-симуляцию не пробовал. она подразумевает симуляцию в iSim? фильтра и типового сигнала?

     

  14. здравствуйте.

    раньше не занимался фильтрацией на плис,поэтому столкнулся с проблемой при реализации полосового фильтра на xilinx.

    реализую пф с полосой 100кгц на частоте 450кгц.

    ацп и цап 10-разрядные.

    в fdatool использую следующие настройки fixed point:

    коэфф. использую 16-ти разрядные,

    вход и выход 10-разрядные,а вот величина fraction length вызвала некоторые вопросы, я не могу понять исходя из чего она выбирается...

    при синтезе нескольких вариантов я на выходе цап получаю или 0 вне зависимости от того что на входе ацп,или просто какую то генерацию импульсов не зависимо от входа(как предполагаю от переполнения...).

    правильность работы с ацп и цап проверял соединив их в плис на прямую.

    поэтому возникли два вопроса:

     

    1.как правильно выбирать разрядность fixed point

    2.данные ацп прежде чем подавать на фильтр надо преобразовывать?

  15. в каком смысле перестраивается?

    я с битом разобрался, он стал ставится когда я отдельно начал слать команду на разрешение записи:

    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();

    и записи нет((((

    на осциллографе всю передачу вижу

     

  16. про команду я знаю и сейчас уже локализовался - по dma эта команда не идет...не ставится бит...и не могу понять почему.в даташите про времена ничего не сказано,а подаю ее так же как и просто через spi писал.

    по обычным функциям стандартной библиотеки spi все пишется

  17. я нули шлю,при чтении нужно тактирование делать,нулями и делаю. массив buffSPI_Tx у меня нулевой,только в его нулевой элемент записываю команду на чтение READ,а три следующие адрес,в данном случае нулевой.далее указываю буффер приема и передачи и включаю два канала...

    по завершению передачи в buffSPI_Rx я имею страницу считанную из флеша(за исключением последних 4 байт,но это мелочь,буффер увеличить на 4 и всю страницу получу или както по другому-это не важно)-это все работает!проблема с записью...чую где то глупый косяк,да опыта мало еще с 32-х разрядными

  18. Рекомендую проверить состояние битов защиты секторов от записи. Если как вы говорите запись происходит очень быстро, то она просто не происходит по причине защиты от записи. Перед записью новых данных, старые все же надо сначала стирать, иначе потом при чтении получите данные отличные от записываемых.

     

    я провожу очистку сектора.но тут дело даже не в защитных битах-запись просто через spi проходит нормально,и чтение этой записи через dma успешное,массивы совпадают,а вот запись через dma-нет...

  19. задам вопрос по другому!

    вот написан модуль у меня общения с 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 - все работает

  20. снова вопрос:а может флешка не успеть сохранить?

    дело в том что запись через dma не происходит...на осциллографе вижу всю посылку,а считываю ff

    в тоже время если просто через spi пишу,а считываю через dma-все нормально...

  21. осциллографом на шинах miso или mosi и clk.я через sw отладчик отдель запускаю цикл записи сектора,потом остановка и цикл чтения.

    паузы при чтении вижу,наравне с размером страницы,даже чуть больше.а между самими байтами тоже.

    я сейчас через дма начал делать,посмотрим что будет.

    спасибо за наведение на путь и разъяснение))узнал кое-что.

  22. спасибо за разъяснение

    но маленькое уточнение, не совсем понял просто или не совсем ясно сформулировал свой вопрос:

    Не путайте время чтения с временем записи. Время чтения будет ограничено скорее максимальной частотой работы SPI контроллера или SPI flash памяти (если медленная).

     

    у меня в контроллере SPI подключен к шине APB1, у которой частота 36МГц, предделитель стоит 2, т.е. на SPI используется 18

    время на запись всего сектора (256 страниц по 256 байт) занимает около 500мс по старому осциллографу точнее измерить не сумел, но с даташитом сходится - там написано что время записи одной страницы от 1,4 до 5 мс(от 359 мс до 1,28 с)

    но время чтения получается таким же практически, ну может чуть меньше...хотя по логике при 18 МГц я должен читать за 30-40 мс (если частоту тактирования брать 18МГц)

    единственное в начале грешил на слишком большое кол-во вызовов разных функция в цикле приема - ограничился написал по возможности одну функцию с прямым обращениям к регистру чтения и регистру флагов, но время не поменялось.. <-вот это верно?т.е. как бы само уточнение вот.

    почему то кажется что ДМА тоже выигрыша не даст

    я прав?

     

    А внимательно посмотреть datasheet??

    Instruction Description One-byte instruction Address Dummy Data

    code bytes bytes bytes

    READ Read Data Bytes 0000 0011 03h 3 0 1 to ∞

    FAST_READ Read Data Bytes at 0000 1011 0Bh 3 1 1 to ∞

    Higher Speed

     

    Ну и плюс выше озвученное про принцип работы SPI.

    ммм...я эту таблицу смотрел не раз, но там же указано что 3 байта адреса и 0 байт Dumme bytes или я не так ее трактую?

×
×
  • Создать...