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

Шина AXI и метастабильность

Собственно вопрос в следующем. Есть шина AXI, у нее есть два сигнала ARst и AClk. Как я это понимаю, AXI-master может жить и работать в одном clock-домене, а AXI-slave в другом (клоки то ассинхронные). Это им позволяют сигналы валидности адреса, захвата адреса, валидности данных и захвата данных. Но позвольте... адрес и сигнал валидности адреса выставляется одновременно, следовательно, один из разрядов шины адреса может оказаться в том самом метастабильном состоянии, т.к. шина AXI позволяет сигналам валидности и захвата появиться одновременно или сигналу захвата уже быть установленным. Такая же ситуация и с шиной данных. Так почему там не освещаются вопросы защиты от метастабильного состояния. К сожалению, тут на форуме в поиске нельзя указывать слова из 3-х букв, поэтому AXI не ищется, а в темах о метастабильности не затрагивается шина AXI. Что позволяет шине быть особенной и не иметь единного клока?

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Vadim_nsk @ Apr 28 2018, 09:34) <{POST_SNAPBACK}>
Есть шина AXI, у нее есть два сигнала ARst и AClk. Как я это понимаю, AXI-master может жить и работать в одном clock-домене, а AXI-slave в другом (клоки то ассинхронные).

Ошибаетесь. AXI-master и AXI-slave могут жить и работать только(!) в одном clock-домене. Для реализации CDC обычно используют FIFO.

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


Ссылка на сообщение
Поделиться на другие сайты
Используйте интерконнекты, там обычно эти вопросы решаются.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Vadim_nsk @ Apr 28 2018, 09:34) <{POST_SNAPBACK}>
Что позволяет шине быть особенной и не иметь единного клока?
Я так понимаю AXI_interconnect занимается согласованием доменов.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MegaVolt @ Apr 28 2018, 14:17) <{POST_SNAPBACK}>
Я так понимаю AXI_interconnect занимается согласованием доменов.

В мой Slave компонент приходят такие сигналы:
Код
S_AXI_ACLK        : in  std_logic;
S_AXI_ARESETN    : in  std_logic;
S_AXI_AWADDR    : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
S_AXI_AWVALID    : in  std_logic;
S_AXI_WDATA        : in  std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
S_AXI_WSTRB        : in  std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
S_AXI_WVALID        : in  std_logic;
S_AXI_BREADY        : in  std_logic;
S_AXI_ARADDR        : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
S_AXI_ARVALID        : in  std_logic;
S_AXI_RREADY        : in  std_logic;
S_AXI_ARREADY    : out std_logic;
S_AXI_RDATA        : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
S_AXI_RRESP        : out std_logic_vector(1 downto 0);
S_AXI_RVALID        : out std_logic;
S_AXI_WREADY        : out std_logic;
S_AXI_BRESP        : out std_logic_vector(1 downto 0);
S_AXI_BVALID        : out std_logic;
S_AXI_AWREADY    : out std_logic

Предположим, что S_AXI_ACLK имеет частоту 100МГц
Вы хотите сказать, что я спокойно могу в своем компоненте работать на частоте 23.96МГц с этими сигналами и AXI_interconnect все разрулит? В нем уже есть 2 ряда D-триггеров в ту и другую сторону?

Собственно, у меня тогда три вопроса.
1. Если я вижу в названии сигналов впереди букву "А", я должен относиться к этому сигналу как к асинхронному и пропускать через 2 D-триггера работающие от моего клока?
2. Должен ли я свои выходные сигналы, сформированные от моего клока приводить к частоте AXI чреез 2 D-триггера или это забота AXI_interconnect?
3. Могу ли я ничего этого не делать, строя свой компонент таким образом, чтобы он целиком работал от частоты AXI?

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Vadim_nsk @ Apr 28 2018, 10:29) <{POST_SNAPBACK}>
Предположим, что S_AXI_ACLK имеет частоту 100МГц
Вы хотите сказать, что я спокойно могу в своем компоненте работать на частоте 23.96МГц с этими сигналами и AXI_interconnect все разрулит? В нем уже есть 2 ряда D-триггеров в ту и другую сторону?
Нет. Частота 23.96МГц поступает на interconnect и уже из него она же попадает на AXI_CLK вашего блока.
А вообще на интерконнект есть даташит и можно почитать его чтобы снять все сомнения.

Цитата(Vadim_nsk @ Apr 28 2018, 10:34) <{POST_SNAPBACK}>
1. Если я вижу в названии сигналов впереди букву "А", я должен относиться к этому сигналу как к асинхронному и пропускать через 2 D-триггера работающие от моего клока?
Как я понимаю нет.
Цитата
2. Должен ли я свои выходные сигналы, сформированные от моего клока приводить к частоте AXI чреез 2 D-триггера или это забота AXI_interconnect?
переход между доменами делает interconnect
Цитата
3. Могу ли я ничего этого не делать, строя свой компонент таким образом, чтобы он целиком работал от частоты AXI?
Да при том что частота AXI для него будет ваши 24MГц

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MegaVolt @ Apr 28 2018, 14:38) <{POST_SNAPBACK}>
Как я понимаю нет.переход между доменами делает interconnect Да при том что частота AXI для него будет ваши 24MГц


S_AXI_ACLK : in std_logic;
это сигнал от AXI_Interconnect и он имеет частоту 100МГц. Я не могу подать свою частоту на шину, т.к. компонент slave и частота шины для него является входным параметром. Вся логика компонента завязана именно на частоте 23.96МГц, а управление осуществляется с шины AXI-lite. Просто мне кажется, что буква "А" в начале названий некоторых сигналов и такой явный акцент в презентациях Zynq, Microblaze на то, что эти сигналы являются ассинхронными служат какой-то цели. Ведь если убрать из названий эти буквы и акцент на ассинхронность, мне также придется переносить все входные сигналы управления в мой клок-домен, а выходные в клок-домен шины. Но в то же время, у буду "знать", что строя свой компонент синхронно с частотой шины, мне вообще не придется ставить пересинхронизацию.

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Vadim_nsk @ Apr 28 2018, 10:50) <{POST_SNAPBACK}>
S_AXI_ACLK : in std_logic;
это сигнал от AXI_Interconnect и он имеет частоту 100МГц. Я не могу подать свою частоту на шину, т.к. компонент slave и частота шины для него является входным параметром.
В какой среде вы работаете? Какая версия interconnecta?

Частоту нужно подвать не на шину а на интерконнект. Т.е. на интерконнект идут две частоту и 100 и 24. Из интерконнекта на ваш слейв идёт одна частота 24. Так по крайней мере в Vivado 17.4
Цитата
Просто мне кажется, что буква "А" в начале названий некоторых сигналов и такой явный акцент в презентациях Zynq, Microblaze на то, что эти сигналы являются ассинхронными служат какой-то цели.
Наверное.... деталей не знаю. Я вообще на это внимание не обрашал sm.gif

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(MegaVolt @ Apr 28 2018, 14:58) <{POST_SNAPBACK}>
В какой среде вы работаете? Какая версия interconnecta?


В данный момент это ISE14.7 и AXI Interconnect 1.06.a
Т.к. в ISE генерирование slave компонента делает убого и через шину IPIF (кажется так называется), я сделал иначе, запустил VIVADO 2016.4, сгенерировал пример slave-компонента в нем и перетащил исходники в ISE. Все работает, но вопросы остались открытыми. Нарыл вот такой документ: https://www.xilinx.com/support/documentatio...rence_guide.pdf все замечательно описано, но вопросы никуда не делись :-)

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата
Просто мне кажется, что буква "А" в начале названий некоторых сигналов и такой явный акцент в презентациях Zynq, Microblaze на то, что эти сигналы являются ассинхронными служат какой-то цели.

Но в шине AXI это никоим образом не так. Это вообще, не Xilinx, это ARM AMBA. Поэтому:
Цитата
1. Если я вижу в названии сигналов впереди букву "А", я должен относиться к этому сигналу как к асинхронному и пропускать через 2 D-триггера работающие от моего клока?

Нет.
ACLK - это:
Цитата
Each AXI component uses a single clock signal, ACLK. All input signals are sampled on the rising edge of ACLK. All output signal changes must occur after the rising edge of ACLK.
On master and slave interfaces there must be no combinatorial paths between input and output signals.


ARESETn - это, действительно, асинхронный сигнал сброса. Устанавливается асинхронно, снимается синхронно с ACLK

Другие буквы "A" - в сигналах ARREADY, AWREADY, AWADDR, ARADDR и т.п. - это сигналы, касающиеся адресов в каналах чтения и записи, и "A" в них означает "address".

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


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

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


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Vadim_nsk @ Apr 28 2018, 11:03) <{POST_SNAPBACK}>
В данный момент это ISE14.7 и AXI Interconnect 1.06.a

RTFM!!!!

Built-in clock-rate conversion:
• Each master and slave connection can use independent clock rates.
• Asynchronous clock conversion (uses more storage and incurs more latency than synchronous
conversion).

• An asynchronous clock conversion module performs either reduction or acceleration of clock-rates by passing
the channel signals through an asynchronous FIFO.

S_AXI_ACLK Input!!!
M_AXI_ACLK Input!!!
INTERCONNECT_ACLK Input

C_S_AXI_IS_ACLK_ASYNC
1 = SI slot clock is asynchronous to interconnect
native clock

C_M_AXI_IS_ACLK_ASYNC
1 = MI slot clock is asynchronous

Следовательно интерконнект может работать на своей частоте. И синхронизироваться как с мастером так и со слейвом. Т.е. Частоты мастера, интерконнекта и слейва могут быть разные.
Что ещё не понятно я не знаю.


Я уже сам разобрался пока объяснял sm.gif

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти