Понимание примитива SB_IO в решетке ICE40 - PullRequest
0 голосов
/ 31 марта 2020

Я играю с cliffordwolf / picorv32 и у меня возникли проблемы с пониманием следующего фрагмента в picosoc ( ссылка на источник ):

SB_IO #(
    .PIN_TYPE(6'b 1010_01),
    .PULLUP(1'b 0)
) flash_io_buf [3:0] (
    .PACKAGE_PIN({flash_io3, flash_io2, flash_io1, flash_io0}),
    .OUTPUT_ENABLE({flash_io3_oe, flash_io2_oe, flash_io1_oe, flash_io0_oe}),
    .D_OUT_0({flash_io3_do, flash_io2_do, flash_io1_do, flash_io0_do}),
    .D_IN_0({flash_io3_di, flash_io2_di, flash_io1_di, flash_io0_di})
);

Я нашел описание графики c для примитива SB_IO в документации по библиотеке технологий Lattice iCE40 , но я до сих пор не могу понять его назначение, потому что он слишком сложен для интерпретации. есть еще один вопрос о примитиве, после прочтения которого я предположил, что он создает какое-то двунаправленное соединение, но я не смог понять, как это связано с тем, что выходной контакт "тристамирован".

Буду признателен за высокоуровневое описание эффекта ячейки SB_IO при данной конкретной конфигурации. Какой вывод подключен к какому выводу? Какие входы и какие выходы? Какова цель создания этой ячейки?

1 Ответ

2 голосов
/ 02 апреля 2020

Этот экземпляр использовался, потому что в то время Yosys не очень хорошо поддерживал тристаты в Verilog, сейчас он работает, но в целом поддержка тристата в цепочках FPGA не всегда является надежной.

Его можно заменить на следующий шаблон c Verilog, повторяется 4 раза от 0 до 4.

assign flash_io0 = flash_io0_oe ? flash_io0_do : 1'bz;
assign flash_io0_di = flash_io0;
...