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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> 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
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
Ar-han
сообщение Jul 1 2014, 05:30
Сообщение #4


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

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



Цитата(VladimirB @ Jun 30 2014, 23:54) *
ПЛИС и инструментарий не указан - ХЗ чем вы там синтезите,

но по своему опыту скажу: с такими аппаратными фичами 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 констреинты есть какие-нибудь?



Xilinx ML507, virtex5, ise14.
С диф. сигналами работаю впервые, нарисовал диф. приёмники в схематике,
сделал view hdl, и исправил расширение файла.
CLK_OUT заведен на GCLK:
Код
SMA_DIFF_CLK_IN_N          bank 3       IO_L6P_GC_3    LOC= "H14"
SMA_DIFF_CLK_IN_N          bank 3       IO_L6N_GC_3    LOC= "H15"


Кстати, интересно, можно ли его завести на Clock Capable I/Os?:
Предусмотрел возможность на плате, чтобы не тянуть clock через sma разъёмы.
Код
   IO_L9N_CC_SM0N_13        bank13       LOC=AE34
   IO_L9P_CC_SM0P_13         bank13       LOC=AF34


Прошу прощения, не совсем понятна фраза:
Цитата
Дифференциальные буферы вставить в виде примитивов?


Про IDDR впервые слышу, спасибо. Если можно в двух словах зачем он? С ходу не разобрался.

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

Код
NET  SMA_DIFF_CLK_IN_N    LOC="H15";   # Bank 3, Vcco=2.5V, No DCI      
NET  SMA_DIFF_CLK_IN_P    LOC="H14";   # Bank 3, Vcco=2.5V, No DCI  

//////////////////////////////////
//D0_D1
NET  HDR2_22_SM_10_N      LOC="T34";   # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[10]) J4-22
NET  HDR2_24_SM_10_P      LOC="U33";   # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[10]) J4-24

//D2_D3
NET  HDR2_26_SM_11_N      LOC="U31";   # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[9]) J4-26
NET  HDR2_28_SM_11_P      LOC="U32";   # Bank 11, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[9]) J4-28

//D4_D5
NET  HDR2_30_DIFF_3_N     LOC="V33";   # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXN[8]) J4-30
NET  HDR2_32_DIFF_3_P     LOC="V32";   # Bank 13, Vcco=2.5V or 3.3V user selectable by J20 (SYSMON External Input: VAUXP[8]) J4-32

----------

остальные ноги типа:
Код
HDR2_22_SM_10_N      IO_L18N_SM10N_11  
HDR2_24_SM_10_P      IO_L18P_SM10P_11

--

Про терминирование большое спасибо, внешних резюков нет, недочитал просто.
Думал, что оно жестко привязано внутри к ноге, а что сгенерировал конвертор из схематика не разобрался.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 1 2014, 06:32
Сообщение #5


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

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



Цитата(Ar-han @ Jul 1 2014, 08:30) *
Про IDDR впервые слышу, спасибо. Если можно в двух словах зачем он? С ходу не разобрался.

IDDR - буфер, который входные данные по двум фронтам защёлкивает, на выходе имеем D0 и D1.
Можно тут почитать.
А тут применительно к Вашему девайсу.
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 1 2014, 10:00
Сообщение #6


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

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



Цитата(Ar-han @ Jul 1 2014, 09:30) *
Xilinx ML507, virtex5, ise14.
С диф. сигналами работаю впервые, нарисовал диф. приёмники в схематике,
сделал view hdl, и исправил расширение файла.
CLK_OUT заведен на GCLK:
Код
NET  SMA_DIFF_CLK_IN_N    LOC="H15";  
NET  SMA_DIFF_CLK_IN_P    LOC="H14";  

//D0_D1
NET  HDR2_22_SM_10_N      LOC="T34";
NET  HDR2_24_SM_10_P      LOC="U33";  
...



Похоже, я забыл указать в констрейнах что это LVDS сигнал:
Код
NET  SMA_DIFF_CLK_IN_N    LOC="H15"|IOSTANDARD = LVDS_25;  
NET  SMA_DIFF_CLK_IN_P    LOC="H14"|IOSTANDARD = LVDS_25;


Сообщение отредактировал Ar-han - Jul 1 2014, 10:03
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 1 2014, 13:08
Сообщение #7


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

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



Цитата(Ar-han @ Jun 30 2014, 22:43) *
Я, кажется, понял, это тут совсем не нужно:
Код
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;


, а нужны IDDR модули после диф. приёмников))

Код
   IDDR_0 : IDDR    
      port map (C=>USER_CLK,
                CE=>VPP,
                D=>DDR_0,    
                R=>GRND,
                S=>GRND,
                Q1=>out0,
                Q2=>out1);


Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 1 2014, 13:20
Сообщение #8


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

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



Долго же Вы понимали sm.gif
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 1 2014, 13:59
Сообщение #9


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

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



Цитата(doom13 @ Jul 1 2014, 17:20) *
Долго же Вы понимали sm.gif


И всё же проблема актуальна ))
Так выглядит синус f = 1 мгц, амплитудой 0.9 Вольт
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 1 2014, 14:11
Сообщение #10


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

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



Цитата(Ar-han @ Jul 1 2014, 16:59) *
И всё же проблема актуальна ))

Биты у Вас попутаны. На какой частоте АЦП работает?
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 1 2014, 14:19
Сообщение #11


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

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



Цитата(doom13 @ Jul 1 2014, 18:11) *
Биты у Вас попутаны. На какой частоте АЦП работает?


АЦП на 125 МГц, ломаю голову, где напутал биты.
Откуда ярко выраженные ступеньки в сигнале?
Вот синус 1 мгц, с амплитудой 100 - 200 мВ.
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 1 2014, 14:21
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Ar-han @ Jun 30 2014, 22:43) *
Что не так делаю?
Почему вместо синуса вижу корявый меандр?
Не реагирует на изменение амплитуды сигнала.

А симулировать проект пробовали?
Скажем записать в файл данные от синусоиды и сделать имитатор АЦП. И из файла выдать синусоиду...

А уже потом говорить, что данные кривые...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 1 2014, 14:26
Сообщение #13


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

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



Цитата(iosifk @ Jul 1 2014, 18:21) *
А симулировать проект пробовали?
Скажем записать в файл данные от синусоиды и сделать имитатор АЦП. И из файла выдать синусоиду...

А уже потом говорить, что данные кривые...


Я вместо диф. приёмников пилу подсовывал, вчера вроде бы нормальная пила была.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jul 1 2014, 14:35
Сообщение #14


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

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



Могу предложить, но для этого Вам понадобиться наладить SPI (если его пока нет), перевести АЦП в режим синхронизации, т.е. для регистра 0x0A записать в TEST PATTERNS режим Custom pattern (101) и в качестве Custom Pattern записать, например, 14'b10101010101010. На приёмной стороне принимаете Вашу тестовую посылку, смотрите, какие биты попутаны. Быстрее всёго они будут приниматься в неправильном порядке, но этот порядок будет сохраняться, тогда меняете местами в соответствии с вашей эталонной последовательностью и можно работать. Если порядок следования бит меняется от запуска к запуску (если тайминги плохо прописаны, то такое и будет), тогда делаете устройство которое при включении будет производить синхронизацию и подключать принимаемые биты в правильном порядке.

Цитата(Ar-han @ Jul 1 2014, 17:19) *
АЦП на 125 МГц, ломаю голову, где напутал биты.

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

Цитата(iosifk @ Jul 1 2014, 17:21) *
А уже потом говорить, что данные кривые...

Данные не кривые, просто принимаются неправильно, нужно поменять порядок следования бит и всё будет в порядке.
Go to the top of the page
 
+Quote Post
Ar-han
сообщение Jul 1 2014, 14:39
Сообщение #15


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

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



Цитата(doom13 @ Jul 1 2014, 18:31) *
Могу предложить, но для этого Вам понадобиться наладить SPI (если его пока нет), перевести АЦП в режим синхронизации, т.е. для регистра 0x0A записать в TEST PATTERNS режим Custom pattern (101) и в качестве Custom Pattern записать, например, 14'b10101010101010. На приёмной стороне принимаете Вашу тестовую посылку, смотрите, какие биты попутаны. Быстрее всёго они будут приниматься в неправильном порядке, но этот порядок будет сохраняться, тогда меняете местами в соответствии с вашей эталонной последовательностью и можно работать. Если порядок следования бит меняется от запуска к запуску (если тайминги плохо прописаны, то такое и будет), тогда делаете устройство которое при включении будет производить синхронизацию и подключать принимаемые биты в правильном порядке.


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



Спасибо! До SPI еще не добрался, и с моими темпами, похоже, не скоро ))
Генератор впаян, но есть возможность тактировать из вне.
Совет полезный, нужно будет попробовать. Жаль с ходу не ясно в чём баг.

Тут-то я правильно описал атрибут IDDR "OPPOSITE_EDGE"?
Код
       component IDDR
      -- synopsys translate_off
      generic( INIT_Q1 : bit :=  '0';
               INIT_Q2 : bit :=  '0';
               DDR_CLK_EDGE : string :=  "OPPOSITE_EDGE";
               SRTYPE : string :=  "SYNC");
      -- synopsys translate_on
      port ( D  : in    std_logic;
             CE : in    std_logic;
             C  : in    std_logic;
             S  : in    std_logic;
             R  : in    std_logic;
             Q1 : out   std_logic;
             Q2 : out   std_logic);
   end component;


Без входного сигнала:
Прикрепленное изображение


Сообщение отредактировал Ar-han - Jul 1 2014, 14:45
Go to the top of the page
 
+Quote Post

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

 


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


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