Как использовать BRAM, если он не нужен модулю? - PullRequest
0 голосов
/ 24 декабря 2018

Я работаю над (на первый взгляд) простым проектом в качестве учебного упражнения: подключение дисплея PMOD 96x64 на основе SSD1331 через iCEstick (FPGA Lattice iCE40HX-1k) к ПК, чтобы я мог отправить некоторое изображение в кодировке RGB565 через USB нана указанном дисплее.

Дело в том, что дисплей SSD1331 требует процедуры инициализации, чтобы просто перейти в состояние «чистый черный экран».В контроллере дисплея должно быть около 20 команд;длина варьируется от 1 до 5 байтов, всего 44 байта.

До сих пор я написал модуль Verilog pwr_on с FSM для переключения команд в PMOD в правильной последовательности;значения для команд определены как localparam.Все отлично работает но всегда есть но.Я полагал, что все эти командные константы хранятся в LUT (я не определяю какие-либо блоки оперативной памяти, и куда они еще пойдут, не так ли?), И только с 1280 LUT, доступными в iCE40HX1k, используется около сотни из них для процедуры инициализации, которая требуетоколо 150 мсек и никогда не требуется, пока следующий сброс не станет бесполезным.

Теперь я вижу следующие способы решения этой проблемы:

  1. Не реализовывать initпоследовательность в FPGA вообще;вместо этого отправьте эти команды через USB.
    Просто, но не так интересно;в конце концов, я пытаюсь изучить программирование на ПЛИС, а не драйверы для Linux.
  2. Воспользуйтесь преимуществами SB_WARMBOOT и мультиконфигурацией.
    iCE40HX может иметь до 4 конфигураций, хранящихся в EEPROM;SB_WARMBOOT Примитив позволяет прыгать между ними по желанию.Я мог бы запрограммировать процедуру инициализации в конфигурации 0, и как только она закончилась, перейдите к конфигурации 1 с поддержкой USB, таким образом, имея чистый лист.Однако мне нужно удерживать как минимум 3 вывода PMOD дисплея (pmod_enable, vcc_enable и pmod_rstn) на высоком уровне при переходе между конфигурациями.Я не могу найти никаких средств для этого;если кто-нибудь знает, пожалуйста, отправьте мне в правильном направлении.
  3. Храните данные команд в BRAM.
    HX1K имеет 16 блоков RAM4K (каждый хранит 4096 бит), поэтому даже один из них должен обеспечить достаточно места для 44 байтовкомандных данных без расходования ценных LUT.

Вариант 3 выглядит достаточно простым.Тем не менее, будучи скандалом о моих ресурсах, я бы хотел, чтобы этот блок RAM4K был доступен для других задач после завершения init.Теперь мне кажется, что синтезатор Verilog (я использую yosys) полностью забывает о том факте, что когда модуль pwr_on поднимает done провод высотой, ячейка BRAM, к которой он был подключен, может быть повторно использована при выводе другой логики.

Одним из решений, которое приходит на ум, является выделение этого блока BRAM в отдельном модуле, заполнение его данными, необходимыми для init, и подключение его к модулю pwr_on, а затем при необходимости подключите его к другим модулям.И все же этот подход выглядит некрасиво по нескольким причинам, поэтому возникает вопрос: есть ли уловка, которую я пропускаю?Как можно использовать один блок BRAM в, скажем, конфигурации SB_RAM512x8 для одного модуля, а затем повторно использовать его как SB_RAM256x16 для другого?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Мультиплексировать адрес чтения для EBR, используемого для данных конфигурации PMOD

EBR из ice40, насколько мне известно, не может изменить WRITE_MODE и READ_MODE во время работы (пожалуйста, исправьте меня, если янеправильно).Следовательно, я бы предложил создать экземпляр вашего EBR в конфигурации, которую вы хотите использовать после инициации PMOD.Содержимое EBR должно включать в себя данные конфигурации для PMOD, заданные обычным способом через INIT_0 - INIT_F.

Адрес чтения для EBR должен быть множеством адресов из FSMуправление инициацией PMOD и адресом, используемым после инициации, это будет стоить всего около 8 LUT.

0 голосов
/ 24 декабря 2018

Я использую Xilinx, но различия между основными строительными блоками в FPGA невелики.

Я быстро выполнил поиск "Lattice BRAM" и обнаружил, что памяти Lattice, как и в Xilinx, являются двойными портами.Это означает, что вы можете получить доступ к памяти из двух мест.Вы должны проверить, есть ли у вашего устройства эта опция.

Если это так, решение состоит в том, чтобы создать экземпляр двухпортовой памяти и использовать ее сначала в качестве ПЗУ для инициализации дисплея.Затем используйте другой порт, чтобы использовать BRAM в качестве обычной памяти.Большим преимуществом является то, что вся логика для доступа к двум портам уже на кремнии, поэтому вам не нужно использовать какую-либо программируемую логику для этого.содержимое.Обычный сброс не будет.

Остается проблема инициализации содержимого ОЗУ при запуске.Я знаю, что это можно сделать в Xilinx, поэтому вам нужно поискать эквивалентную заметку о приложении Lattice.

...