ckotinko (ckotinko) wrote,
ckotinko
ckotinko

Categories:

Блоки ввода-вывода для Open source hardware: PHY

В процессе раздумий над процессором возник вот такой вот интересный вопрос: а как мне быть, если я хочу в одной разработке подключить много DDR3, в другой DDR3+PCIe, а в третьей PCIe+периферию, а в четвертой мне нужен LVDS, в пятой я вообще хочу с другим своим чипом говорить? В процессе раздумий пришло в голову: а если я захочу притвориться памятью DDR3? Воспользоваться IP-коркой DDR-контроллера тут уже нельзя, она разом обрубает все остальные опции, то же и про PCI-e. Делать разные чипы не вариант - стоимость разработки и масок запредельная. Даже безмасочная литография особо не поможет, все равно жадно.

Кстати идея на самом деле очень годная для малых проектов в связи со скорым наступлением эры дешевой безмасочной литографии(если Эдгар Кейси не подведёт и мегавойны не будет). Перед ними в лёгкую может стать вопрос "куда сбывать свои камни": например в мобилы, в микроконтроллеры, в станки всякие, в телевизоры, и т.д. и т.п. Лучшим решением было бы "сбывать везде где возьмут", но для этого надо уметь ко всем подключаться нативно, без лишних микросхем.

Так вот, от нечего делать по вечерам, я стал придумывать, как нам обустроить обмен данными между процом и памятью. процом и платами в слотах, процом и другим процом, разными микросхемами на платах в слотах. В общем, захотел что-то универсальное. Поскольку думать вслух эффективнее, я буду думать вслух прямо в ЖЖ.
Первое, с чего надо начать это PHY. Это такой блок, который подключен прямо к ножке,  сразу за электрозащитой из диодов. Он формирует входное и выходное сопротивление. Для того, чтоб понять, какие сопротивления эмулировать, я обратился к мануалам: раз, два, три, четыре, пять.

Для DDR3-DDR4 требуется собирать эти сопротивления из калибруемых резисторов по 240ом. То есть берется резистор 250-260ом и ему в параллель включают едва-открытые транзисторы, чуток отъедающие сопротивления. Набор сопротивлений: входное: 120, 60, 40. Выходное: 34 или 40. У PCI-e немного другой стандарт: входное 50, выходное 33 или 27. USB2.0 требует заземления на 45ом, + 45ом выходного сопротивления на Vio для медленного режима. Быстрый режим жалит током прямо в линию. USB3.0 требует от 72 до 120 ом дифференциального(36/60) на вход + 18-30 ом на выход.

С DDR все довольно просто: мы калибруем резисторы(по 7 шт к Vio и 7 шт к gnd) на 240 ом, и создаем сопротивления следующими наборами:
In(120): 1/1 (2/0 для DQ DDR4)
In(60): 2/2 (4/0 для DQ DDR4)
In(40): 3/3
Out(40): 6 вверх или 6 вниз
Out(34): 7 вверх или 7 вниз

Для PCI-e резисторы калибруем на 200 ом:
In(50): 2/2
Out(33): 6 вверх или 6 вниз
Out(28,5): 7 вверх или 7 вниз(8/8?)

Для USB-2.0 резисторы калибруем на 240ом:
In(45): 5 вниз (48ом попадает в 45+-10%)
Out(45): 5 вверх + 5 вниз

Для USB-3.0 резисторы калибруем на 240ом:
In(60): 2/2
Out(30): 8/8?
Или
резисторы калибруем на 200ом:
In(50): 2/2
Out(28): 7/7

LVDS вроде как 50 ом.

Итого: 200 и 240 Ом. 7 резисторов на каждое питание.

Уровень сигнала: PCI-e 0.4-1.2 вольта дифференциального, от приёмника мы отвязаны конденсаторами, то есть 0.6 +- 0.6. Для DDR пишут, что Vtt = 0.6. Размах тоже 0.6 для 1333мгц и 0.1-0.2 для 1600мгц. PCI-e требует еще и срезать уровень сигнала в ряде ситуаций. То есть получается что-то вот такое:

По току и мощности: PHY должна выдерживать 90мА тока(требование PCI-e самое жесткое), но нужно ли нам это в реальности? Мы же не собираемся зевсом работать, да и hotplug - не наша стихия. DDR3 требует до 40мА, вполне хватит. Мощность на 90мА, 90*90*30*10е-6 = 0.243 ватта. На отдельный 240-омный резистор приходится 0.04ватта. Отдельный ключевой транзистор, включающий ток через резисторов, должен выдерживать ток 15мА или даже 20. Буржуи пишут, что на 65нм транзисторы I/O дают 600 и 340 uА/uМ. Это дает нам длину затвора транзистора в 33 и 58uM. Что-то жирно, давайте на 40мА ориентироваться.

Каждая пара PHYшек может образовывать либо дифф.пару, либо 2 независимые линии. Для получения цифрового выхода нам потребуется 2-3 компаратора. По идее хватит двух, но что-то подсказывает мне что надо ставить сразу 2: два независимых и один дифференциальный. Не помню уже почему но знаю что надо.

Далее, мы организуем PHYшки в группы по 5 пар, 10 выводов+2 питание. Сигналы ProgClock соединяем параллельно, сигналы Prog/ProgOut последовательно. На перенастройку всего блока будет уходить 440 бит. Прошивать следует при Enable=0.

В зависимости от режима, внешние выводы блока могут иметь следующие задачи:
Режим 0 1 2 3 4 5 6 7 8 9 10 11
DDR3 data V_io DQS #DQS D0 D1 D2 D3 D4 D5 D6 D7 GND
DDR3 ctl A0 A1 A2 A3 A4 A5 A6 A7 A8 A9
A10 A11 A12 A13 A14 A15 BA0 BA1 BA2 ODT
CLK #CLK CAS RAS WE CS1 CS2 #RST CKE #CKE
PCI-e CLK #CLK TX0+ TX0- TX1+ TX1- TX2+ RX2- TX3+ TX3-
#WAKE N/A RX0+ RX0- RX1+ RX1- RX2+ RX2- RX3+ RX3-
USB CLK #CLK TX0+ TX0- RX0+ RX0- TX1+ TX1- RX1+ RX1-
LVDS CLK #CLK R0 R1 R2 R3 R4 R5 R6 R7
HS VS G0 G1 G2 G3 G4 G5 G6 G7
CNTL DEN B0 B1 B2 B3 B4 B5 B6 B7
GPIO CLK #CLK TX0+ TX0- RX0+ RX0- TX1+ TX1- RX1+ RX1-
GPIO CLK #CLK D0 D1 D2 D3 D4 D5 D6 D7
То есть из 4х блоков мы соберем 8битный DDR-контроллер, из 7 - 32хбитный, из 11 - 64битный. Из одного блока мы можем сделать 2 USB, из 2х - PCI-e x4. LVDS-интефейс сожрет 3 блока. Возможно что-то еще забыл, но того что есть уже хватит для начала работы над логической частью.
Tags: mygpu, железо
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments