реклама на сайте
подробности

 
 
> LVDS DDR данные из АЦП в ПЛИС
Ar-han
сообщение Jun 30 2014, 18:43
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 12-09-11
Пользователь №: 67 135



Что не так делаю?
Почему вместо синуса вижу корявый меандр?
Не реагирует на изменение амплитуды сигнала.
С какой стороны младшие биты? (c D0 или с D6)
Тактирую ПЛИС по CLK_OUT от АЦП

АЦП ADS6145
http://www.ti.com/lit/ds/symlink/ads6145.pdf
Спасибо.




Код
   component IBUFGDS
  --    -- synopsys translate_off
      generic( DIFF_TERM : boolean :=  FALSE);
  --    -- synopsys translate_on
      port ( I  : in    std_logic;
             IB : in    std_logic;
             O  : out   std_logic);
   end component;
   attribute IOSTANDARD of IBUFGDS : component is "DEFAULT";
   attribute DIFF_TERM of IBUFGDS : component is "FALSE";
   attribute BOX_TYPE of IBUFGDS : component is "BLACK_BOX";
  
   component IBUFDS
      -- synopsys translate_off
      generic( DIFF_TERM : boolean :=  FALSE);
      -- synopsys translate_on
      port ( I  : in    std_logic;
             IB : in    std_logic;
             O  : out   std_logic);
   end component;
   attribute IOSTANDARD of IBUFDS : component is "DEFAULT";
   attribute DIFF_TERM of IBUFDS : component is "FALSE";
   attribute BOX_TYPE of IBUFDS : component is "BLACK_BOX";


begin

data_out <= out13 & out12 & out11 & out10 & out9 & out8 & out7 & out6 & out5 &
                out4 & out3 & out2 & out1 & out0 ;

clk_out <= USER_CLK;


   IBUFGDS_1 : IBUFGDS
      port map (I=>SMA_DIFF_CLK_IN_P,
                IB=>SMA_DIFF_CLK_IN_N,
                O=>USER_CLK);


   IBUFDS_1 : IBUFDS
      port map (I=>HDR2_28_SM_11_P,
                IB=>HDR2_26_SM_11_N,
                O=>DDR_1);
  
  
   IBUFDS_2 : IBUFDS
      port map (I=>HDR2_32_DIFF_3_P,
                IB=>HDR2_30_DIFF_3_N,
                O=>DDR_2);
....

process(USER_CLK)
begin

        if (USER_CLK = '1') then
      
        out0 <= DDR_0;
        out2 <= DDR_1;
        out4 <= DDR_2;
        out6 <= DDR_3;
        out8 <= DDR_4;
        out10<= DDR_5;
        out12<= DDR_6;
        

        elsif (USER_CLK = '0') then
        
        out1 <= DDR_0;
        out3 <= DDR_1;
        out5 <= DDR_2;
        out7 <= DDR_3;
        out9 <= DDR_4;
        out11 <= DDR_5;
        out13 <= DDR_6;

        end if;

end process;



Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VladimirB
сообщение Jun 30 2014, 19:54
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Цитата(Ar-han @ Jun 30 2014, 22:43) *
Что не так делаю?
Почему вместо синуса вижу корявый меандр?
Не реагирует на изменение амплитуды сигнала.
С какой стороны младшие биты? (c D0 или с D6)
Тактирую ПЛИС по CLK_OUT от АЦП

АЦП ADS6145...


ПЛИС и инструментарий не указан - ХЗ чем вы там синтезите,

но по своему опыту скажу: с такими аппаратными фичами Xilinx как DDR, SERDES, PLL, IODELAY и др. лучше ИМХО
обращаться путём наглого вставления примитивов в HDL, иначе ISE будет тупить очень сильно (он конечно тупит и с примитивами - но значительно меньше). Дифференциальные буферы не поленились вставить в ввиде примитивов - вот и IDDR нужно также.

Там у IDDR, есть помниться несколько режимов работы, задающихся генериками. А что вам тут ваш синтезатор сделал из вашего кода ХЗ? И вставил ли он вообще IDDR? И если вставил, то с какими настройками?

И ещё режет глаз:
generic( DIFF_TERM : boolean := FALSE);
это так и задумано? место на плате много и снаружи не поленились резюки по 100Ом запаять?

P.S. и ещё не ясно, что с клоком из АЦП - на какой тип ноги он заведен (GCLK, MRCC, SRCC или CLOCK_DEDICATED_ROUTE = false) ?
P.S.2 констреинты есть какие-нибудь?
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 30 2014, 20:39
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(VladimirB @ Jun 30 2014, 22:54) *
Дифференциальные буферы не поленились вставить в ввиде примитивов - вот и IDDR нужно также.

Вот тут, похоже, правда, а то из Вашего процесса какая-то ерунда должна синтезироваться, а не DDR-буфер.
Go to the top of the page
 
+Quote Post
druzhin
сообщение Jul 4 2014, 18:42
Сообщение #4


druzhin
***

Группа: Свой
Сообщений: 286
Регистрация: 18-06-04
Из: Москва
Пользователь №: 58



У меня есть рабочие проекты на Spartan-6 по приёму данных с АЦП LTC2157.

Есть даже в двух экземплярах - и на SERDES, и на IDDR.
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 4 2014, 22:35
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 12-09-11
Пользователь №: 67 135



Цитата(druzhin @ Jul 4 2014, 22:42) *
У меня есть рабочие проекты на Spartan-6 по приёму данных с АЦП LTC2157.


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


Цитата(doom13 @ Jul 4 2014, 20:37) *
Да, и расскажите, как Вы считываете свои данные с памяти, а то что-то дружно тут много всего наговорили.


В моём варианте двухпортовая память в один порт ацп пишет
по два значения (14бит) в один регистр (32бит), а
вторым портом она на PLB шине (пока что микроблейза):

#define XPAR_XPS_SHARED_BRAM_IF_CNTLR_BASEADDR 0xA0000000


Указатель на эту память:
#define pData ((char*)0xA0000000)

копирую:
memcpy(pbuf_to_be_sent->payload,pData,STR_SIZE);

отправляю:
err = udp_send(pcb, pbuf_to_be_sent);

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

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

Пока что заткнулся на прерывании микроблейза. Упорно не хочет работать, хотя раньше с ним проблем не было. (Может я импульс короткий даю на прерывание? он порядка 100 ns)

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

Я пока только учусь, хочу попробовать как не правильно делать и как правильно.
Всем большое спасибо за поддержку.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 5 2014, 06:58
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Ar-han @ Jul 5 2014, 01:35) *
Откуда тогда дискуссия про GPIO и вычитку с его помощью данных sm.gif Так и нужно - память как бы внешняя получается.

В Вашем варианте реализации, на мой взгляд, более сложным является то, что есть флаг заполнения и флаг разрешения на запись (хотя это тоже имеет место быть). Т.е. у вас чтение и запись зависимы друг от друга, в варианте с двумя буферами памяти, которые переключаются поочереди чтение и запись независимы. Записывающая и вычитывающая стороны работают самостоятельно никак не оказывая влияния друг на друга.
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 9 2014, 05:45
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 12-09-11
Пользователь №: 67 135



Цитата(doom13 @ Jul 5 2014, 10:58) *
в варианте с двумя буферами памяти, которые переключаются поочереди чтение и запись независимы. Записывающая и вычитывающая стороны работают самостоятельно никак не оказывая влияния друг на друга.


Правильно ли я понимаю, что память с двумя буферами, это две одинаковые корки BRAM, с разными адресами, на одной шине (PLB) ?
Кстати, интересно, можно ли двухпортовую BRAM повесить на LMB шину? У меня, вроде бы, получалось, но были проблемы, и не удалось её корректно использовать.


Цитата(doom13 @ Jul 8 2014, 01:29) *
С приёмом данных сначала разберитесь, потом будете искать более оптимальные пути.

Приём данных, кажется, удалось победить.

Теперь вопрос по флагам, флаг процессору - по внешнему прерыванию. Ок. Это сделал. Измеренная wireshark -ом скорость получилась 2940 пакетов в сек по 1 кБайту.
Теперь как мне передать от процессора флаг, что память прочитана? Первое, что приходит в голову - это GPIO, но подозреваю, что это не оптимально.
Сейчас использую microblaze на частоте 100 Мгц, интересно, что даст повышение частоты?
Хочу перейти на powerPC, только не соображу как на PowerPC запустить UDP пакеты. Под PowerPC тестовое приложение с эхо сервером организовано через TCP протокол.
Насколько я понял, если сделать большие UDP пакеты, то lwip сама их разрежет, и отошлет кусками.
Но кажется, UDP не поддерживает нумерацию пакетов, значит, рассчитывать, что они склеятся на стороны компа не приходится. Значит самому нужно их резать кусками, нумеровать, и склеивать на компе?

Цитата(Golikov A. @ Jul 8 2014, 00:22) *
У вас прописаны констрайны, за сколько данные до фронта клока должны стоять и сколько после? Это весьма полезные констрайны!


Нет, не прописаны, буду рад подсказке, с констрейнами еще не успел разобраться.
Если, можно, ткните где почитать про констрейны.
Правильно ли я понимаю, что констрейны пишутся руками в UCF файле, рядом с распиновкой ног?
Где-то я слышал, что они удобно прописываются в PlanAhead, только с ходу не нашел.

У меня есть пример констрейна для входного сигнала:
Код
NET "CLOCK_110" TNM_NET = CLOCK_110;
TIMESPEC TS_CLOCK_110 = PERIOD "CLOCK_110" 110 MHz HIGH 50% INPUT_JITTER 100 ps;
OFFSET = IN 9.09091 ns VALID 9.09091 ns BEFORE "CLOCK_110" RISING;


Можно ли таким же образом указать ограничения на тактовый сигнал, который рождается после диф. приёмников - USER_CLK?
Из каких соображений выбирается JITTER ?

Код
     IBUFGDS_1 : IBUFGDS
        port map (I=>SMA_DIFF_CLK_IN_P,
               IB=>SMA_DIFF_CLK_IN_N,
               O=>USER_CLK);

   IBUFDS_6 : IBUFDS
      port map (I=>HDR2_64_SM_9_P,
                IB=>HDR2_62_SM_9_N,
                O=>DDR_6);
  
   IDDR_6 : IDDR    
      port map (C=>USER_CLK,
                CE=>VPP,
                D=>DDR_6,    
                R=>GRND,
                S=>GRND,
                Q1=>out12,
                Q2=>out13);


Спасибо!

Цитата(Ar-han @ Jul 8 2014, 11:07) *
Ура, всё заработало! Нашел еще одну дурацкую ошибку, пихал данные в память по совершенно другой частоте, не по той, на которой они защелкивались в диф. приемниках.

Только не понятно, откуда брался шум при отсутствии входного сигнала.

Сообщение отредактировал Ar-han - Jul 9 2014, 05:45
Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 9 2014, 07:11
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Ar-han @ Jul 9 2014, 08:45) *
Насколько я понял, если сделать большие UDP пакеты, то lwip сама их разрежет, и отошлет кусками.
Но кажется, UDP не поддерживает нумерацию пакетов, значит, рассчитывать, что они склеятся на стороны компа не приходится. Значит самому нужно их резать кусками, нумеровать, и склеивать на компе?

Да, так и есть, если UDP пакет большой (больше порядка 1500 байт), то LwIP пошлёт его за несколько IP-фрагментов, wireshark-ом Вы увидите эти фрагменты, если написать приёмник в любой среде, то там всё склеится автоматом, указываете только длинну данных, которую передаёте. Правда, для LwIP чтоб заработала фрагментация мне пришлось добавить задержку в цикле, где и происходит разделение на фрагменты, без неё как-то криво работало, часть фрагментов терялось. Пример того, что нужно для отправки UDP:
CODE

void main()
{
unsigned char pucMACArray[8];

....

pucMACArray[0] = ((ulUser0 >> 0) & 0xff);
pucMACArray[1] = ((ulUser0 >> 8) & 0xff);
pucMACArray[2] = ((ulUser0 >> 16) & 0xff);
pucMACArray[3] = ((ulUser1 >> 0) & 0xff);
pucMACArray[4] = ((ulUser1 >> 8) & 0xff);
pucMACArray[5] = ((ulUser1 >> 16) & 0xff);

unsigned long board_ip = 0xC0A80110;
unsigned long net_mask = 0xFFFFFF00;

lwIPInit(pucMACArray, board_ip, net_mask, 0, IPADDR_USE_STATIC);

int i;
for(i = 0; i < 16384; i++)
{
buffer[i] = i;
}

// UDP

struct udp_pcb *pcb;
pcb = udp_new();

unsigned short port_rmt, port_local;
struct ip_addr ip_rmt, ip_local;

IP4_ADDR(&ip_rmt, 192, 168, 1, 66);
IP4_ADDR(&ip_local, 192, 168, 1, 16);
port_rmt = 12000;
port_local = 11000;

udp_bind(pcb, &ip_local, port_local);
udp_connect(pcb, &ip_rmt, port_rmt);


unsigned short len = 16384;
struct pbuf * pb;

int tx_en = 0;
err_t error = 55;

while(1)
{
if(tx_en)
{
pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
//memcpy(pb->payload, buffer, len);
pb->payload = buffer;
error = udp_send(pcb, pb);
pbuf_free(pb);
tx_en = 0;
}
}
}

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ar-han   LVDS DDR данные из АЦП в ПЛИС   Jun 30 2014, 18:43
||- - Ar-han   Цитата(doom13 @ Jul 5 2014, 10:58) Откуда...   Jul 7 2014, 14:32
|||- - Ar-han   Цитата(Ar-han @ Jul 7 2014, 18:32) с...   Jul 8 2014, 07:07
||- - doom13   Цитата(Ar-han @ Jul 9 2014, 08:45) П...   Jul 9 2014, 06:38
||- - doom13   Цитата(Ar-han @ Jul 9 2014, 08:45) Т...   Jul 9 2014, 07:52
|- - Ar-han   Цитата(VladimirB @ Jun 30 2014, 23:54) ПЛ...   Jul 1 2014, 05:30
|- - doom13   Цитата(Ar-han @ Jul 1 2014, 08:30) П...   Jul 1 2014, 06:32
|- - Ar-han   Цитата(Ar-han @ Jul 1 2014, 09:30) X...   Jul 1 2014, 10:00
- - Ar-han   Цитата(Ar-han @ Jun 30 2014, 22:43) ...   Jul 1 2014, 13:08
|- - doom13   Долго же Вы понимали   Jul 1 2014, 13:20
|- - Ar-han   Цитата(doom13 @ Jul 1 2014, 17:20) Долго ...   Jul 1 2014, 13:59
|- - doom13   Цитата(Ar-han @ Jul 1 2014, 16:59) И...   Jul 1 2014, 14:11
|- - Ar-han   Цитата(doom13 @ Jul 1 2014, 18:11) Биты у...   Jul 1 2014, 14:19
- - iosifk   Цитата(Ar-han @ Jun 30 2014, 22:43) ...   Jul 1 2014, 14:21
|- - Ar-han   Цитата(iosifk @ Jul 1 2014, 18:21) А симу...   Jul 1 2014, 14:26
- - doom13   Могу предложить, но для этого Вам понадобиться нал...   Jul 1 2014, 14:35
|- - Ar-han   Цитата(doom13 @ Jul 1 2014, 18:31) Могу п...   Jul 1 2014, 14:39
|- - doom13   Цитата(Ar-han @ Jul 1 2014, 17:39) Ж...   Jul 1 2014, 14:53
||- - Ar-han   Цитата(doom13 @ Jul 1 2014, 18:53) Баг в ...   Jul 1 2014, 17:53
|- - Timmy   А я посоветую сначала запустить SPI и перевести АЦ...   Jul 1 2014, 16:08
- - Golikov A.   А у вас не с АЦП проблемы? В ветке армов обсуждало...   Jul 1 2014, 14:47
- - Golikov A.   ЦитатаПозвольте спросить, Вы работали с АЦП с похо...   Jul 1 2014, 16:22
|- - doom13   Цитата(Golikov A. @ Jul 1 2014, 19:22) Ну...   Jul 1 2014, 20:26
|- - Ar-han   Цитата(doom13 @ Jul 2 2014, 00:26) Но, во...   Jul 2 2014, 07:37
||- - doom13   Цитата(Ar-han @ Jul 2 2014, 10:37) П...   Jul 2 2014, 09:44
||- - doom13   Цитата(Ar-han @ Jul 2 2014, 10:37) И...   Jul 2 2014, 10:28
||- - Ar-han   Цитата(doom13 @ Jul 2 2014, 14:28) Судя п...   Jul 2 2014, 12:39
||- - doom13   Цитата(Ar-han @ Jul 2 2014, 15:39) Д...   Jul 2 2014, 12:50
|||- - Ar-han   Цитата(doom13 @ Jul 2 2014, 16:50) Если х...   Jul 3 2014, 04:43
||- - doom13   Цитата(Ar-han @ Jul 2 2014, 15:39) Я...   Jul 2 2014, 15:55
||- - Ar-han   Цитата(doom13 @ Jul 2 2014, 19:55) Чтение...   Jul 2 2014, 18:52
||- - doom13   Цитата(Ar-han @ Jul 2 2014, 21:52) С...   Jul 2 2014, 20:11
|- - Timmy   Цитата(doom13 @ Jul 2 2014, 00:26) но инт...   Jul 2 2014, 10:14
- - Golikov A.   дополнительный код - старший бит определяет знак. ...   Jul 3 2014, 06:46
|- - doom13   Цитата(Golikov A. @ Jul 3 2014, 09:46) М...   Jul 3 2014, 07:58
|- - Ar-han   Цитата(Golikov A. @ Jul 3 2014, 10:46) до...   Jul 3 2014, 19:57
- - Golikov A.   ЦитатаЭто, насколько я понимаю преобразование в пр...   Jul 4 2014, 05:47
|- - doom13   Цитата(Golikov A. @ Jul 4 2014, 08:47) Гл...   Jul 4 2014, 07:50
|- - Ar-han   Цитата(Golikov A. @ Jul 4 2014, 09:47) не...   Jul 4 2014, 09:19
- - Golikov A.   Цитатано если использовать прерывание от GPIO, как...   Jul 4 2014, 08:18
|- - doom13   Цитата(Golikov A. @ Jul 4 2014, 11:18) Сн...   Jul 4 2014, 16:37
- - Golikov A.   а ну да... это я действительно тупанул. Инверсия с...   Jul 4 2014, 10:39
|- - Ar-han   Цитата(Golikov A. @ Jul 4 2014, 14:39) Вы...   Jul 4 2014, 11:32
- - Golikov A.   ЦитатаПриведите пример подразумеваемого процессора...   Jul 4 2014, 16:45
|- - doom13   Цитата(Golikov A. @ Jul 4 2014, 19:45) LP...   Jul 4 2014, 17:34
- - Golikov A.   ЦитатаТут Вы не разобрались в предложенном вариант...   Jul 4 2014, 18:33
|- - doom13   Цитата(Golikov A. @ Jul 4 2014, 21:33) Я ...   Jul 4 2014, 19:35
- - doom13   А что там с режимом SDR CMOS, можете джампер переб...   Jul 7 2014, 20:09
- - Golikov A.   ЦитатаПодвигать фазу PLL скорее всего не получится...   Jul 7 2014, 20:22
|- - doom13   Цитата(Golikov A. @ Jul 7 2014, 23:22) Ну...   Jul 7 2014, 21:29
- - Golikov A.   Перейдите уже на FIFO в конце концов... Брать 2 ...   Jul 9 2014, 07:03
- - Golikov A.   ЦитатаУ меня есть пример констрейна для входного с...   Jul 9 2014, 07:17
- - Golikov A.   У меня нет времени и желания разбираться в предлож...   Jul 9 2014, 09:05
|- - doom13   Цитата(Golikov A. @ Jul 9 2014, 12:05) У ...   Jul 9 2014, 10:01
- - Golikov A.   FIFO 1. Размер отправляемого пакета - любой задает...   Jul 9 2014, 10:15
- - doom13   Цитата(Golikov A. @ Jul 9 2014, 13:15) Не...   Jul 9 2014, 10:52
- - doom13   Цитата(Golikov A. @ Jul 9 2014, 13:15) FI...   Jul 9 2014, 11:55


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 09:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01547 секунд с 7
ELECTRONIX ©2004-2016