Использование IP Gowin для BSRAM

Для того, чтобы использовать BSRAM, можно взять готовые компоненты, называемые IP, которые предоставляют вендоры. В нашем случае, это компания Gowin.

Создадим же модуль с однопортовой bsram.

Для этого в ide нужно нажать на значок с тремя кубиками на верхней панели (или Tools → IP Core Generator).

ip icon

После чего откроется меню для выбора нужного IP (здесь же есть ссылки на документацию к разным IP, если нажать один раз). Нас интересует память, так что выбираем соответствующий модуль (Memory → Block Memory → SP (от Single Port)).

ip cores

Кликнув дважды, вам откроется меню для конфигурации модуля с памятью. Слева показана схема итогового модуля, а справа настройки. По умолчанию общие настройки будут для вашей платы, там вы можете поменять и папку, в которой будет лежать сконфигурированный модуль. Самыми интересными для нас параметрами (более подробно про которые можно прочитать в UG300E) являются:

  • Address Depth — это количество адресуемых ячеек памяти. Для наших целей считаем, что это ширина изображения — 640 пикселей, так что выставляем 640.

  • Data Width — количество бит для одной ячейки. В нашем случае это один байт.

  • Read mode — режим чтения: будет ли использоваться дополнительный регистр для чтения (bypass — не будет; pipeline — будет). Это влияет на задержку в один такт для чтения. При выборе bypass мы будем меньше думать о задержках, но снизим себе максимальную частоту схемы. Выбираем pipeline.

bsram config

После этого, в соответствующей папке появится модуль с сконфигурированным под наши нужды IP. Если на него внимательно посмотреть, то можно заметить несколько вещей

  1. Тут нет никакой магии, этот модуль можно было бы написать и руками.

  2. Он использует другой модуль SP. Соответственно, надо позаботиться о том, чтобы симулятор его видел. Для этого нужно iverilog-у прописывать путь к реализованным IP. У нас это $FPGA_TOOLS/simlib/gw1n/prim_sim.v.

  3. У него довольно сложный интерфейс, в котором нужно разобраться. Описание портов есть в документации или, для нашей конфигурации, в табличке ниже.

Название порта Вход/Выход Описание

din[7:0]

Вход

Входной сигнал данных

dout[7:0]

Выход

Выходной сигнал данных (совпадает по типу с входным)

ad[9:0]

Вход

Адрес, по которому происходит чтение/запись

wre

Вход

Сигнал разрешения записи: 1 - запись; 0 - чтение

ce

Вход

Тактовый разрешающий сигнал. При ce=0 память игнорирует все операции

clk

Вход

Тактовый сигнал

reset

Вход

Сигнал сброса. Поддерживает синхронный и асинхронный сброс. Сбрасывает управляющие регистры, но не данные в памяти

oce

Вход

Сигнал разрешения вывода данных (только для Pipeline-режима): 1 - обновлять выход do; 0 - сохранять предыдущее значение

Не используется в Bypass-режиме.