Цитата(Flanker @ Aug 17 2006, 16:36)

Не знаю как синхронная статическая ОЗУ, я в проекте совместно со Spartan II использую асинхронную статическую ОЗУ 512Kx32. Читаю данные с LCD порта - формат видео режима TFT 800x600x16 бит. Тактовая частота 40 Мгц. Сохраняю текущий кадр, а предыдущий после обработки выдаю дальше. Все работает замечательно и линий управления у ОЗУ меньше по-сравнению с синхронной.
С асинхронной тоже имели дело - иначе не писали бы. Да, работает она - куда ей деться, но с синхронной работать, во-первых, удобнее, во-вторых, она быстрее. Я делал честный синхронный контроллер памяти (поскольку внутри ПЛИС весь дизайн синхронный), который формировал сигнал nWE строго по тактам. Итого на цикл обращения приходится три системных такта. Мне вот скорость была важна и пришлось задирать системную тактовую аж до 200 МГц, хотя сам дизайн этого не требовал - вполне хватило бы сотни. В итоге, на 200 МГц не уложился по скорости, пришлось опуститься на 160 МГц и еще наворотить тучу констрейнов, чтобы синтез шел как надо - мультициклы всякие, конвейеры вводить, в общем, боролся за скорость из-за одного узла.
Конечно, можно было бы сформировать задержку на ячейках (там допуск приличный) и зафиксировать их, чтобы времянка хотя бы от разводки не плавала, хотя это, имхо, грязный хак, так делать не хотел и не стал. Можно было бы завести два клоковых домена - один на 100 МГц, основной, другой на 200 МГц - для контроллера памяти. Наверное, это был бы самый правильный путь, но когда понимание пришло, уже было поздно, а дивайс и так работал. К тому же и тут даже на 200 МГц обращение составляет 3*5 нс 15 нс, а с синхронной - на 100 МГц за 10 нс. Более того, как показала практика, за 15 нс из Cyclone (спидгрейд 7) в 10 нс память слазить за 15 нс не удается - к 10 нс еще добавляются задержка от выходного триггера до пина, tCO, задержка от пина до входного триггера (при чтении) плюс tSU. Все это в сумме выходит за 15 нс, реально там минимально необходимое время было что-то около 16 нс. В итоге, сделано было на 160 МГц - 3*6.25 нс = 18.75 нс. Т.е. почти вдвое медленнее, чем в случае со 100 МГц синхронной памятью.
Дополнительный гемор с асинхронной памятью состоит в том, что обращение происходит не за один такт, надо специалный сигнал готовности с контроллера памяти на клиентскую сторону выдавать, чтобы оттуда данные и адреса не в каждом такте выдавали, а только по готовности (один раз в три такта в моем случае). С синхронной памятью таких заморочек нет - достучался до контроллера, получил разрешение (там не одно, а несколько устройств в память лазили, арбитр разруливал) и понеслась - сразу весь блок (строку или столбец) записал/прочитал, одно слово на такт.
Тогда же четко осознал, что надо было применять просто синхронную память (с pipeline для скорости), с ней никаких проблем нет - на 100 МГц все работает без вопросов.
Сейчас у меня в текущем дивайсе стоит SDRAM на 100 МГц, и несмотря на то, что SDRAM контроллер значительно сложнее, чем оный для статической памяти, все намного белее и пушистее - 100 МГц, весь дизайн со свистом успевает безо всяких дополнительных констрейнов, мультициклов и прочего, т.е. можно сосредоточиться на целевой задаче, а не бороться за скорость.
Конечно, на 40 МГц все гораздо проще, но и тут возни с задежками не избежать. Реализация по-любому сложнее выходит.
Что касается количества ножек на интрефейс с памятью, то оно где-то одинаковое что в случае с синхронной статикой, что в случае с асинхронной статикой, что в случае со SDRAM, и сооставляет примерно 40 ножек.