Цитата(YGin @ Jul 28 2006, 13:57)

1 Зачем там по выходу 2 бита инф?
при внимательном чтении харра становится понятно, что:
Цитата
...локальный синхросигнал будет вероятно чуть быстрее или чуть медленнее, чем поступающий поток синхросигнала/данных, и поэтому будет цикл синхросигнала, в котором принятые данные либо недействительны (локальный синхросигнал быстрее), либо потребуется два бита данных (локальный синхросигнал медленнее). По мере "премещения" синхросигнала/данных во времени, может быть использован мультиплексор, для выбора данных от одной из четырёх имеющихся временных областей, но за двумя исключениями. Если схема перемещается из области А в область D, то выходящие данные фактически будут недействительны. Это индицируется пользователю переходом сигнала data valid (DV) в низкий уровень. Если схема перемещается из области D в область A, то потребуется сгенерировать два бита данных. Это индицируется пользователю установкой обоих битов data valid в высокий уровень. (рис.6). В реальной системе, эти события происходят непрерывно но случайным образом, по мере перемещения схемы из-за дрожания синхросигнала (clock jitter) и схождения глазковой диаграммы данных (data eye closure), но выход данных всегда будет действительным, согласно наличным битам данных. Например, при локальном синхросигнале 401 МГц (период 2.506 нс) и поступающем потоке данных 400 Мб/с (период 2.500 нс), принятые данные будут недействительными (DV=”0”) приблизительно каждые 416 циклов локального синхросигнала.
Противоположный случай: локальный синхросигнал может быть 400 МГц, а поступающий поток данных 401 Мб/с. В этом случае, два бита данных будут генерироваться в среднем каждые 416 циклов синхросигнала. В случае когда частоты номинально одинаковы, например два отдельных кварцевых генератора, разница в частотах будет несколько ppm (в любом направлении), и будет видно, что схема качается между выдачей нуля, одного или двух битов действительных данных в каждом синхросигнале приёмника, но данные всегда извлекаются корректно.
Цитата(YGin @ Jul 28 2006, 13:57)

2 как правильно написать shift регистер?
тут так сразу с кондачка и не сообразить. Возможно следует придерживаться рекомендаций:
Цитата
Как было ранее отмечено, в каждом цикле синхросигнала приёма, схема восстановления данных генерирует ноль, один или два бита данных. На рис.5 это SDATA(1:0), а их действительность индицируется DV(1:0). Первый принятый бит будет SDATA(0). Второй принятый бит будет SDATA(1), когда он действителен. Эти биты будут обычно синхронно поступать в FIFO, для дальнейшей обработки разрядности 8, 16 или 32 бита. Пусть требуются 8-разрядные данные, тогда потребуется чуть более сложная логика, чем казалось сначала. Обычно биты принятых данных передаются в сдвиговый регистр для “распараллеливания”, и когда синхронно вошло восемь битов, результирующее 8-разрядное слово синхронно поступает в FIFO. Но поскольку схема восстановления данных может потенциально генерировать два бита данных в каждом синхросигнале, следует рассматривать случай, где счётчик принятых битов переходит из 7 в 9.
Здесь наилучший путь – использовать 9-разрядный сдвиговый регистр. Если в цикле синхросигнала нет в наличии битов данных, сдвигатель и ассоциированный с ним счётчик остаётся статичным. Если в наличии один бит, он вдвигается в MSB, и счётчик инкрементирует на 1. Если в наличии два бита, они оба синхронно входят, перемещая сдвиговый регистр на две позиции и инкрементируя счётчик на 2. Если счётчик достигает 8, то действительный байт представлен в битах с 1 по 8 сдвигового регистра, а если счётчик достигает 9, то действительный байт представлен в битах с 0 по 7 сдвигового регистра. Поэтому действительные данные могут передаваться к FIFO (или напрямую к остальной части системы) с использованием простейшего мультиплексора.
Следует также заметить, что нет никакой гарании, что первые несколько принятых битов будут корректны, т.к. в это время схема будет “выискивать” корректные фазовые соотношения. Это относится к первым восьми принятым битам, после чего данные будут действительными.
успехов!