В прошлых статьях-переводах документации Cypress очень предметно рассматривался операционный автомат — Datapath. Переходим к изучению других модулей UDB, в частности — модуль управления и статуса.
Высокоуровневый вид модуля управления и статуса показан на рисунке 21-28. Состояния битов регистра управления передаются на трассировочные ресурсы, давая программе возможность управлять поведением UDB. Регистр статуса получает данные из трассировочных линий, благодаря чему программа может производить мониторинг операций, выполняемых UDB.
Рисунок 21-28. Регистры управления и статуса
Подробнее структура модуля управления и статуса показана на рисунке 21-29. Основной целью этого блока является координация взаимодействия программы процессорного ядра с работой внутренних элементов UDB. Однако из-за сильной связи с трассировочной матрицей этот блок может быть сконфигурирован для выполнения других функций.
Рисунок 21-29. Модуль управления и состояния.
При работе в режиме управления и статуса этот модуль работает как регистр статуса, регистр прерывания наложения маски и регистр управления в конфигурации, показанной на рисунке 21-30.
Рисунок 21-30. Работа управления и статуса.
Каждому UDB доступен один 8-битный регистр статуса. Данные на вход этого регистра поступают от любого сигнала цифровой трассировочной структуры. Регистр статуса разрушаемый: он теряет свое состояние во время сна и после пробуждения имеет значение 0х00. Каждый бит можно независимо запрограммировать на работу в одном из двух режимов.
STAT MD | Описание |
0 | Обычное чтение. Возвращает текущее значение входного сигнала. |
1 | Залипание, очищается при чтении. Высокий уровень на входе защёлкивается по тактовому сигналу. Очищается после того, как регистр прочитан. |
Важной особенностью операции очистки регистра статуса является то, что очищаются только взведенные биты. Это позволяет остальным битам продолжать захват статуса для сохранения непрерывности процесса.
По умолчанию, CPU прозрачно считывает состояние соответствующей цепи. Этот режим можно использовать для чтения данных, защёлкнутых внутри UDB.
В этом режиме входные сигналы регистра статуса дискретизируются на каждом цикле тактирования управления и статуса. Если сигнал на данном такте высокий, он захватывается в бит статуса и остается высоким, вне зависимости от последующих состояний входа. Когда CPU или DMA считывает регистр статуса, бит очищается. Очистка регистра статуса не зависит от режима и происходит даже при отключенном тактировании UDB; оно базируется на тактировании шины и происходит в рамках операции чтения.
Рисунок 21-31 показывает структуру логики чтения статуса. За регистром залипающего статуса следует защелка, которая защелкивает данные регистра статуса и держит его стабильным во время цикла чтения, вне зависимости от количества тактов ожиданий в текущей операции чтения.
Рисунок 21-31. Логика чтения статуса.
В большинстве функций генерация прерываний привязана к параметрам битов статуса. Как показано на рисунке 21-31, эта особенность встроена в логику регистра статуса в виде операции наложения маски и применения операции ИЛИ к статусу. Только младшие 7 бит входа статуса можно использовать вместе со встроенными генераторами прерываний. Старший бит (Most Significant Bit, MSB) обычно используется в качестве выхода прерывания и может быть проброшен на контроллер прерываний при помощи цифровых трассировочных каналов. В этой конфигурации из старшего бита регистра статуса считывается состояние бита запроса на прерывание.
Каждому UDB доступен один 8-битный регистр управления. Он работает как стандартный регистр чтения/записи на системной шине, где выход этих битов регистров управляют линиями цифровой трассировочной структуры.
Регистр управления разрушаемый: он теряет свое состояние во время сна и после пробуждения имеет значение 0х00.
Каждый бит может быть сконфигурирован в одном из трех режимов. Конфигурация задаётся при помощи объединения битов двух 8-битных регистров CTL_MD1[7:0] и CTL_MD0[7:0]. Например, {CTL_MD1[0], CTL_MD0[0]} управляет режимом нулевого бита регистра управления (см. таблицу 21-20).
CTL MD | Описание |
00 | Прямой режим / Direct Mode |
01 | Синхронный режим / Sync Mode |
10 | (зарезервировано) |
11 | Импульсный режим / Pulse Mode |
По умолчанию, режим является прямым. Как показано на рисунке 21-32, когда в регистр управления записывает CPU или DMA, на том же цикле выход регистра управления направляется напрямую на трассировочную линию.
Рисунок 21-32. Прямой режим регистра управления.
В синхронном режиме, как показано на рисунке 21-33, выход регистра управления пересинхронизируется с тактированием равным текущему тактированию управления и статуса (Status and Control, SC). Это позволяет управлять временными диаграммами выхода на выбранной частоте SC, а не на частоте тактирования шины.
Рисунок 21-33. Синхронный режим регистра управления.
Импульсный режим похож на синхронный режим, так как в нем бит управления повторно дискретизируется на частоте SC; импульс начинается на первом цикле тактирования SC и следует за циклом записи шины. Выход бита управления задается в течение одного полного цикла тактирования SC. В конце данного цикла тактирования бит управления автоматически сбрасывается.
При таком режиме работы программа может записать 1 в бит регистра управления для генерации импульса. После того как биту присвоено значение 1, программа будет читать его как 1 до завершения импульса, после чего он будет считываться как 0. После этого программа может записать еще одну 1, чтобы начать новый импульс. Таким образом, подавать импульс получится не чаще, чем на каждом втором такте сигнала SC.
Регистр управления имеет два режима сброса, управляемых битом конфигурации EXT RES, как показано на рисунке 21-34. Когда EXT RES равен 0 (по умолчанию), в синхронном или импульсном режиме трассируемый вход сброса сбрасывает синхронизированный выход, но не сам бит управления. Когда EXT RES равен 1, трассируемый вход сброса сбрасывает как бит управления, так и синхронизированный выход.
Рисунок 21-34. Сброс регистра управления.
В этом режиме трассировка управления и статуса подключена к сигналам parallel in и parallel out (параллельный ввод/вывод) Datapath. Чтобы активировать этот режим, необходимо взвести биты конфигурации SC OUT для выбора параллельного выхода Datapath. Связь с parallel input (параллельным входом) всегда доступна, однако эти трассировочные связи разделяются со входами регистров статуса, входам управления счетчиком и выходам прерывания.
Рисунок 21-35. Режим параллельного ввода/вывода.
Как показано на рисунке 21-36, когда блок работает в режиме счётчика, 7-битный убывающий счётчик доступен для использования как для операций внутри UDB, так и для нужд программы. К особенностям счётчика относятся:
Рисунок 21-36. Режим счётчика
Примечание переводчика:
Примерно к этому месту я понял, что совершенно ничего не понимаю из документа. Нигде не рассказывается про эти режимы «по умолчанию» и «альтернативный». После долгих поисков, удалось найти какой-никакой, а пример. Файл: C:\Program Files (x86)\Cypress\PSoC Creator\4.2\PSoC Creator\psoc\content\CyComponentLibrary\CyComponentLibrary.cylib\bScanComp_v1_10\bScanComp_v1_10.v Поясняющий код:
cy_psoc3_count7 #(.cy_period(Period),.cy_route_ld(0),.cy_route_en(1), .cy_alt_mode(1)) ChannelCounter( /* input */ .clock(clk_int), /* input */ .reset(1'b0), /* input */ .load(1'b0), /* input */ .enable(enable_int), /* output [06:00] */ .count(count), /* output */ .tc(tc_o) );
Само же объявление компонента cy_psoc3_count7 я нашёл только для языка VHDL, похоже, для Verilog оно встроено в средства разработки. Теперь вы примерно знаете, где искать обсуждаемые биты настройки.
Здесь же рассмотрим таинственные биты, которые называются то SC OUT CTL, то SC_OUT_CTL, но их значения не документированы. Их я не нашёл вообще нигде. Из текста ясно, что они переключают компонент STATUS_CONTROL между режимами. Но в упомянутом ранее VHDL файле C:\Program Files (x86)\Cypress\PSoC Creator\4.2\PSoC Creator\warp\lib\lcpsoc3\cpsoc3.vhd
мы видим отдельно уже известный нам счётчик
component cy_psoc3_count7 generic(cy_period : std_logic_vector (6 downto 0) := "1111111"; cy_init_value : std_logic_vector (6 downto 0) := "0000000"; cy_route_ld : boolean := false; cy_route_en : boolean := false; cy_alt_mode : boolean := false); port (clock : in std_logic; reset : in std_logic; load : in std_logic; enable : in std_logic; count : out std_logic_vector (6 downto 0); tc : out std_logic); end component;
отдельно — статус и управление
attribute atomic_rtl of cy_psoc3_status : component is rtl_generic; attribute cpu_access of cy_psoc3_status : component is true; component cy_psoc3_statusi generic(cy_force_order : boolean := false; cy_md_select : std_logic_vector (6 downto 0) := "0000000"; cy_int_mask : std_logic_vector (6 downto 0) := "0000000"); port (reset : in std_logic := '0'; clock : in std_logic := '0'; status : in std_logic_vector (6 downto 0); interrupt : out std_logic); end component; attribute atomic_rtl of cy_psoc3_statusi : component is rtl_generic; attribute cpu_access of cy_psoc3_statusi : component is true; component cy_psoc3_control generic(cy_init_value : std_logic_vector (7 downto 0) := "00000000"; cy_force_order : boolean := false; cy_ctrl_mode_1 : std_logic_vector (7 downto 0) := "00000000"; cy_ctrl_mode_0 : std_logic_vector (7 downto 0) := "00000000"; cy_ext_reset : boolean := false); port (reset : in std_logic := '0'; clock : in std_logic := '0'; control : out std_logic_vector (7 downto 0)); end component;
отдельно — синхронизатор
component cy_psoc3_sync port (clock : in std_logic := '0'; sc_in : in std_logic; sc_out : out std_logic); end component;
Повторю, что в Verilog версии этих объявлений совсем нет (есть только поведенческие модели в каталоге C:\Program Files (x86)\Cypress\PSoC Creator\4.2\PSoC Creator\warp\lib\sim, поэтому я считаю, что биты, устанавливающие режимы, простым программистам недоступны. При чтении этого раздела следует держать данный факт в уме. Кое-что даётся чисто для справки, нам, программистам, оно неподвластно.
Чтобы включить режим счётчика, в битах SC_OUT_CTI[1:0] должен быть выбран выход счётчика. В этом режиме нормальная работа регистра управления недоступна. В то же время, регистр статуса можно использовать для операций чтения, но для генерации прерывания его использовать не стоит, так как регистр наложения маски также используется в качестве регистра периода счётчика. Регистр периода не разрушается и сохраняет свое состояние после пробуждения. Для периода из N тактов, в регистр периода должно быть загружено значение N-1. Значение N = 1 (период равен нулю) в качестве значения делителя частоты не поддерживается и приведет к постоянной единице на выходе ТС (Terminal count, TC). Доступность режима SYNC зависит от того, используется динамическое управление (LD/EN) или нет. Если оно не используется, это не влияет на режим SYNC. Если оно используется, режим SYNC недоступен.
Как показано на рисунке 21-37, регистр статуса может работать как 4-битный двойной синхронизатор, тактируемый текущим значением SC_CLK, если бит SYNC MD задан. Этот режим можно использовать для реализации локальной синхронизации асинхронных сигналов (например, входов GPIO). При этом синхронизируемые сигналы выбираются из SC_IN[3:0], выходы пробрасываются на контакты SC_IO_OUT[3:0], а SYNC MD автоматически переводит контакты SC_IO в режим выхода. В этом режиме нормальная работа регистра статуса недоступна, а режим залипающего бита статуса принудительно отключен, вне зависимости от настроек управления режима. Данный режим не влияет на регистр управления. Счётчик всё ещё можно использовать, но с ограничениями. При таком режиме работы нельзя использовать динамические входы (LD/EN).
Рисунок 21-37. Синхронный режим.
Вспомогательный регистр управления для чтения и записи – специальный регистр, который управляет жёстко заданной аппаратурой UDB. Этот регистр позволяет CPU или DMA динамически управлять прерываниями, FIFO и работой счётчика. Биты регистров и их описание приведены ниже:
Вспомогательный регистр управления | |||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
CNT START | INT EN | FIFO1 LVL | FIFO0 LVL | FIFO1 CLR | FIFO0 CLR |
Биты FIFO0 CLR и FIFO1 CLR используются для сброса состояния соответствующих FIFO. Когда в эти биты записывается 1, состояние соответствующего FIFO сбрасывается. Для продолжения работы FIFO в эти биты необходимо записать 0. Когда эти биты остаются взведенными FIFO работают как простые однобайтные буферы без статуса.
Биты FIFO0 LVL и FIFO1 LVL задают уровень, при котором 4-байтный FIFO взводит статус шины (когда шина читает или записывает в FIFO). Значение статуса шины FIFO зависит от сконфигурированного направления, как показано в таблице ниже.
FIFOx LVL | Режим ввода (Шина записывает в FIFO) | Режим вывода (Шина читает из FIFO) |
0 |
Не полон. Можно записать хотя бы 1 байт. |
Не пуст. Для чтения доступен хот бы 1 байт. |
1 |
Опустошен как минимум на половину. Можно записать хотя бы 2 байта. |
Заполнен как минимум на половину. Для чтения доступны хотя бы 2 байта. |
Когда логика генерации регистра статуса активирована, бит INT EN разрешает прохождение сформированного сигнала прерывания.
Бит CNT START можно использовать для запуска и остановки счётчика (доступно только если биты SC_OUT_CTL[1:0] сконфигурированы для режима выхода счётчика).
Таблица ниже обобщает функции регистров управления и статуса. Обратите внимание, что регистры наложения маски и управления совмещены с регистрами счетчиков и периода, а значение этих регистров не зависит от режима работы.
Режим | Управление/Счётчик (Control/Count) | Статус/Синхронизация (Status/SYNC) | Наложение маски/Период (Mask/Period) |
Управление (Control) | Выход управления (Control Out) | Вход статуса или синхронизация (Status In or SYNC) | Наложение маски статуса (Status Mask) |
Счётчик (Count) | Выход счётчика (Count Out) | Период счётчикаa (Count Period) | |
Статус (Status) | Выход управления или выход счётчика (Control Out or Count Out) | Вход статуса (Status In) | Наложение маски статуса (Status Mask) |
Синхронизация (SYNC) | Синхронизация (SYNC) | Не доступноb (NA) |
а. – обратите внимание, что в режиме счётчика регистр наложения маски работает как регистр периода и не может работать как регистр наложения маски. Следовательно, выход прерывания недоступен при активированном режиме счётчика.
b. – обратите внимание, что в режиме синхронизации регистр статуса недоступен, а, следовательно, регистр наложения маски использовать невозможно. Однако его можно использовать в качестве регистра периода для режима счётчика.
Продолжение следует…