Перейти к содержанию

Регистры HSTX RP2350

Регистры управления HSTX в RP2350 — блока, который выводит поток данных на GPIO12–19 по два бита за такт, до 300 Мбит/с на вывод: сдвиговый регистр, коммутатор битов, генератор тактового сигнала и расширитель команд с кодером TMDS.

HSTX (high-speed serial transmit) берёт 32-битные слова из FIFO и выдаёт их на 8 выводов GPIO12–19 по два бита за такт на вывод (DDR). Частота HSTX — до 150 МГц, как у системной, то есть до 300 Мбит/с на вывод; задержки до выводов выровнены в пределах 300 пс, поэтому соседние выводы годятся как псевдодифференциальная пара. Принимать данные HSTX не умеет (даташит RP2350, раздел 12.11).

Каждый такт выходной сдвиговый регистр либо загружает 32 бита из FIFO, либо циклически сдвигается вправо на SHIFT бит; после N_SHIFTS сдвигов он загружается снова. Регистры BIT0–BIT7 выбирают, какой бит регистра попадает на вывод в первой (SEL_P) и второй (SEL_N) половине такта, могут инвертировать его или подать вместо данных тактовый сигнал с периодом CLKDIV. Для дифференциального выхода два вывода настраивают одинаково, а INV ставят только у одного.

Расширитель команд (EXPAND_EN) читает из FIFO команды RAW, RAW_REPEAT, TMDS, TMDS_REPEAT и NOP и умеет кодировать данные в TMDS, как требует DVI; его сдвиги задают EXPAND_SHIFT и EXPAND_TMDS. В связанном режиме COUPLED_MODE на коммутатор подаются выходы 12–19 одного из блоков PIO — для этого clk_hstx должна идти прямо от clk_sys. Данные пишут в FIFO через отдельный блок HSTX_FIFO.

ЭкземплярБазовый адрес
HSTX_CTRL0x400C 0000

Регистры блока

РегистрСмещениеНазначениеПосле сброса
HSTX_CTRL_CSR0x00Управление: включение, сдвиги, тактовый сигнал, связанный режим0x1005 0600
HSTX_CTRL_BITn0x04 + n · 0x04Источник данных для вывода n блока HSTX0x0000 0000
HSTX_CTRL_EXPAND_SHIFT0x24Сдвиги в расширителе команд0x0100 0100
HSTX_CTRL_EXPAND_TMDS0x28Кодер TMDS расширителя команд0x0000 0000

HSTX_CTRL_CSR — управление: включение, сдвиги, тактовый сигнал, связанный режим

Смещение 0x00, адрес 0x400C 0000, после сброса 0x1005 0600. Макросы pico-sdk: HSTX_CTRL_CSR_…

31302928272625242322212019181716
CLKDIVCLKPHASE—N_SHIFTS
1514131211109876543210
—SHIFT—COUPLED_SELCOUPLED_MODE—EXPAND_ENEN
  • CLKDIV (биты 31:28, чтение и запись, после сброса 0x1) — Период генерируемого тактового сигнала в тактах HSTX, чётный или нечётный; сигнал идёт вперёд только в тактах со сдвигом.
  • CLKPHASE (биты 27:24, чтение и запись, после сброса 0x0) — Начальная фаза генерируемого тактового сигнала.
  • N_SHIFTS (биты 20:16, чтение и запись, после сброса 0x05) — Сдвигов до новой загрузки из FIFO, 0 — 32; меняют при EN = 0.
  • SHIFT (биты 12:8, чтение и запись, после сброса 0x06) — Циклический сдвиг вправо за такт, бит; 31 — сдвиг влево на 1; меняют при EN = 0.
  • COUPLED_SEL (биты 6:5, чтение и запись, после сброса 0x0) — Блок PIO для связанного режима, 0–2.
  • COUPLED_MODE (бит 4, чтение и запись, после сброса 0x0) — Связанный режим: выходы 12–19 блока PIO идут на коммутатор вместо битов 31:24 сдвигового регистра.
  • EXPAND_EN (бит 1, чтение и запись, после сброса 0x0) — Расширитель команд между FIFO и сдвиговым регистром; меняют при EN = 0.
  • EN (бит 0, чтение и запись, после сброса 0x0) — Включение HSTX; при 0 сдвиговый регистр очищается.

HSTX_CTRL_BITn — источник данных для вывода n блока HSTX

8 регистров, n = 0…7: смещение 0x04 + n · 0x04, после сброса 0x0000 0000. Макросы pico-sdk: HSTX_CTRL_BITn_…

31302928272625242322212019181716
—CLKINV
1514131211109876543210
—SEL_N—SEL_P
  • CLK (бит 17, чтение и запись, после сброса 0x0) — Подать на вывод генерируемый тактовый сигнал вместо данных; INV при этом действует.
  • INV (бит 16, чтение и запись, после сброса 0x0) — Инверсия вывода.
  • SEL_N (биты 12:8, чтение и запись, после сброса 0x00) — Бит сдвигового регистра во второй половине такта.
  • SEL_P (биты 4:0, чтение и запись, после сброса 0x00) — Бит сдвигового регистра в первой половине такта.

HSTX_CTRL_EXPAND_SHIFT — сдвиги в расширителе команд

Смещение 0x24, адрес 0x400C 0024, после сброса 0x0100 0100. Макросы pico-sdk: HSTX_CTRL_EXPAND_SHIFT_…

31302928272625242322212019181716
—ENC_N_SHIFTS—ENC_SHIFT
1514131211109876543210
—RAW_N_SHIFTS—RAW_SHIFT
  • ENC_N_SHIFTS (биты 28:24, чтение и запись, после сброса 0x01) — Выборок из регистра расширителя до новой загрузки для команд с кодированием (TMDS), 0 — 32.
  • ENC_SHIFT (биты 20:16, чтение и запись, после сброса 0x00) — Циклический сдвиг вправо при каждой выборке для команд с кодированием.
  • RAW_N_SHIFTS (биты 12:8, чтение и запись, после сброса 0x01) — Выборок до новой загрузки для команд RAW, 0 — 32.
  • RAW_SHIFT (биты 4:0, чтение и запись, после сброса 0x00) — Циклический сдвиг вправо при каждой выборке для команд RAW.

HSTX_CTRL_EXPAND_TMDS — кодер TMDS расширителя команд

Смещение 0x28, адрес 0x400C 0028, после сброса 0x0000 0000. Макросы pico-sdk: HSTX_CTRL_EXPAND_TMDS_…

31302928272625242322212019181716
—L2_NBITSL2_ROT
1514131211109876543210
L1_NBITSL1_ROTL0_NBITSL0_ROT
  • Ln_NBITS, n = 0…2 (биты 7:5, 15:13, 23:21; чтение и запись, после сброса 0x0) — Значащих бит для кодера TMDS линии n, начиная с бита 7 после сдвига: значения 0–7 означают 1–8 бит.
  • Ln_ROT, n = 0…2 (биты 4:0, 12:8, 20:16; чтение и запись, после сброса 0x00) — Циклический сдвиг данных вправо перед кодером TMDS линии n.

Частые вопросы

Какие выводы RP2350 работают с HSTX?

Только GPIO12–19: на них HSTX выдаёт до двух бит за такт на вывод, до 300 Мбит/с при частоте 150 МГц. HSTX работает только на выход.

Как вывести через HSTX один бит за такт, начиная с младшего?

Задайте в CSR N_SHIFTS = 32 (в поле записывают 0) и SHIFT = 1, а в регистре нужного вывода BITn — SEL_P = SEL_N = 0: каждый такт регистр сдвигается вправо на бит, и на вывод идёт младший бит. Чтобы первым шёл старший бит, нужны SHIFT = 31 и SEL_P = SEL_N = 31.

Источники

  1. Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.11.7: список регистров, назначение полей, тип доступа и значения после сброса
  2. Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2350/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause

Нашли ошибку в регистрах?

Другие регистры RP2350

Статьи и термины