Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как правильно переносить данные с одного на другой клок домейны
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
iiv
Всем привет,

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

Пусть у меня есть два клока,

Код
wire Clk400, Clk200;
my_pll my_pll_module(Clk50, Clk400, Clk200);

которые я получаю с одного PLL и эти клоки имеют частоты 400 и 200МГц соответственно.

Мне часто надо переводить два данных с клока 200 в одно данное в клоке 400 и наоборот.

Можно конечно это делать и с помощью ФИФО, но вроде тут нечего конвейеризовать, поэтому хочется сделать например так:

Код
reg In400;
reg Out200[0:1];

reg In200[0:1];
reg Out400;

reg TempOut400, TempIn400;

always @(posedge Clk400)
begin
// переводим из 400 в 200
   TempIn400<=In400;
   if(Clk200) Out200<={TempIn400, In400};
// переводим из 200 в 400
   if(Clk200) {Out400, TempOut400}<=In200;
   else Out400<=TempOut400;
end


но у меня всегда при компиляции проекта возникают слаки от Clk200 к Out200 и Out400.

Посоветуйте, пожалуйста, кто знает, как с этим можно побороться!

Спасибо

ИИВ
des00
Цитата(iiv @ Apr 20 2011, 08:43) *
но у меня всегда при компиляции проекта возникают слаки от Clk200 к Out200 и Out400.

а идей не возникает почему так получается? а если Chip Editor посмотреть? или Technology mapper ? и порисовать от руки немного на бумажке ? biggrin.gif
iiv
Цитата(des00 @ Apr 20 2011, 21:48) *
а идей не возникает почему так получается? а если Chip Editor посмотреть? или Technology mapper ? и порисовать от руки немного на бумажке ? biggrin.gif

Да, видел я что в RTL получается, и понятно, что не должно оно на больших скоростях работать sad.gif Только вот у меня как-раз в том-то и вопрос, как такие конструкции ПРАВИЛЬНО реализуются? Вдруг кто сжалится и посоветует, буду очень благодарен! Уже весь вечер голову ломаю.
des00
Цитата(iiv @ Apr 20 2011, 10:12) *
Да, видел я что в RTL получается, и понятно, что не должно оно на больших скоростях работать sad.gif

RTL и скорости здесь причем ? я вам про что до этого говорил?
Цитата
Только вот у меня как-раз в том-то и вопрос, как такие конструкции ПРАВИЛЬНО реализуются? Вдруг кто сжалится и посоветует, буду очень благодарен! Уже весь вечер голову ломаю.

если вам нужен результат могу сказать правильное для вас решение, если вам нужно понимание и самостоятельный логический вывод почему так правильно, выкладывайте свои мысли сюда. Выбор за вами. biggrin.gif
iiv
Цитата(des00 @ Apr 20 2011, 22:23) *
RTL и скорости здесь причем ? я вам про что до этого говорил?

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

Согласен, что в Мап Вьювере поинтереснее sm.gif и очень благодарен Вам за возможность поучиться!

Мысли такие, рассмотрим вначале 400->200MHz. Для этого случая я вижу только две альтернативы, одна, как я написал
Код
always @(posedge Clk400)
begin
   TempIn400<=In400;
   if(Clk200) Out200<={TempIn400, In400};
end


и вот такая

Код
always @(posedge Clk400) TempIn400<=In400;
always @(posedge Clk200) Out200<={TempIn400, In400};


Последний вариант меня смущает тем, что при выполнении присваивания в Out200 исходные аргументы могут измениться. В то же время, этот вариант компилится без слаков. Что я здесь не так понимаю?

Теперь случай, когда на входе 200, а на выходе 400МГц.

Понятно, что можно написать что-то типа

Код
assign TempOut400=In200[Clk200];

always @(posedge Clk400)
  Out400<=TempOut400;


но я не могу логически почуствовать разницы между тем, что я написал старте топика и этим ассигном.

Буду очень благодарен тому, кто тыкнет меня носом в мои заблуждения.

ЗЫ Денис, опять ты мне Выкаешь, мне стыдно, а ты Вы да Вы.
des00
Цитата(iiv @ Apr 20 2011, 11:59) *
Мысли такие, рассмотрим вначале 400->200MHz. Для этого случая я вижу только две альтернативы, одна, как я написал
Код
always @(posedge Clk400)
begin
   TempIn400<=In400;
   if(Clk200) Out200<={TempIn400, In400};
end

наводящие вопросы :
1. Какое железо здесь описано?
2. В качестве какого сигнала тут использован глобальный тактовый сигнал?
3. Цена такого использования глобального тактового сигнала на целевой плис? (имеется в виду "цена" реализации : ресурс, задержки и т.д.)

Цитата
и вот такая
Код
always @(posedge Clk400) TempIn400<=In400;
always @(posedge Clk200) Out200<={TempIn400, In400};


Последний вариант меня смущает тем, что при выполнении присваивания в Out200 исходные аргументы могут измениться. В то же время, этот вариант компилится без слаков. Что я здесь не так понимаю?

наводящие вопросы:
1. Почему слаков нет ?
2. Как сделать так, что бы в этой схеме данные для присвоения в Out200 не изменялись, за период тактовой частоты clk200 ?

С остальным позже.
dinam
Возник аналогичный вопрос. Есть одна PLL в Cyclone II с которой идут синхронные 24 и 48 МГц, т.е. в настройках PLL я задал нулевой фазовый сдвиг. Надо ли мне бояться метастабильности и ставить регистры для перехода сигналов и данных из одного в другой тактовые домены?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.