Jump to content

    
Sign in to follow this  
yudu

Проектирование LVDS на ПЛИС Altera

Recommended Posts

Кто проектировал канал 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;

Share this post


Link to post
Share on other sites

2 yudu - зачем вам чтото городить своё ? Всё уже украдено до вас - есть ALT_LVDS (в мегавизарде) или как то так - там и клок и сериализатор, линий мало, скорость нормальная... Если соединять 2 циклона - с минимум линий и по LVDS - самое оно :laughing:

Там и примеры есть у альтеры как раз рабочие...

Share this post


Link to post
Share on other sites

Во-первых, почитайте хорошенько книжки по основам синхронного дизайна, чтобы никогда больше (по крайней мере до тех пор, пока вы не начнете проектировать крутые заказные микросхемы) не пытаться тактовую частоту обрабатывать асинхронно ("if (ic='0')" etc.). Тогда станет ясно, что по линии clk надо передавать просто тактовый сигнал, непрерывно, а передачу пакетов данных осуществлять придумав формат пакета, передаваемый по линии данных. Наперед скажу, что если надо передавать данные не постоянно, а пачками проще протянуть третий провод, который будет как clock enable, чем заморачиваться пакетами.

Share this post


Link to post
Share on other sites
Во-первых, почитайте хорошенько книжки по основам синхронного дизайна, чтобы никогда больше (по крайней мере до тех пор, пока вы не начнете проектировать крутые заказные микросхемы) не пытаться тактовую частоту обрабатывать асинхронно ("if (ic='0')" etc.). Тогда станет ясно, что по линии clk надо передавать просто тактовый сигнал, непрерывно, а передачу пакетов данных осуществлять придумав формат пакета, передаваемый по линии данных. Наперед скажу, что если надо передавать данные не постоянно, а пачками проще протянуть третий провод, который будет как clock enable, чем заморачиваться пакетами.

 

А что делать, если имеется двухпроводной (двухпарный) LVDS, да еще с gated clock?

Share this post


Link to post
Share on other sites
А что делать, если имеется двухпроводной (двухпарный) LVDS, да еще с gated clock?

А с gated clock лучше кого-то застрелить сразу.

Откуда они вообще берутся эти gated clock-и в местах, где применяется LVDS ?

Share this post


Link to post
Share on other sites
А с gated clock лучше кого-то застрелить сразу.

Откуда они вообще берутся эти gated clock-и в местах, где применяется LVDS ?

 

да есть такие фанаты, которым надо передать кадры без потерь на синху а отдельную линию под строб зажали...

Share this post


Link to post
Share on other sites
2 yudu - зачем вам чтото городить своё ? Всё уже украдено до вас - есть ALT_LVDS (в мегавизарде) или как то так - там и клок и сериализатор, линий мало, скорость нормальная... Если соединять 2 циклона - с минимум линий и по LVDS - самое оно :laughing:

Там и примеры есть у альтеры как раз рабочие...

 

Все дело в том, что канал LVDS должен давать данные пачками. После передачи должен быть основной режим для остальной части схемы,

а для плиса наступает режим молчания(подведено только питание). И еще, работа плиса должна на момент приема тактироваться сигналом клок(clk),

внешнего кварца нет. Data приходит на выводы 128/129, а клок на 49/50.

Share this post


Link to post
Share on other sites
А с gated clock лучше кого-то застрелить сразу.

Откуда они вообще берутся эти gated clock-и в местах, где применяется LVDS ?

Например, линк-порты DSP TS201 TigerShark от Analog Devices.

Share this post


Link to post
Share on other sites

2 yudu - это конечно всё хорошо, но всё же не ясно , ЧТО ИМЕННО мешает использовать ALTLVDS?? Ставьте примитив и гоняйте данные пачками :laughing: Или вопрос стоит именно соорудить всё это чЮдо самому ? Кстати , а у вас клок кто разадаёт ? Он не глохнет случаем когда ктот орешает что передача окончена ??

 

 

И что значит

..Data приходит на выводы 128/129, а клок на 49/50...

Камень какой ?

Share this post


Link to post
Share on other sites
Все дело в том, что канал LVDS должен давать данные пачками. После передачи должен быть основной режим для остальной части схемы, а для плиса наступает режим молчания(подведено только питание).
То есть у вас еще ко всему на этих двух несчастных проводах несколько источников сигнала, ПЛИС и еще кто-то. Застрелиться, это и для опытного-то человека гимор. А частоты-то какие?

 

Например, линк-порты DSP TS201 TigerShark от Analog Devices.
Ну это же неправда, там контроль передачи ведется через ACK/BCMP.

Share this post


Link to post
Share on other sites

Если

..на этих двух несчастных проводах несколько источников сигнала, ПЛИС и еще кто-то..
то тут действительно ALTLVDS не покатит, но почему не взять I2C, он же TWI, - защищённость от шумов похуже чем у LVDS-ных, но можно много посадить товарищей на шину без особого гемора, да и скорости свои можно задать + корка не сложная..

Share this post


Link to post
Share on other sites
Если то тут действительно ALTLVDS не покатит, но почему не взять I2C, он же TWI, - защищённость от шумов похуже чем у LVDS-ных, но можно много посадить товарищей на шину без особого гемора, да и скорости свои можно задать + корка не сложная..

 

Cyclon3. На проводах никого кроме 2-х плисов. Синхронизация 64 периода, 7 байт данных и 1 адресс. Эта синхронизация для диф. пары

данных и для работы самого плиса. Скорость передачи 100Мб/c.

Для ALTLVDS нужен PLL, для которого в свою очередь нужно время для запуска. Нужно городить самому. Есть предложения?

Share this post


Link to post
Share on other sites

PLL в визарде лучше выбирать встроенную в корку ALT_LVDS. Все работает. проверял на цикло2->циклон3 до 260 мегабит/c по одной линии. единственное требование. CLk должен заходить на входы CLK_IN на плисене. иначе не выдет.

я по началу пытался использовать PLL отдельно сгенерированную - ничего не вышло. самое главное указать на LVDS_RX правильную выходную частоту.

Share this post


Link to post
Share on other sites

2 yudu - идеи есть всегда :biggrin:

100Мб/с - это мегабайты или мегабиты ?? Если это мегабайты - что-то у меня есть сомнения, что по одной паре такое можно вытянуть на 3-м циклоне..

 

На счёт времени запуска PLL - это только в начале, после старта плиски, пару десятков клоков он конфигурироваться будет, а потом выставит валид и будет работать пока питание не пропадёт. Или у вас жёсткие условия начала работы после включения питания ?

 

И на счёт камня - какой именно циклончик ? а то может у вас клок приходит не на дедикейтед лапы и тогда и с ALTLVDS нужно будет тоже сильно колдовать :07:

 

Как говорится - "..огласите весь список пжалуста.." :laughing:

Share this post


Link to post
Share on other sites

А вы правильно подключили ножки ПЛИС? Входной клок подается на ножки DIFFCLK ?

Вместо конструкций: "if (ic='0') then i:=0; sta<='0';" используйте: if falling_edge(inclk) then ...

вместо "if ic='1' then ..." используйте "if rising_edge(inclk) then ..." Если подаете тактовый сигнал, то и используйте его.

 

Если есть сомнения происходит ли передача данных вообще, то можно это посмотреть в SignalTap.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this