Цитата(andrew_b @ Dec 12 2014, 13:14)

Регистры, которые надо читать, сидят в трёх клоковых доменах с некратными частотатми. Переносить их в один домен мне кажется несколько некрасивым. Кроме того, максимальная частота внутри ПЛИС примерно 65 МГц. Если работу с EMIF "привязать" к ней, то надо увеличивать setup/strobe/hold у EMIF и таким образом несколько его затормозить, чего не хотелось бы.
В таком случае, так:
1) Во всех трех доменах нужны синхронизаторы по два триггера на каждый из входных сигналов.
2) Для всех входных сигналов (адрес, данные, т.п.) во всех доменах указать set_input_delay так, чтобы Tsu у FPGA было бы меньше, чем период клока EMIF-а за минусом максимального Tco этих сигналов у EMIF и некоего маленького запаса.
3) Адрес и управление анализировать ТОЛЬКО когда EMIFOE с выхода синхронизатора стал активен. При этом, при таком set_input_delay, как описано в 2) есть 100% гарантия валидности адреса и остальных сигналов управления, так как они реально активизируются раньше, чем OE.
4) данные выдавать на выход, соответственно, на следующем клоке после анализа адреса. Для них установить какое-то определенное Tco.
Ну и EMIF запрограммировать так, чтобы гарантировать такую длительность OE, чтобы оно прошло через синхронизаторы во всех трех доменах (2.5 клока самого медленного домена), плюс еще 1 клок самого медленного домена на выдачу данных, плюс Tco из п.4)
Это вариант №1. синхронный внутри FPGA. Еще есть вариант №2, если внутри FPGA сделать асинхронную дешифрацию адреса и асинхронные флаги чтения. Но этот вариант не всегда реализуем, но более эффективен по скорости. Там все придется констрейнить через set_max_delay и set_min_delay.
В варианте номер 2 - строится асинхронный дешифратор адреса и мультиплексор с регистров ядра FPGA на выход данных. сигнал OE управляет непосредственно тристейтами выходных буферов. Все констрейнится через set_max_delay от входов адресов и CS-ов и до выхода данных, на какое то условное значение, физически реализуемое в проекте. И, соответственно этому настраивается EMIF.
Флаги, что произошло чтение соотв. регистра, реализуются с использованием сигнала OE (заднего его фронта) как клока, и сигналов дешифрации адреса, как разрешения установки флага. при этом задаются констрейны типа set_input_delay для адресов и CS-ов относительно OE. Эти флаги пропускаются в ядро FPGA через синхронизаторы из двух триггеров, и сбрасываются из ядра асинхронно, импульсами длиной в 1 клок соотв. клок-домена. Эти же флаги используются как сигнал READY EMIF-а, чтобы растянуть цикл, если он задумает читать данное раньше, чем ядро фпга его обновило (то есть, пока флаг в единице).
READY формируется асинхронно пропусканием соответствующих флагов согласно адресу читаемого регистра, и констрейнится так же, как данные.
Эти флаги нужны только таким регистрам, которые передают данные, которые же передают статусы, или являются управляющими (то есть, и пишутся только через EMIF, используя его же WE как клок), флагов и READY не требуют. Это вариант предпочтителен и по скорости, и по area, но многие имеют перед ним предрассудки - комплекс боязни асинхронных схем. На всякий случай, для READY можно описать еще и set_output_delay относительно клока OE.
Если вариант 2 непонятен из описания словами, могу нарисовать его на верилоге.