Ввод-вывод с отображением памяти и ввод-вывод с отображением портов в микроконтроллерах

Я читал о сопоставлении внешних периферийных устройств с микроконтроллерами.

Я понимаю, что ввод-вывод с отображением памяти означает, что одно и то же адресное пространство в микроконтроллере может использоваться для внутренней памяти, а также для отображения внешних периферийных устройств. Поэтому для связи с внешними устройствами можно использовать те же инструкции, которые мы обычно используем.

Ввод-вывод с сопоставлением портов означает, что существует определенное адресное пространство, специально используемое для сопоставления внешних периферийных устройств. Иногда для доступа к периферийным устройствам через это адресное пространство необходимо использовать специальные инструкции.

Очевидно, здесь мы можем видеть преимущества ввода-вывода с отображением памяти. Тем не менее, я прочитал по ссылке ниже, что

«Недостаток метода ввода-вывода с отображением памяти заключается в том, что вся адресная шина должна быть полностью декодирована для каждого устройства. Например, машине с 32-битной адресной шиной потребуются логические вентили для правильного разрешения состояния всех 32 адресных линий. декодировать конкретный адрес любого устройства. Это увеличивает стоимость добавления оборудования к машине».

Может кто-нибудь, пожалуйста, объясните это, поскольку я не могу этого понять. Зачем микроконтроллеру декодировать 32-битную адресную шину таким образом?

https://www.bogotobogo.com/Embedded/memory_mapped_io_vs_port_mapped_isolated_io.php

Вы знакомы с тем, что такое декодирование адреса
Ну, вам не нужно декодировать всю шину, но тогда вы получите недоступное адресное пространство (конкретное периферийное устройство может иметь более одного адреса).

Ответы (2)

Утверждение в его нынешнем виде ложно или, по крайней мере, неполно.

Обычно инструкция ввода-вывода активирует некоторые специальные выводы на контроллере, чтобы отличить операцию ввода-вывода от операции с памятью.

Вышеупомянутое утверждение, по-видимому, предполагает, что инструкция ввода-вывода использует только часть 32-битной адресной шины и, следовательно, требуется меньшее количество декодирования адреса. Без упоминания об этом утверждение само по себе ложно.

Обратите внимание, что, особенно в первые дни существования микроконтроллеров, целые разделы карты адресов отображались на несколько периферийных устройств с использованием нескольких адресных строк для выбора всех периферийных устройств. например, адресные строки 15 и 14 будут выбирать одно из трех периферийных устройств, оставляя 16 КБ в качестве адресного пространства.

Эта техника до сих пор широко используется.
В наши дни 32-битный процессор имеет адресное пространство 2 Гб, но многие микроконтроллеры имеют менее 1 Мб памяти (во флэш-памяти и ОЗУ), требуя всего 20 адресных строк. Это оставляет много свободных адресных строк для этого типа разреженного декодирования.

Я не думаю, что ваши утверждения о «разреженном декодировании» больше не применимы. Например, процессоры Cortex-M, с которыми я работаю, имеют тысячи регистров устройств ввода-вывода, и для доступа к ним требуется, чтобы каким-то образом были декодированы все 32 бита адреса.
@ElliotAlderson Это встроенные устройства и, следовательно, встроенное декодирование. Я говорил о методах декодирования вне чипа. Встроенная в кристалл логика декодирования для 32 битов — это лишь малая часть вентилей, необходимых для реализации, например, протокола AXI. Построив SOC с шинами ARM AXI, я предполагаю, что логика декодирования составляет менее 0,1% шины AXI, что часто составляет менее 1% вентилей микросхемы.

Зачем микроконтроллеру декодировать 32-битную адресную шину таким образом?

При отображении ввода-вывода в память адрес должен быть декодирован в достаточной степени, чтобы разделить области ввода-вывода и памяти. Чем меньше адресных строк используется для выбора каждого блока, тем больше будет блок и тем больше места может быть потрачено впустую. В 32-битном MCU вы можете просто декодировать A31, например. поместите память в первые 2 ГБ и ввод-вывод во вторые 2 ГБ. С 2 ГБ доступной памяти это, вероятно, не проблема, но в MCU с 16 или менее адресными битами это значительно уменьшит доступное пространство памяти.

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

Исторически сложилось так, что большинство ранних микроконтроллеров были разработаны на основе существующего ЦП со встроенными периферийными устройствами, с небольшим внутренним ПЗУ (или без него) и возможностью использования внешней памяти. Те, которые основаны на Intel 8080 и т. д., имели отдельное пространство ввода-вывода, а те, что основаны на Motorola 6800, имели ввод-вывод с отображением памяти. В этих ранних микроконтроллерах было мало транзисторов и небольшой объем памяти, поэтому экономия от наличия отдельного пространства ввода-вывода могла быть значительной. Это означало, что максимальный объем памяти был доступен без «дыр», а устройствам ввода-вывода требовалось меньше логики декодирования.