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

Клоки AXI-шины в пользовательком IP

1. При создании пользовательского IP с различными AXI-шинами, автоматически к каждой шине создается свой клок. Внутри потом для каждой шины создается отдельный компонент обработки сигналов данной шины со своим клоком. Я еще понимаю, что есть AXI-Interconnect, который увязывает несколько клоков, но для чего это в обычной жизни?

AXI-Stream имеет ширину данных 32 или 64 разряда. А если мне надо 256 бит и все эти данные поступают от одного источника с одним клоком, как это правильно описать? Т.е. мне защелкивать каждые 32 бита от своего клока, надеясь, что снаружи на эти несколько входов не подали разные клоки? Но если я указываю один клок для всех шин, среда ругается, что нет клока ассоциируемого с шиной. Как это правильно разрулить?

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

2. Во всех автоматически сгенерированных корках, асинхронный сброс обрабатывается как синхронный. Это намеренно так делается? Даже название сигнала "aresetn", но во всех процессах в списке чувствительности только клок. Где можно прочитать про причину и рекомендации в своем коде использовать именно такое описание сброса?

3. При попытке описать AXI-шину с шириной отличной от 32/64 среда выдает ошибку. Но при этом, я могу настроить арифметические корки с AXI-шиной, где ширина входных параметров и результата будет отличаться от 32/64. На самом деле нет такого строгого ограничения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Vadim_nsk сказал:

3. При попытке описать AXI-шину с шириной отличной от 32/64 среда выдает ошибку. Но при этом, я могу настроить арифметические корки с AXI-шиной, где ширина входных параметров и результата будет отличаться от 32/64. На самом деле нет такого строгого ограничения?

По спеке AXI (не AXI-Stream) ширина может быть задана только в кратном 2 количестве байт (задаётся сигналом xSIZE, где x -- A, R). Блоки могут быть любыми, но шина только такой.

1 час назад, Vadim_nsk сказал:

2. Во всех автоматически сгенерированных корках, асинхронный сброс обрабатывается как синхронный. Это намеренно так делается? Даже название сигнала "aresetn", но во всех процессах в списке чувствительности только клок. Где можно прочитать про причину и рекомендации в своем коде использовать именно такое описание сброса?

Вы подразумеваете aresetn как асинхронный? Он не асинхронный, он самый что ни на есть синхронный. А буква a в начале пусть не смущает -- она обозначает, видимо, AXI, а не асинхронность. У них и клок называется aclk.

Первый вопрос не понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне для понимания работы с AXI(memory mapped) и AXIS (stream) очень помогло ознакомление с AMBA AXI Protocol Specification и AMBA AXI stream Protocol Specification

 

15 часов назад, Vadim_nsk сказал:

AXI-Stream имеет ширину данных 32 или 64 разряда. А если мне надо 256 бит и все эти данные поступают от одного источника с одним клоком, как это правильно описать?

по спецификациям и в AXI и в AXIS данные могут иметь отличную ширину данных от 32 или 64 разрядов:

"TDATA_WIDTH must be an integer number of bytes and is recommended to be 8, 16, 32, 64, 128, 256, 512 or 1024-bits."

image.thumb.png.b631a89a6249109e6140103f7eafbff0.png

если передаётся 256 бит с одного источника и если источник позволяет не дробить общую шину на отдельные, то нужно указать ширину данных 256 бит

например вот так

image.thumb.png.3c9fba6e1158de1c233cec497edd8aa2.png

image.thumb.png.ef8c52f3a29876cbf5b93f497b36ee5f.png

 

15 часов назад, Vadim_nsk сказал:

Но если я указываю один клок для всех шин, среда ругается, что нет клока ассоциируемого с шиной. Как это правильно разрулить?

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

image.thumb.png.8b97b8dfc4d0d5c9a2b08c050c52e47d.png

 

 

16 часов назад, Vadim_nsk сказал:

2. Во всех автоматически сгенерированных корках, асинхронный сброс обрабатывается как синхронный. Это намеренно так делается? Даже название сигнала "aresetn", но во всех процессах в списке чувствительности только клок. Где можно прочитать про причину и рекомендации в своем коде использовать именно такое описание сброса?

по спецификациям сброс может обрабатываться как синхронный и как асинхронный, но с учётом требований:

"The reset signal can be asserted asynchronously, but deassertion must be synchronous after the rising edge of ACLK."

image.thumb.png.ad20cc3df55056f7393e6e1c5f856693.png

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, stealthisname сказал:

"TDATA_WIDTH must be an integer number of bytes and is recommended to be 8, 16, 32, 64, 128, 256, 512 or 1024-bits."

Это AXIS. А для AXI? И как закодировать ширину, отличную от количества байт в степени двойки, с помощью сигнала AWSIZE?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, dxp сказал:

Это AXIS. А для AXI?

по спецификации AMBA AXI Protocol Specification для AXI (mm):

"the data bus, that can be 8, 16, 32, 64, 128, 256, 512, or 1024 bits wide"

image.thumb.png.46ec79ac430ae2aa6b4c4726c1286b4d.png

данные действительно могут иметь отличную от 32 или 64 разрядов ширину данных для AXI и AXIS

для AXI Lite данные могут иметь ширину только 32 или 64 разрядов

"Two options for data bus width are supported, either 32-bit or 64-bit."

image.thumb.png.2f9f85280274823f50b070cd1baf6362.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, stealthisname сказал:

данные действительно могут иметь отличную от 32 или 64 разрядов ширину данных для AXI и AXIS

Т.е. для AXI могут быть 32 или 64. Или 16. Или 128. Но не могут быть, например, 40. Или 24. А вот для AXIS могут. Возвращаясь к исходному вопросу, ширина шины для AXI в корках получается 32 или 64 (или любая другая, но равная количеству байт по степени двойки, т.е. не произвольная).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/5/2022 at 4:15 PM, Vadim_nsk said:

AXI-Stream имеет ширину данных 32 или 64 разряда. А если мне надо 256 бит и все эти данные поступают от одного источника с одним клоком, как это правильно описать? Т.е. мне защелкивать каждые 32 бита от своего клока, надеясь, что снаружи на эти несколько входов не подали разные клоки? Но если я указываю один клок для всех шин, среда ругается, что нет клока ассоциируемого с шиной. Как это правильно разрулить?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/6/2022 at 12:41 PM, stealthisname said:

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

image.thumb.png.8b97b8dfc4d0d5c9a2b08c050c52e47d.png

Он не позволяет выбрать один клок для двух разных интерфейсов.

Перенес созданный s_m_axis_aclk:

		s_m_axis_aclk		: in std_logic;

		-- Ports of Axi Slave Bus Interface S00_AXIS
		s00_axis_aresetn	: in std_logic;
		s00_axis_tready		: out std_logic;
		s00_axis_tdata		: in std_logic_vector(C_S00_AXIS_TDATA_WIDTH-1 downto 0);
		s00_axis_tstrb		: in std_logic_vector((C_S00_AXIS_TDATA_WIDTH/8)-1 downto 0);
		s00_axis_tlast		: in std_logic;
		s00_axis_tvalid		: in std_logic;

		-- Ports of Axi Master Bus Interface M00_AXIS
		m00_axis_aresetn	: in std_logic;
		m00_axis_tvalid		: out std_logic;
		m00_axis_tdata		: out std_logic_vector(C_M00_AXIS_TDATA_WIDTH-1 downto 0);
		m00_axis_tstrb		: out std_logic_vector((C_M00_AXIS_TDATA_WIDTH/8)-1 downto 0);
		m00_axis_tlast		: out std_logic;
		m00_axis_tready		: in std_logic

в интерфейс S00_AXIS_ACLK:

image.thumb.png.334eb6009f494ea00008b4fb91b32b41.png

При этом, создал интерфейс M00_AXIS_ACLK, но там этого сигнала в списке активных нет:

image.thumb.png.64ef1325163717e5332e23a9e8f64b9b.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, не тот сигнал стрелкой указал. Этот для AXI-Lite. Но s_axis_aclk тоже неактивен...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще одну странность обнаружил. Я для тестирования системы подключил все к Microblaze, у которого есть вход и выход AXI-Stream, что довольно удобно. Но шина 32 разрядная, а у меня 256 бит (поменял параметра AXIS_TDATA_WIDTH на 256). Нашел компонент AXI4-Stream Data Width Converter, поставил на входе и выходе своего компонента и вот что вижу:

image.thumb.png.16b2cebd38876ba14019efc0bcfe8a05.png

Довольно странный размер TDATA на входе и выходе данного конвертера и странное сообщение. Я действительно не трогал параметр TDATA_NUM_BYTES, наивно полагая, что он вычислится автоматически из S[M]00_AXIS_TDATA_WIDTH, который я как раз меняю с 32 на 256. Мне еще и количество байт самому считать?

image.thumb.png.27102c7b079db41e3a6a82cb307b1178.png

Самое интересное, что при всем этом он еще и image.png.5795b33a0b2e558275055cee20c3952a.png, что настораживает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...