Я работаю над (на первый взгляд) простым проектом в качестве учебного упражнения: подключение дисплея 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 мсек и никогда не требуется, пока следующий сброс не станет бесполезным.
Теперь я вижу следующие способы решения этой проблемы:
- Не реализовывать initпоследовательность в FPGA вообще;вместо этого отправьте эти команды через USB.
Просто, но не так интересно;в конце концов, я пытаюсь изучить программирование на ПЛИС, а не драйверы для Linux. - Воспользуйтесь преимуществами
SB_WARMBOOT
и мультиконфигурацией.
iCE40HX может иметь до 4 конфигураций, хранящихся в EEPROM;SB_WARMBOOT
Примитив позволяет прыгать между ними по желанию.Я мог бы запрограммировать процедуру инициализации в конфигурации 0, и как только она закончилась, перейдите к конфигурации 1 с поддержкой USB, таким образом, имея чистый лист.Однако мне нужно удерживать как минимум 3 вывода PMOD дисплея (pmod_enable, vcc_enable и pmod_rstn) на высоком уровне при переходе между конфигурациями.Я не могу найти никаких средств для этого;если кто-нибудь знает, пожалуйста, отправьте мне в правильном направлении. - Храните данные команд в 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
для другого?