Оперативная память необходима для хранения выполняемого машинного кода во время работы устройства, а также хранения входных и выходных данных, подлежащих обработке [1–10].
Рассмотрим один из вариантов реализации оперативной памяти. Зададим период синхроимпульса 5 нс, что означает частоту работы нашей оперативной памяти 0,2 ГГц. Для усложнения задачи и приближения ее к реальной добавим несложное условие записи. Будем записывать числа в память, если они больше 5.
Также нам необходимо заранее определить, сколько данных сможет вместить в себя память и сколько бит может содержать каждое данное. Пусть число ячеек памяти будет равно 10 и каждая ячейка будет вмещать в себя 5 бит. Также нужно после записи всех ячеек ввести запрет на запись новых данных. В противном случае при большом числе входных данных у нас постоянно будет происходить перезапись и сама идея оперативной памяти потеряет свой смысл.
В соответствии с этим, сколько бы данных мы ни подали на вход, после записи всех ячеек при поступлении новых данных они будут просто «проходить» мимо не влияя на нашу память.
В качестве программных функций будем использовать главный файл программы, содержащий описание логики работы нашего устройства, тестировочный файл, в который будем передавать значения наших сигналов:
clk — синхросерия;
reset — сигнал сброса;
en — разрешающий сигнал;
shd — шина данных, содержащая значения входных данных, которые приходят в каждом такте;
razmer — сигнал, определяющий количество ячеек, в которые будет производиться запись, а также файл симуляции, в котором потактово отображаются значения всех сигналов.
Также хотелось бы отметить, что для корректных записи и чтения необходимо формировать адреса, по которым будут записываться и считываться числа. Для этого потребуется два счетчика — на входе и на выходе. Когда данные поступают на вход, счетчик начинает работать и формировать адреса. Как только сформировали адреса, равные количественно сигналу razmer, у нас появляется сигнал zapret, который запрещает дальнейшую запись данных в память, что соответствует алгоритму работы нашего устройства. Одновременно с этим этот же сигнал дает нам разрешение на чтение данных из памяти. В этот же момент начинает формирование выходных адресов наш второй счетчик, что и позволяет получать на выходе не одно и то же данное, а разные данные из каждого адреса.