yudu 0 26 августа, 2009 Опубликовано 26 августа, 2009 · Жалоба Кто проектировал канал LVDS помогите! Соединяю два плиса Cyclone3 по lvds. Передатчик пашет, а вот на приемнике не могу считать данные. Имею две диф. пары, одна DATA и одна CLK. Все вроде бы обозначил как надо. Снимаю принятые данные и клок на линейные выводы - точная копия того что давал на передачу. Но вот зацепить клок внутри приемника не могу, не получается даже сосчитать импульсы. Другим словом в коде сигнал OK меняется раньше чем 64 импульса клока..:( LIBRARY ieee; USE ieee.std_logic_1164.all; -- Entity Declaration ENTITY priem IS -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! PORT ( inclk : IN STD_LOGIC; indat : IN STD_LOGIC; data : out STD_LOGIC :='0';-- линия данных buff : out STD_LOGIC_VECTOR(55 downto 0):=x"00000000000000"; --data dly upravlyemogo ustroystva st,s1,s2: out STD_LOGIC:='0'; C : out STD_LOGIC :='0'; EN : out STD_LOGIC_vector(0 to 1):=b"00" ); -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! END priem; -- Architecture Body ARCHITECTURE priem_architecture OF priem IS signal adr:STD_LOGIC_vector (3 downto 0):=x"5";-- АДРЕСС ПРИЕМНИКА signal datbuf:STD_LOGIC_VECTOR(0 to 63):=x"0000000000000000"; -- adres + data signal id,ic:STD_LOGIC:='0'; signal ok,pr_adr,c1:STD_LOGIC:='0'; signal sta:STD_LOGIC:='0'; --сигнал старт-бита / сброс передачи данных BEGIN id<=indat; ic<=inclk; --прием старт-бита / сброс передачи данных --при выполнении условия приема старт-бита --на линии STA появляется импульс --priem start bita --------------------------------------------------------------------------------------------- process (id,ic) variable i: integer:=0; begin if (ic='0') then i:=0; sta<='0'; end if; if ic='1' then if (id='0' and i=0) then i:=1; elsif (id='1' and i=1) then i:=2; elsif (id='0' and i=2) then sta<='1'; end if; end if; end process; --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- process (sta,ic) --запись данных variable i: integer:=0; begin if (ic'event and ic='1') then if i<64 then datbuf(i)<=id; i:=i+1; if i=64 then ok<=not ok; end if; end if; end if; if sta='1' then i:=0; end if; end process; --------------------------------------------------------------------------------------------- st<=sta; s1<=ic; s2<=ok; END priem_architecture; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 26 августа, 2009 Опубликовано 26 августа, 2009 · Жалоба 2 yudu - зачем вам чтото городить своё ? Всё уже украдено до вас - есть ALT_LVDS (в мегавизарде) или как то так - там и клок и сериализатор, линий мало, скорость нормальная... Если соединять 2 циклона - с минимум линий и по LVDS - самое оно :laughing: Там и примеры есть у альтеры как раз рабочие... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 26 августа, 2009 Опубликовано 26 августа, 2009 · Жалоба Во-первых, почитайте хорошенько книжки по основам синхронного дизайна, чтобы никогда больше (по крайней мере до тех пор, пока вы не начнете проектировать крутые заказные микросхемы) не пытаться тактовую частоту обрабатывать асинхронно ("if (ic='0')" etc.). Тогда станет ясно, что по линии clk надо передавать просто тактовый сигнал, непрерывно, а передачу пакетов данных осуществлять придумав формат пакета, передаваемый по линии данных. Наперед скажу, что если надо передавать данные не постоянно, а пачками проще протянуть третий провод, который будет как clock enable, чем заморачиваться пакетами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nonedub 0 26 августа, 2009 Опубликовано 26 августа, 2009 · Жалоба Во-первых, почитайте хорошенько книжки по основам синхронного дизайна, чтобы никогда больше (по крайней мере до тех пор, пока вы не начнете проектировать крутые заказные микросхемы) не пытаться тактовую частоту обрабатывать асинхронно ("if (ic='0')" etc.). Тогда станет ясно, что по линии clk надо передавать просто тактовый сигнал, непрерывно, а передачу пакетов данных осуществлять придумав формат пакета, передаваемый по линии данных. Наперед скажу, что если надо передавать данные не постоянно, а пачками проще протянуть третий провод, который будет как clock enable, чем заморачиваться пакетами. А что делать, если имеется двухпроводной (двухпарный) LVDS, да еще с gated clock? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 26 августа, 2009 Опубликовано 26 августа, 2009 · Жалоба А что делать, если имеется двухпроводной (двухпарный) LVDS, да еще с gated clock? А с gated clock лучше кого-то застрелить сразу. Откуда они вообще берутся эти gated clock-и в местах, где применяется LVDS ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба А с gated clock лучше кого-то застрелить сразу. Откуда они вообще берутся эти gated clock-и в местах, где применяется LVDS ? да есть такие фанаты, которым надо передать кадры без потерь на синху а отдельную линию под строб зажали... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yudu 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба 2 yudu - зачем вам чтото городить своё ? Всё уже украдено до вас - есть ALT_LVDS (в мегавизарде) или как то так - там и клок и сериализатор, линий мало, скорость нормальная... Если соединять 2 циклона - с минимум линий и по LVDS - самое оно :laughing: Там и примеры есть у альтеры как раз рабочие... Все дело в том, что канал LVDS должен давать данные пачками. После передачи должен быть основной режим для остальной части схемы, а для плиса наступает режим молчания(подведено только питание). И еще, работа плиса должна на момент приема тактироваться сигналом клок(clk), внешнего кварца нет. Data приходит на выводы 128/129, а клок на 49/50. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nonedub 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба А с gated clock лучше кого-то застрелить сразу. Откуда они вообще берутся эти gated clock-и в местах, где применяется LVDS ? Например, линк-порты DSP TS201 TigerShark от Analog Devices. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба 2 yudu - это конечно всё хорошо, но всё же не ясно , ЧТО ИМЕННО мешает использовать ALTLVDS?? Ставьте примитив и гоняйте данные пачками :laughing: Или вопрос стоит именно соорудить всё это чЮдо самому ? Кстати , а у вас клок кто разадаёт ? Он не глохнет случаем когда ктот орешает что передача окончена ?? И что значит ..Data приходит на выводы 128/129, а клок на 49/50... Камень какой ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryR 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба Все дело в том, что канал LVDS должен давать данные пачками. После передачи должен быть основной режим для остальной части схемы, а для плиса наступает режим молчания(подведено только питание).То есть у вас еще ко всему на этих двух несчастных проводах несколько источников сигнала, ПЛИС и еще кто-то. Застрелиться, это и для опытного-то человека гимор. А частоты-то какие? Например, линк-порты DSP TS201 TigerShark от Analog Devices.Ну это же неправда, там контроль передачи ведется через ACK/BCMP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба Если ..на этих двух несчастных проводах несколько источников сигнала, ПЛИС и еще кто-то.. то тут действительно ALTLVDS не покатит, но почему не взять I2C, он же TWI, - защищённость от шумов похуже чем у LVDS-ных, но можно много посадить товарищей на шину без особого гемора, да и скорости свои можно задать + корка не сложная.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yudu 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба Если то тут действительно ALTLVDS не покатит, но почему не взять I2C, он же TWI, - защищённость от шумов похуже чем у LVDS-ных, но можно много посадить товарищей на шину без особого гемора, да и скорости свои можно задать + корка не сложная.. Cyclon3. На проводах никого кроме 2-х плисов. Синхронизация 64 периода, 7 байт данных и 1 адресс. Эта синхронизация для диф. пары данных и для работы самого плиса. Скорость передачи 100Мб/c. Для ALTLVDS нужен PLL, для которого в свою очередь нужно время для запуска. Нужно городить самому. Есть предложения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SFx 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба PLL в визарде лучше выбирать встроенную в корку ALT_LVDS. Все работает. проверял на цикло2->циклон3 до 260 мегабит/c по одной линии. единственное требование. CLk должен заходить на входы CLK_IN на плисене. иначе не выдет. я по началу пытался использовать PLL отдельно сгенерированную - ничего не вышло. самое главное указать на LVDS_RX правильную выходную частоту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба 2 yudu - идеи есть всегда 100Мб/с - это мегабайты или мегабиты ?? Если это мегабайты - что-то у меня есть сомнения, что по одной паре такое можно вытянуть на 3-м циклоне.. На счёт времени запуска PLL - это только в начале, после старта плиски, пару десятков клоков он конфигурироваться будет, а потом выставит валид и будет работать пока питание не пропадёт. Или у вас жёсткие условия начала работы после включения питания ? И на счёт камня - какой именно циклончик ? а то может у вас клок приходит не на дедикейтед лапы и тогда и с ALTLVDS нужно будет тоже сильно колдовать :07: Как говорится - "..огласите весь список пжалуста.." :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IT_Pavel 0 27 августа, 2009 Опубликовано 27 августа, 2009 · Жалоба А вы правильно подключили ножки ПЛИС? Входной клок подается на ножки DIFFCLK ? Вместо конструкций: "if (ic='0') then i:=0; sta<='0';" используйте: if falling_edge(inclk) then ... вместо "if ic='1' then ..." используйте "if rising_edge(inclk) then ..." Если подаете тактовый сигнал, то и используйте его. Если есть сомнения происходит ли передача данных вообще, то можно это посмотреть в SignalTap. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться