AS> Что то я никак не могу найти доступного ОЗУ приличной емкости (не меньше AS> 256(!) байт или полубайт) с разделенными входами и выходами. Емкость в AS> тысячи байт/полубайт тоже годится. Желательна скорость <<50 нс. Было у меня AS> почему то представление, что кэши старые строились на чем то похожем - но AS> там обычные ОЗУ с совмещенными IO.
AS> Для чего это надо - чтобы сделать "двухпортовое" ОЗУ большой емкости (а вот AS> зачем нужно это - объяснять уж совсем долго). Представляется, что это можно AS> сделать объеденив по входам данных два ОЗУ (и объединив адресные входы на AS> время записи). Реальная двухпортовость не нужна - важнее размер ОЗУ и цена, AS> а то можно было бы готовые чипы использовать - регистровые файлы (мала AS> емкость) или двухпортовки ОЗУ (цены сильно за 100 баксов и архитектура все AS> равно не подходящая).
Варианты:
1) Обычное статическое ОЗУ + ПЛИС. Лучше синхронную память юзать.
[+] Полная гибкость. [+] Приличный объем (хоть мегабайты). [-] Сложность (относительная, конечно) реализации.
2) Двухпортовая память. Делает, например Cypress.
[+] Высокая пропускная способность. [+] Приличный объем (хоть мегабайты). [+] Реализация проще, чем в 1, хотя без логики не обойтись. [-] Гибкости полной нет (если не требуется, то это не минус). [-] Требуется много ног на ввод-вывод (в случае ПЛИС, например).
3) Специализированные МС FIFO. Делают, например, Cypress, IDT.
[+] Высокая пропусаная способность. [+] Объем от 2К до 8К+. Организация 8/16/32/9/18 бит. Есть двунаправленные. [+] Реализация простая. [-] Гибкости полной нет (если не требуется, то это не минус).
4) Использовать FPGA с внутренней памятью в качестве FIFO.
[+] Реализация простая, все в одном кристалле. [+] Полная гибкость. [-] Небольшие (по сравнению с МС памяти) объемы.
Учитывая, что надо всего 256 байт (не килобайт), я бы остановился на последнем, 4-м варианте. Например, Циклон (Альтера) EP1C3 стОит порядка $20-25, в нем почти 60 килобит двухпортового ОЗУ на 200 МГц. Т.е. 13 блоков, каждый из которых может быть сконфигурирован как 256х16. Т.е. в сумме можно получить емкость три с лишним килослова. К тому же вся сопутствующая логика там же. Реализация очень простая. Вот пример (из рабочего проекта) FIFO 256х16 (Verilog):
// -------------------------------------------------------- module MFIFO_256x16 ( input clk, input reset,
input [15:0] datain, output [15:0] dataout,
output reg [8:0] count,
input write, input read );
reg [7:0] First; reg [7:0] Last;
DP_RAM256x16 Pool ( .data(datain), .wren(write), .wraddress(Last), .rdaddress(First), .clock(clk), .q(dataout) );
always @(posedge clk, posedge reset) begin if(reset) begin First <= 0; Last <= 0; count <= 0; end else begin if(write && read) begin Last <= Last + 1; First <= First + 1; end else if(write) begin Last <= Last + 1; count <= count + 1; end else if(read) begin First <= First + 1; count <= count - 1; end end end endmodule
// --------------------------------------------------------
Модуль памяти (DP_RAM256x16) сгенерен Квартусовской тулзой - MegaWizard Plugin Manager'ом, там все просто. Модуль FIFO синхронный, все работает по клоку. В принципе этот модуль может быть и одним в проекте (головным), если больше ничего не надо. Понятно, что функциональность можно легко расширить, введя флаги FULL и EMPTY, как это принято в стандартных реализациях. Но мне было удобнее вместо этого просто вывести наружу текущее количество элементов 'count' и внешними средствами контролировать процесс наполнения/опустошения буфера.
Можно еще дешевле решение получить, если использовать более скромный по ресурсам чип EP1K10 (Альтера, ACEX). У него всего три блока и память не такая быстрая. Но для 256 байт должно хватить с многократным запасом. Память тоже двухпортовая. Стоит такая микруха порядка $10-12.
Ну и еще плюс конфигуратор. Тоже, правда, денег стоит. Могу напутать (давно уже с этим не имел дела), но для ACEX годится флешовый конфигуратор AT17C512, стОит тоже порядка 10 зеленых. Для Циклонов есть новые EPCS1, тянет на 4-5 баксов. Может ли он грузить ACEX, не знаю, не выяснял это специально (похоже, что нет, т.к. он для схемы Active Serial, а ACEX использует Passive Serial). Более дешевый вариант можно получить при использовании дешевого МК + DataFlash. Тут, правда, реализация позамороченнее.
В общем, при указанных требования по объему FIFO я бы смотрел на последние два варианта: 3-й - максимально дешевый и простой (CY7C4201V - $10-15, зато больше ничего не надо), 4-й - тоже простой, относительно недорогой и максимально гибкий - там можно еще много чего помимо FIFO наворотить, если надо. Первые два варианта годятся, если надо большие объемы.