Это пошадочный мост SPI, который преобразует транзакции по протеканию от хоста в транзакции SPI-памяти. Его можно использовать для картирования вспышки SPI, EEPROM или RAM в адресное пространство процессора. Мост работает прозрачно , поэтому он ведет себя как память с чтением/записи, отображаемая в памяти, поскольку он скрывает протокол SPI - за счет дополнительной задержки. Следовательно, мост поддерживает выполнение выполнения на месте (XIP), позволяя процессору непосредственно получить доступ (и выполнять) инструкции и данные, расположенные в памяти SPI.
Это еще один «побочный» проект процессора NEORV32 RISC-V. Мост может быть добавлен в виде модуля XIP к процессору.
Ключевые функции
Todos / Idea / Helped
Мост основан на одном файле VHDL rtl/wb_spi_bridge.vhd . Верхняя сущность - wb_spi_bridge , который может быть создан непосредственно без необходимости каких -либо специальных библиотек.
entity wb_spi_bridge is
generic (
SPI_CLK_DIV : positive ; -- clock divider: f(spi_clk_o) = f(clk_i) / 2*SPI_CLK_DIV, min 2
SPI_ABYTES : positive ; -- number of address bytes in SPI protocol, 1..4
SPI_CPHA : std_ulogic ; -- clock phase
SPI_CPOL : std_ulogic ; -- idle polarity
WB_ADDR_BASE : std_ulogic_vector ( 31 downto 0 ); -- module base address, size-aligned
WB_ADDR_SIZE : positive -- module address space in bytes
);
port (
-- wishbone host interface --
wb_clk_i : in std_ulogic ; -- clock
wb_rstn_i : in std_ulogic ; -- reset, async, low-active
wb_srstn_i : in std_ulogic ; -- reset, SYNC, low-active
wb_adr_i : in std_ulogic_vector ( 31 downto 0 ); -- address
wb_dat_i : in std_ulogic_vector ( 31 downto 0 ); -- read data
wb_dat_o : out std_ulogic_vector ( 31 downto 0 ); -- write data
wb_we_i : in std_ulogic ; -- read/write
wb_sel_i : in std_ulogic_vector ( 03 downto 0 ); -- byte enable
wb_stb_i : in std_ulogic ; -- strobe
wb_cyc_i : in std_ulogic ; -- valid cycle
wb_ack_o : out std_ulogic ; -- transfer acknowledge
wb_err_o : out std_ulogic ; -- transfer error
-- SPI device interface --
spi_csn_o : out std_ulogic ; -- chip-select, low-active
spi_clk_o : out std_ulogic ; -- serial clock
spi_data_i : in std_ulogic ; -- device data output
spi_data_o : out std_ulogic -- controller data output
);
end wb_spi_bridge ;Верхняя сущность создает два сущность в файле :
wb_spi_bridge_link Обрабатывает протокол памяти SPI (читать, написать, repect-enable)wb_spi_bridge_phy обрабатывает фактический протокол последовательного периферического интерфейсаwb_rstn_i ) и синхронная ( wb_srstn_i ), которые оба низко активны. Асинхронный сброс необходим для того, чтобы привести мост в определенное состояние. Синхронный сброс является необязательным и может использоваться для сброса моста из логики приложения. Свяжите этот сброс до 1 , если он не используется.
Конфигурация моста для моста с протеканием к SPI, специфичная для приложения, выполняется с использованием генериков верхнего объекта.
Частовая частота SPI настраивается с использованием Generic SPI_CLK_DIV . Он определяет масштаб, который применяется к входу тактового ввода clk_i , чтобы получить фактические часы SPI. Часы SPI определяются f_spi = f_main / (2 * SPI_CLK_DIV) . Минимальное допустимое значение для такточного масштаба составляет 2, что приводит к максимальной тактовой частоте SPI 1/4 от входной тактовой скорости.
Фактический режим часов настроен через SPI_CPHA и SPI_CPOL . Комбинация этих двух дженериков позволяет настроить любой из четырех стандартных режимов SPI -часов. Для получения дополнительной информации о режимах часов см. В статье SPI Wikipedia.
Размер адреса памяти SPI, который определяется его емкостью, настроен SPI_ABYTES Generic. Разрешенные значения составляют 1, 2, 3 и 4. Большинство Spi Eeproms используют размер адреса 16-битного, что приводит к SPI_ABYTES = 2 . Многие стандартные воспоминания SPI Flash используют 24-битные для адресации, что приводит к SPI_ABYTES = 3 .
Мост использует только три стандартные команды памяти. Если команды конкретной памяти SPI различны, вы можете адаптировать их в исходном файле VHDL:
-- spi memory opcodes -----------------------------------------------------------
constant cmd_write_c : std_ulogic_vector ( 7 downto 0 ) := x"02" ; -- write data
constant cmd_read_c : std_ulogic_vector ( 7 downto 0 ) := x"03" ; -- read data
constant cmd_wren_c : std_ulogic_vector ( 7 downto 0 ) := x"06" ; -- write enable
-- ------------------------------------------------------------------------------ 32-битный базовый адрес моста определяется WB_ADDR_BASE Generic. Размер занятого адресного пространства, который определяется емкостью памяти SPI, настроен WB_ADDR_SIZE Generic. Размер пространства адреса должен быть силой двух, а базовый адрес должен быть естественным образом выровнен с этим размером.
Пример: SPI Flash с 64 КБ (64*1024 байт):
WB_ADDR_BASE => 0 x"FFFF0000" ,
WB_ADDR_SIZE => 64 * 1024 В этом случае базовый адрес 0xFFFF8000 был бы недействительным, поскольку он естественным образом не выровнен по границе 64 КБ.
Интерфейс хоста основан на спецификации Wishbone B4. Он поддерживает классические и трубопроводные одноактивные переводы. Перенос взрыва еще не поддерживается.
| Пример доступа к классическому режиму режима | Пример доступа к кондиционеру с трубопроводом |
|---|---|
stb и cyc оба остаются утвержденными до тех пор, пока перевод не будет завершен.cyc остается утвержденным до тех пор, пока перевод не будет завершен. stb утверждается только для одного цикла прямо в начале передачи. | Передача завершается при установке ack сигнала подтверждения (активно для одного цикла). Это указывает на успешное прекращение. Передача также завершается, когда устанавливается ошибка err (активная для одного цикла), указывающего на ошибочное прекращение. Мост поднимет сигнал ошибки только в том случае, если установлена непревзойденная маска байта-вывода (см. Ниже).
Мост поддерживает 32-битный, 16-битный и 8-битный доступ к записи. Читать доступ всегда возвращайте полное 32-битное слово. Обратите внимание, что мост обращается к данным памяти в байтовом порядке. Сигнал sel Byte Mask определяет количество данных в соответствии с доступом. Поддерживаются следующие байтовые маски:
sel | r/w | Количество данных |
|---|---|---|
1111 | читать | Полное 32-разрядное слово |
1111 | писать | Полное 32-разрядное слово |
1100 | писать | Верхний 16-разрядный полвор |
0011 | писать | Нижняя 16-разрядная половина слов |
0001 | писать | байт 0 |
0010 | писать | байт 1 |
0100 | писать | байт 2 |
1000 | писать | байт 3 |
Вся оставшаяся комбинация байтовой маски поднесет ошибку передачи ( err устанавливается на один цикл вместо ack ).
Мост всегда посылает полную командную последовательность в память SPI для любого вида передачи поперечного плана (всплески еще не поддерживаются). Это означает, что оплот памяти, биты адреса и фактические данные передаются для каждой транзакции. В следующей таблице показано количество битов для передачи через SPI для каждого типа транзакции. Каждый бит требует одного часа часов SPI.
| r/w | Размер данных | CMD BITS | Адрес | Биты данных | Общие биты |
|---|---|---|---|---|---|
| читать | Слово (32-битное) | 8 | 8*SPI_ABYTES | 32 | 8 + 8*SPI_ABYTES + 32 |
| писать | Слово (32-битное) | 8 + 8 | 8*SPI_ABYTES | 32 | 8 + 8 + 8*SPI_ABYTES + 32 |
| писать | Полвол (16-битный) | 8 + 8 | 8*SPI_ABYTES | 16 | 8 + 8 + 8*SPI_ABYTES + 16 |
| писать | байт (8-битный) | 8 + 8 | 8*SPI_ABYTES | 8 | 8 + 8 + 8*SPI_ABYTES + 8 |
Например, доступ к записи по всему слову к вспышке SPI, в которой используется 24-разрядная адресация, требует 8 + 8 + 8*3 + 32 = 72 Clock Cycles SPI. Один цикл SPI Clock равен 2 * SPI_CLK_DIV основного часа clk_i .
Любой вид доступа к записи требуется для установки защелкивания записи памяти, которая выполняется, отправляя одну 8-разрядную команду.
Проекты предоставляют простую тестовый sim/wb_spi_bridge_tb.vhd , который может быть смоделирован с помощью GHDL через сценарий предоставления:
wb_spi_bridge/sim$ sh ghdl.sh Моделирование будет работать в течение 1 мс с использованием часов 100 МГц. В течение этого времени все поддерживаемые (и один незаконные) доступ к пошлинам запускаются. Обратите внимание, что этот тест предназначен для ручной проверки формы волны - это не самостоятельно! Данные формы волны хранятся в sim/wb_spi_bridge.vcd , который можно просмотреть с помощью gtkwave :
wb_spi_bridge/sim$ gtkwave wb_spi_bridge.vcdМост проверен на FPGA . Он был протестирован путем непосредственного подключения его к интерфейсному порту интерфейса Wishbone процессора NEORV32 RISC-V (No WishBone Interconnect), соединяющего SPI EEPROM 25LC512.
Примеры программного обеспечения NEORV32 предоставляют программу «проводник шины», которая позволяет выполнять произвольные доступа к пошлинам через терминал UART. Мост может успешно справиться со всеми операциями чтения и записи. Кроме того, NEORV32 может успешно выполнять на месте программы из модуля SPI.
Примерные результаты картирования для следующей конфигурации:
SPI_CLK_DIV => 32 ,
SPI_ABYTES => 2 , -- 16-bit addressing
SPI_CPHA => '0' ,
SPI_CPOL => '0' , -- clock mode 0
WB_ADDR_BASE => x"F0000000" ,
WB_ADDR_SIZE => 64 * 1024 EP4CE22F17C6N @100 МГц Hierarchy Logic Cells Logic Registers
----------------------------------------------------------------------------
wb_spi_bridge:wb_spi_bridge_inst 233 (115) 174 (88)
wb_spi_bridge_link:wb_spi_bridge_link_inst 118 (16) 86 (8)
wb_spi_bridge_phy:wb_spi_bridge_phy_inst 102 (102) 78 (78)