Мы завершаем нашу эпопею с переводом фирменной документации Cypress об UDB. Последний выпуск – про адресацию UDB – перед вами.
Как-то всё сложно сформулировано. По-моему, для первых двух пунктов проще ввести понятие методов адресации с различной разрядностью рабочего регистра. Через 8-разрядный и через 16-разрядный рабочие регистры соответственно. Если вы запутались при чтении этих пунктов, попробуйте рассмотреть текст именно в таком ключе. Разные окна в адресном пространстве ЦП, предоставляющие адресацию одного и того же через рабочие регистры разной разрядности. Вот и всё.
Рабочие регистры используются во время нормальной работы и включают в себя аккумуляторы, регистры данных, FIFO, регистры управления и статуса, регистр наложения маски и регистр вспомогательного управления.
Справа на рисунке 21-43 находится 16-битный адрес, который всегда чётный. В этом случае номер UDB имеет размерность 5 бит, а не 4, из-за четного расположения адресов. Старшие 4 бита по-прежнему задают номер регистра.
Рисунок 21-43. Рабочие регистры UDB.
В этом режиме доступ ко всем регистрам UDB осуществляется через адреса, выравненные по границе байта. В режиме доступа к 8-битным регистрам, как показано на рисунке 21-44, все байты данных, записанные в UDB, выравненные с младшим байтом шины 16-битного UDB.
В этом режиме доступ в любой момент времени можно получать только к одному байту.
Рисунок 21-44. Доступ к 8-битному рабочему регистру.
16-битное адресное пространство, разработанное для эффективного доступа DMA и предоставления программного доступа CPU в процессорах, которые это поддерживают, например, Cortex-M3 в PSoC 5LP. Существует два режима доступа к 16-битным регистрам: режим «по умолчанию» (default) и режим «конкатенации» (concat). Как показано на рисунке 21-45, в режиме по умолчанию обращается к указанному регистру в UDB ‘i’ через младший байт и к тому же регистру в UDB ‘i+1’ через старший байт. Это делает обработку 16-битных данных эффективной в соседних UDB (по порядку адресов), сконфигурированных как 16-битные функции.
Рисунок 21-45. Доступ к 16-битным рабочим регистрам в режиме по умолчанию.
В режиме конкатенации, регистры одного UDB объединяются для формирования 16-битных регистров, как показано на рисунке 21-46. В этом режиме 16-битная шина данных массива UDB должна получить доступ к паре регистров в UDB в формате, показанном на рисунке. Например, при обращении к регистру A0 реально произойдёт доступ к A0 через младший байт и к A1 — через старший.
Рисунок 21-46. Доступ к 16-битному рабочему регистру в режиме конкатенации
Использование DMA ограничено разрядностью 16-битного рабочего регистра. Его недостаточно при работе с функциями больше 16 бит. Это вызвано адресными наложениями, как показано в таблице 21-25.
Адрес | Старший байт записывается в | Младший байт записывается в |
---|---|---|
0 | UDB1 | UDB0 |
2 | UDB2 | UDB1 |
4 | UDB3 | UDB2 |
Когда DMA передает 16 бит на адрес 0, младший и старший байты записываются в UDB0 и UDB1, соответственно. В следующей 16-битной передаче DMA на адрес 2 значение в UDB1 перезаписывается младшим байтом этой передачи.
Чтобы предотвратить проблемы, связанные с такой организацией памяти, рекомендуется для функций, разрядность которых более 16 бит, запускать процесс DMA для области с 8-битными рабочими регистрами.
Конфигурация выполняется на уровне пар UDB. Пара UDB состоит из двух UDB и связанного с ними трассировочного канала, как показано на рисунке 21-47.
Рисунок 21-47. Адресная схема конфигурации пары UDB.
Рисунок 21-48 показывает адресную схему конфигурации конкретной UDB. Как можно заметить, данное пространство конфигурации дублируется на обоих UDB в паре. Всего зарезервировано 128 байт (7 бит адресов) для каждой конфигурации UDB, которые разделены на 16-битные отрезки. Стоит заметить, что 16-битный доступ к нечетным границам не поддерживается. Чтение всегда возвращает 16 бит в конфигурационном пространстве, а ненужный байт можно игнорировать.
Рисунок 21-48. Адресное пространство конфигурации UDB.
Конфигурация трассировки UDB состоит из встраиваемых бит ОЗУ для управления состоянием переключателями шлюзов, сегментацией и входными/выходными буферами.
Регистр |
Запись из UDB Запись из шины |
Запись из UDB Чтение из шины |
Чтение из UDB Запись из шины |
Чтение из UDB Чтение из шины |
Ax | Неопределенный результат | Недоступно напрямуюа,b | UDB считывает предыдущее значение | Шина и UDB считывают текущее значение |
Dx | ||||
Fx | Не поддерживается (UDB и шина должны иметь разнонаправленный доступ) | Если используются флаги статуса FIFO, одновременное чтение/запись | Не поддерживается (UDB и шины должны иметь разнонаправленный доступ) | |
ST | Недоступно, шина не записывает | Шина считывает предыдущее значение | Недоступно, UDB не считывает | |
CTL | Недоступно, UDB не записывает | UDB считывает предыдущее значение | Шина и UDB считывают текущее значение | |
CNT | Неопределенный результат | Недоступно напрямуюс | ||
ACTL | Недоступно, UDB не записывает | |||
MSK | ||||
PER | ||||
MC (RO) | Недоступно, шина не записывает | Недоступно напрямуюd | Недоступно, шина не записывает |
а. Регистры Ax можно безопасно считывать при помощи функции программного захвата FIFO.
b. В регистры Dx FIFO могут только динамически записывать. При этом режиме прямое чтение регистров Dx недоступно.
c. Регистр CNT можно безопасно считывать, только когда он отключен. Альтернативой для динамического чтения значения CNT является трассировка выхода на регистр SC (в прозрачном режиме).
d. Биты регистра MC могут быть трассированы на входы регистра статуса (в прозрачном режиме) для безопасного чтения.
21.3.6.2 Когерентный доступ к аккумулятору (Атомарные операции чтения и записи) (Coherent Accumulator Access (Atomic Reads and Writes))
Аккумуляторы UDB являются первичной целью обработки данных. Следовательно, чтение этих регистров напрямую во время обычной работы дает неопределенный результат, как показано в таблице выше. Однако присутствует встроенная поддержка атомарных чтений в виде программного захвата, реализованного на связанных в цепочку блоках. В такой модели использования, чтение последнего значащего аккумулятора переносит данные со всех блоков, связанных в цепочку на связанные с ними FIFO. Атомарная запись в FIFO может быть реализована программно. Отдельные операции записи могут быть выполнены на входе FIFO, а затем сигнал статуса FIFO, в который была выполнена последняя запись, может быть проброшен на все связанные блоки, в то время как данные FIFO будут переданы на регистры Dx или Ax.
Этот цикл переводов был сделан как ответ на комментарий к статье, где было предложено сначала кратко рассказать, что такое UDB. Теперь видно, что для краткого ответа надо было бы процитировать хотя бы половину из приведённых здесь материалов, иначе ответ всё равно получился бы неполным. Но теперь все материалы переведены и собраны. Задача выполнена.
Пока шла работа, мы также обратили внимание ещё на один интересный блок PSoC, который слабо известен кому-либо, но таит в себе огромную мощь. Это DFB, Digital Filter Block. Правда, бросаться в перевод боязно. Из перевода про UDB видно, что одной документации ох как не хватает, нужна практика. Беда в том, что готовых примеров по UDB пусть мало, но они есть. Найти что-то путное из примеров по DFB пока не удалось (сама фирма Cypress сделала цифровой фильтр в виде чёрного ящика, он работает, но как — пока не ясно). Перевод без примеров не будет иметь смысла. Поэтому, пользуясь случаем, обращаем внимание читателей на этот блок. Возможно, кто-то в комментариях даст ссылки на хорошие примеры. Если удастся с этим блоком разобраться, можно будет сделать цикл переводов и практических статей и по нему. А пока у нас всё.