Понимание битового потока, сгенерированного для тайлов ввода-вывода iCE40
Когда я синтезирую пустую схему, используя Yosys и arachne-pnr, я получаю несколько неправильных битов:
.io_tile 6 17
IoCtrl IE_1
.io_tile 6 0
IoCtrl REN_0
IoCtrl REN_1
Они также являются частью любого другого файла, который я мог сгенерировать до сих пор. Поскольку для неиспользуемой плитки ввода-вывода установлены оба бита IE, я читаю это как:
- для блока IE/REN 6 17 0 входной буфер включен
- для блока IE/REN 6 0 0 входной буфер включен, а нагрузочный резистор отключен
- для блока IE/REN 6 0 1 входной буфер включен, а нагрузочный резистор отключен
Однако, согласно документации, нет блока IE/REN 6 17 0. Что означают эти биты? Если бит IE блока 6 17 0 не установлен, потому что блок не существует, почему не сбрасываются и биты других блоков, которые не существуют? Кажется, что другие блоки IE/REN соответствуют блокам ввода / вывода 6 0 1 и 7 0 0. Что делают эти блоки и почему они всегда конфигурируются как входы?
Запись в библиотеке технологий для SB_IO
не упоминает бит IE. Как это связано с настройками параметра PIN_TYPE?
Когда я использую вывод ввода / вывода в качестве входа, устанавливается бит REN (нагрузочный резистор отключен). Это говорит о том, что подтягивающие резисторы предназначены, прежде всего, для удержания неиспользуемых штырей от плавания, а не для обеспечения подтягивающего резистора для условно подключенных входов (например, кнопок). Это предположение верно? Можно ли использовать для этого внутренние подтягивающие резисторы?
Библиотека технологий говорит следующее:
defparam IO_PIN_INST.PULLUP = 1'b0;
// By default, the IO will have NO pull up.
// This parameter is used only on bank 0, 1,
// and 2. Ignored when it is placed at bank 3
Означает ли это, что в банке 3 нет подтягивающих резисторов или просто они не могут быть повторно включены с помощью Verilog? Что произойдет, если я очищу этот бит в битовом потоке ASCII вручную? (Я бы попробовал это, но оценочная плата iCEstick не делает ни одного булавки на банке 3 доступным - совпадение? - и я не уверен, хочу ли я еще связываться с аппаратным обеспечением.)
Когда я использую вывод ввода / вывода в качестве выхода, бит IE не очищается, но функция входного вывода установлена на PIN_INPUT. Какой эффект это имеет, и почему это сделано?
2 ответа
Поведение по умолчанию для неиспользуемых выводов ввода-вывода состоит в том, чтобы включить нагрузочные резисторы и отключить входное разрешение. На чипах iCE40 1k это означает, что IE_0 и IE_1 установлены, а REN_0 и REN_1 очищены в неиспользуемом тайле ввода-вывода. (На чипах 8 КБ IE_* имеет высокий активный уровень, то есть все биты очищаются в неиспользуемом тайле ввода-вывода на 8 КБ.)
icebox_explain
по умолчанию скрывает тайлы с "неинтересным" содержимым. (Бежать icebox_explain -A
отключить эту функцию.)
Это выглядит как arachne-pnr
не устанавливает те биты для выводов ввода / вывода, которые недоступны в текущем пакете. Таким образом, вы получаете необычный битовый шаблон в некоторых тайлах ввода-вывода, которые содержат биты IE/REN для блоков ввода-вывода, не подключенных ни к одному выводу пакета.
Вот как выглядит "обычная" неиспользуемая плитка ввода-вывода в архитектуре 1k:
$ icebox_explain -mAt '1 0' example.asc
Reading file 'example.asc'..
Fabric size (without IO tiles): 12 x 16
.io_tile 1 0
B0 ------------------
B1 ------------------
B2 ------------------
B3 ------------------
B4 ------------------
B5 ------------------
B6 ---+--------------
B7 ------------------
B8 ------------------
B9 ---+--------------
B10 ------------------
B11 ------------------
B12 ------------------
B13 ------------------
B14 ------------------
B15 ------------------
IoCtrl IE_0
IoCtrl IE_1
Можно ли использовать для этого внутренние подтягивающие резисторы?
Да.
В записи библиотеки технологий для SB_IO не упоминается бит IE. Как это связано с настройками параметра PIN_TYPE?
когда D_IN_0
или же D_IN_1
от SB_IO
связано с чем-то, то это подразумевает IE.
Когда я использую вывод ввода / вывода в качестве выхода, бит IE не очищается
Обратите внимание, что IE активен на низком уровне на 1 000 фишек и активен на высоком уровне на 8 000 фишек. Когда вы используете вывод ввода / вывода в качестве вывода только для выхода на устройстве 1k, тогда должен быть установлен соответствующий бит IE, в противном случае он должен быть очищен.
Я нашел объяснение, поэтому я делюсь им здесь для дальнейшего использования:
.io_tile 6 17
IoCtrl IE_1
Блок ввода-вывода 16 7 0 подключен к выводу в некоторых пакетах, но не в пакете TQFP.
.io_tile 6 0
IoCtrl REN_0
IoCtrl REN_1
Это соответствует блокам ввода / вывода 6 0 1 и 7 0 0 (выводы 49 и 50), в входные тракты которых подаются тактовые импульсы PLL PORTA и PORTB соответственно.