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

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

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

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


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

Есть шина AXI, у нее есть два сигнала ARst и AClk. Как я это понимаю, AXI-master может жить и работать в одном clock-домене, а AXI-slave в другом (клоки то ассинхронные).

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

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


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

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

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


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

Что позволяет шине быть особенной и не иметь единного клока?
Я так понимаю AXI_interconnect занимается согласованием доменов.

 

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


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

Я так понимаю 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?

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


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

Предположим, что S_AXI_ACLK имеет частоту 100МГц

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

Нет. Частота 23.96МГц поступает на interconnect и уже из него она же попадает на AXI_CLK вашего блока.

А вообще на интерконнект есть даташит и можно почитать его чтобы снять все сомнения.

 

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

 

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


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

Как я понимаю нет.переход между доменами делает interconnect Да при том что частота AXI для него будет ваши 24MГц

 

S_AXI_ACLK : in std_logic;

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

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


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

S_AXI_ACLK : in std_logic;

это сигнал от AXI_Interconnect и он имеет частоту 100МГц. Я не могу подать свою частоту на шину, т.к. компонент slave и частота шины для него является входным параметром.

В какой среде вы работаете? Какая версия interconnecta?

 

Частоту нужно подвать не на шину а на интерконнект. Т.е. на интерконнект идут две частоту и 100 и 24. Из интерконнекта на ваш слейв идёт одна частота 24. Так по крайней мере в Vivado 17.4

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

 

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


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

В какой среде вы работаете? Какая версия 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".

 

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


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

В данный момент это 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

 

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

Что ещё не понятно я не знаю.

 

 

Я уже сам разобрался пока объяснял :)

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


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

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

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

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

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

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

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

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

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

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