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

Перенос данных между доменами

Переход шины данных выполняется из домена 275МГц в домен 137,5МГц(децимация после фильтра). Причём STA на эту шину смотрит весьма положительно(см. скриншот). А сигнал-тап показывает в районе курсора явный "выбой" четырёх бит из шины. И по поведению в проекте я вижу что после децимации сигнал очень шумный(полно "иголок"). Сетапы-холды соблюдаются а шина "крошится". Это как? Что посоветуете, коллеги? Вообще-то я всегда доверял STA.

post-18832-1527678678_thumb.png

post-18832-1527678689_thumb.png

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


Ссылка на сообщение
Поделиться на другие сайты
Переход шины данных выполняется из домена 275МГц в домен 137,5МГц(децимация после фильтра). Причём STA на эту шину смотрит весьма положительно(см. скриншот). А сигнал-тап показывает в районе курсора явный "выбой" четырёх бит из шины. И по поведению в проекте я вижу что после децимации сигнал очень шумный(полно "иголок"). Сетапы-холды соблюдаются а шина "крошится". Это как? Что посоветуете, коллеги? Вообще-то я всегда доверял STA.

А как осуществляется перенос из домена в домен ?

Обычно домены помечают, как пути которые STA вообще не должен анализировать.

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


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

Обычно домены помечают, как пути которые STA вообще не должен анализировать.

1). Здесь data50 в домене 275, а data50r в домене 137,5МГц

PROCESS (iclk2x)
BEGIN    
    if Rising_Edge(iclk2x) then 
        data50r <= data50;
    end if;
END PROCESS;

2). Вы не правы.

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


Ссылка на сообщение
Поделиться на другие сайты
1). Здесь data50 в домене 275, а data50r в домене 137,5МГц

PROCESS (iclk2x)
BEGIN    
    if Rising_Edge(iclk2x) then 
        data50r <= data50;
    end if;
END PROCESS;

 

Ставьте через 2 регистра, либо через разноклоковое FIFO, либо рукопожатиями (handshake).

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


Ссылка на сообщение
Поделиться на другие сайты
Ставьте через 2 регистра, либо через разноклоковое FIFO, либо рукопожатиями (handshake).

handshake здесь никаким боком. Согласно отчёту STA должно работать и с одним регистром. При нарушениях метастабильности "выбой" бит имеет другой характер.

А насчёт фифо - это версия резервная,уж больно с ресурсами напряг.

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


Ссылка на сообщение
Поделиться на другие сайты
Ставьте через 2 регистра, либо через разноклоковое FIFO, либо рукопожатиями (handshake).

Вообще нет смысла гнать всю шину через 2 регистра. Можно это сделать с сигналом "готовность" и по его приходу читать данные...

 

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


Ссылка на сообщение
Поделиться на другие сайты
Ставьте через 2 регистра, либо через разноклоковое FIFO, либо рукопожатиями (handshake).
Не знаю что за оболочка. Но для Xilinx например отлично переход получается если оба клока сгенерены из одного делением на два.

 

Где глюк если честно по картинкам не понял :(

 

 

 

iclk2x это 275 МГц? Должна же быть половинная?

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


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

все советы для асинхронных доменов :)

 

а data50 тикает каждый такт на 275 или через один?

может поэкспериментировать с привязкой этого "через один" - то есть добавить регистр с енабле на 275, а это енабле с т-триггера или его инверсии

ну или фазу этого 137.5 подвигать, они же из одной PLL идут?

 

ну а вообще никогда такого не видел, чтобы синхронные домены неправильно защелкивались - может в железе не все чисто? с формированием тактов, например

 

upd: со STA картинку посмотрел - а с холдами там все хорошо? каким констрейном задано? все-таки multicycle по холдам неочевидно

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


Ссылка на сообщение
Поделиться на другие сайты
2). Вы не правы.

Вполне возможно :laughing:

Однако домены то разные могут быть. Могут быть полностью асинхронные и независимые друг другу. Тогда в SDC указывают (во всяком случае я сразу пишу, чтобы Timequest не анализировал эти пути):

set_clock_groups -exclusive -group [get_clocks {clk1}] \ 
                            -group [get_clocks {clk2}]

Вот в этом случае либо DCFIFO либо Handshake.

А могут быть где частота другого домена, получена делением частоты исходного домена. Как у Вас.

Вот тут уже есть варианты.

1. Частота получена на обычном PLL.

2. Частота получена делением на триггере.

Обязательно должны быть указаны констрейны на эту частоту.

Я ещё применяю в этом случае альтеровский примитив. Хотя вроде Quartus должен его впихнут автоматом. Но это не точно.

 

library altera; 
    use altera.altera_primitives_components.all;
...
...
...
    clock_buff : GLOBAL
    port map 
    (
        a_in  => new_clk, 
        a_out => new_clk_buff
    );

А можно просто формировать сигнал валидности данных, и не заморачиваться с клоковым доменом :rolleyes:

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


Ссылка на сообщение
Поделиться на другие сайты
Вообще нет смысла гнать всю шину через 2 регистра. Можно это сделать с сигналом "готовность" и по его приходу читать данные...

Ребята, давайте жить дружно... Какая готовность? Шина идёт с выхода фильтра, поток идёт непрерывно.

А второй регистр,согласен, конечно смысла не имеет.

 

все советы для асинхронных доменов :)

 

а data50 тикает каждый такт на 275 или через один?

может поэкспериментировать с привязкой этого "через один" - то есть добавить регистр с енабле на 275, а это енабле с т-триггера или его инверсии

ну или фазу этого 137.5 подвигать, они же из одной PLL идут?

 

ну а вообще никогда такого не видел, чтобы синхронные домены неправильно защелкивались - может в железе не все чисто? с формированием тактов, например

1).data50 тикает каждый такт на 275МГц.

2). Насчёт фазы - есть ещё куча всего разного в этих доменах, стоит 10 раз подумать прежде чем крутить...

3). Я тоже в ступоре... У меня был рабочий проект с банком из пяти фильтров, заказчик попросил добавить ещё один фильтр и пошло-поехало...

 

Не знаю что за оболочка. Но для Xilinx например отлично переход получается если оба клока сгенерены из одного делением на два.

 

Где глюк если честно по картинкам не понял :(

 

 

 

iclk2x это 275 МГц? Должна же быть половинная?

Сорри, это я недорассказал...

Intel Quartus

iclk2x - 137,5МГЦ

iclk4x - 275МГЦ (в этом домене порождается шина data50)

Клоки из PLL

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


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

А приложите сюда SDC файлик. Дюже интересно посмотреть, что там происходит.

 

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


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

> 1).data50 тикает каждый такт на 275МГц.

 

еще раз про hold-ы напишу

 

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


Ссылка на сообщение
Поделиться на другие сайты
А приложите сюда SDC файлик. Дюже интересно посмотреть, что там происходит.

Та похоже и я накосячил, хотелось по быстрячку...

Поставил обычный FIR, а на выходе просто проредил. А надо было отполифазить....

Имхо, по любому будет лучше. Вот если не захочет - тогда тему продолжим.

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


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

Клоки из PLL
Вот верно ли учтено их фазовое соотношение на выходе?

Частоты делённые получены делением или тоже с PLL?

 

Софт из Xilinx делитель понимает сам и никакие времянки уточнять ручками не нужно.

 

Но были глюки такого плана когда делители на 2 и на 4 запускались не синхронно и прошлось на них заводить сигнал ресет. Возможно у вас тот же глюк.

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


Ссылка на сообщение
Поделиться на другие сайты
> 1).data50 тикает каждый такт на 275МГц.

 

еще раз про hold-ы напишу

 

Виноват, не заметил...

post-18832-1527686612_thumb.png

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


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

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

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

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

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

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

Войти

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

Войти