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

несколько клоков для одного модуля

Добрый день,

 

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

 

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

module DATA_Aq(Clk, In, ClkOut, Res);
input Clk, ClkOut;
input [13:0] In[0:3];
output reg Res;

 

мне хочется гонять его на разных частотах входного клока (Clk), а именно 150,200,250,300МГц. На самой борде у меня есть клок в 50МГц, то есть с помощью 4 PLL (а может и 3-х, если 150 и 300 совместить) я могу получить на

 wire Clk150, Clk200, Clk250, Clk300;

все мне необходимые клоки.

 

Дальше я хотел с помошью входной переменной SW[1:0] принять решение какой клок мне нужен:

module test(OSC1_50, SW, InData, ClkOut, CLK_OUT)
//...
input OSC1_50; // входной клок 50МHz
input [1:0] SW;
input [13:0] InData[0:3];
input ClkOut;
output Res;
output CLK_OUT; // сюда мне также надо выдать этот клок
//...

wire Clk150, Clk200, Clk250, Clk300;
wire Clk;

DATA_Aq DATA_Aq_module(Clk, InData, ClkOut, Res);

my_pll1 my_pll_module1(OSC1_50, Clk150); // с помощью ALTPLL я здесь получаю необходимые клоки
my_pll2 my_pll_module2(OSC1_50, Clk200);
my_pll3 my_pll_module3(OSC1_50, Clk250);
my_pll4 my_pll_module4(OSC1_50, Clk300);

// вот тут я пытаюсь объединить клоки, но, кажется, чего-то не понимаю, и у меня ничего не работает,
// помогите, пожалуйста, понять что я делаю не правильно!
assign Clk=(SW[1])?((SW[0])?Clk300:Clk250):((SW[0])?Clk200:Clk150);
assign CLK_OUT=(SW[1])?((SW[0])?Clk300:Clk250):((SW[0])?Clk200:Clk150);
endmodule

 

Что получается: в Clk приходит всегда один и тот же клок, точно его частоту я понять не смог, но она получается порядка 100МГц...

 

Также Квартус не дает информации о максимально допустимом FMax для Clk, хотя есть компилить только модуль test, то Квартус показывает FMax(85C)=280MHz, FMax(0C)=310MHz.

 

Подскажите, пожалуйста, что же я делаю не правильно?

 

Спасибо

 

Иван

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


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

Может быть сделать два модуля, основной и ведомый. Ваш модуль сделать ведомым, на входе одна PLL. Запрограммировать PLL мастер модулем, запустить, залочить и после этого отпустить ресет, пришла новая частота, подать сброс на ведомый модуль, поменять параметры PLL, дождаться устойчивой работы и опять отпустить ресет.

 

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


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

Что получается: в Clk приходит всегда один и тот же клок, точно его частоту я понять не смог, но она получается порядка 100МГц...

Также Квартус не дает информации о максимально допустимом FMax для Clk, хотя есть компилить только модуль test, то Квартус показывает FMax(85C)=280MHz, FMax(0C)=310MHz.

Подскажите, пожалуйста, что же я делаю не правильно?

Спасибо

Иван

Переменная SW не задействована, т.е. равна 0 и Clk=Clk150.

Ваша тестовая частота - результат работы двух последовательных мультиплексоров, т.е. комбинаторики и при этом на входы подаются частоты с разных мест, т.е. нет синхронности по фазе. Результат о максимальной частоте Вас огорчит. А не определил максимальную частоту quartus скорее всего из-за того, что Вы возможно не задали ограничения на все тактовые частоты, включая сигнал Clk в sdc файле.

PS. В чем проблема использовать одну pll для генерирования всех частот из одного места, какой кристалл?

PSS. Лучше сделать как tAmega советовал.

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


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

Добрый день, Роман,

 

благодярю Вас за то, что разбираетесь с моей проблемой!

 

Переменная SW не задействована, т.е. равна 0 и Clk=Clk150.

SW у меня входная переменная, на входе то, что на включателях борды. Работает, проверял.

 

Ваша тестовая частота - результат работы двух последовательных мультиплексоров, т.е. комбинаторики и при этом на входы подаются частоты с разных мест, т.е. нет синхронности по фазе. Результат о максимальной частоте Вас огорчит.

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

 

А не определил максимальную частоту quartus скорее всего из-за того, что Вы возможно не задали ограничения на все тактовые частоты, включая сигнал Clk в sdc файле.

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

create_clock -name {Clk} -period 2.400 -waveform { 0.000 1.200 } [get_ports { Clk }]

может быть как-то по-другому надо было писать?

 

PS. В чем проблема использовать одну pll для генерирования всех частот из одного места, какой кристалл?

квартус ругается и не дает. Кристалл Стратикс 3, второй спидгрейд.

 

PSS. Лучше сделать как tAmega советовал.

не до конца понял, сейчас буду задавать уточняющие вопросы, вдруг сможете прояснить!

 

Добрый день, tAmega,

 

спасибо что откликнулись и помогаете разобраться с моей проблемой!

 

Может быть сделать два модуля, основной и ведомый. Ваш модуль сделать ведомым, на входе одна PLL. Запрограммировать PLL мастер модулем, запустить, залочить и после этого отпустить ресет, пришла новая частота, подать сброс на ведомый модуль, поменять параметры PLL, дождаться устойчивой работы и опять отпустить ресет.

правильно ли я понимаю, что Вы предлагаете менять частоту в самом ALTPLL? Если да, то, боюсь, что не получится, так как с 50МГц я не смог получить даже два клока, не говоря уж о всвех четырех. Если я Вас не правильно понял, пожалуйста, не обижайтесь на меня, и помогите, пожалуйста, мне Вас понять!

 

Есть еще один маленький ньюанс, возможно он поможет как-то разобраться в причинах этой незадачки.

 

Я потестироваться с одним pll, то есть с одной частотой.

 

Там тоже есть проблема.

 

Пусть я написал так:

module test(OSC1_50, SW, InData, ClkOut, CLK_OUT)
//...
input OSC1_50; // входной клок 50МHz
input [13:0] InData[0:3];
input ClkOut;
output Res;
output CLK_OUT; // сюда мне также надо выдать этот клок
//...

wire Clk;

DATA_Aq DATA_Aq_module(Clk, InData, ClkOut, Res);

my_pll4 my_pll_module4(OSC1_50, Clk300); // с помощью ALTPLL я здесь получаю необходимые клоки

assign Clk=Clk300;
assign CLK_OUT=Clk300;
endmodule

то на выходе с борды по осциллографу все в порядке, а вот на вход модуля DATA_Aq клок не передается.

 

Если я соединяю проводком CLK_OUT и EXT_CLK и присваиваю

 

assign Clk=EXT_CLK;

 

то модуль начинает функционировать.

 

Но если в выходе CLK_OUT поставить разветвитель и запитать клок внешней борды и EXT_CLK, то в EXT_CLK уже клока нет, типа борда все на себя тянет. Мне критично подать тот же клок, что и внутри плиски, на внешнюю борду, так как входные данные должны быть синхронизованы.

 

Против этого я нашел кривое, но рабочее решение:

module test(OSC1_50, SW, InData, ClkOut, CLK_OUT, EXT_CLK)
//...
input OSC1_50; // входной клок 50МHz
input [1:0] SW;
input [13:0] InData[0:3];
input ClkOut, EXT_CLK;
output Res;
output CLK_OUT; // сюда мне также надо выдать этот клок
//...

wire Clk300, Clk600;
reg Counter300;

DATA_Aq DATA_Aq_module(Counter300, InData, ClkOut, Res);

my_pll4 my_pll_module4(OSC1_50, Clk300); // на выходе 300 МГц
my_pll8 my_pll_module8(OSC1_50, Clk600); // на выходе 600 МГц

always @(posedge Clk600) Counter300<=~Counter300;
endmodule

 

но что-то мне подсказывает, что это какое-то кривое решение. А надо мне именно 4 разных клока, то есть то, что у меня совсем не работает.

 

Вдруг кто сможет мне посоветовать что же тут я делаю не правильного, и как правильно будет!

 

Спасибо

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


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

Сваял простенький модуль, для указанного Вами семейсива (самый простой кристалл):

module test_mux (clk,in_reg,SW,clk_out,out_reg);

input clk /* synthesis chip_pin = "l2" */;
input [1:0] SW/* synthesis altera_attribute="-name VIRTUAL_PIN ON" */;
input [13:0] in_reg/* synthesis altera_attribute="-name VIRTUAL_PIN ON" */;
output reg clk_out/* synthesis altera_attribute="-name VIRTUAL_PIN ON" */;
output reg [13:0] out_reg/* synthesis altera_attribute="-name VIRTUAL_PIN ON" */;

wire clk_150,clk_200,clk_250,clk_300;
reg [13:0] in_delay;

pll_150 pll_150(.inclk0(clk),.c0(clk_150));
pll_200 pll_200(.inclk0(clk),.c0(clk_200));
pll_250 pll_250(.inclk0(clk),.c0(clk_250));
pll_300 pll_300(.inclk0(clk),.c0(clk_300));

always @(*) case (SW)
    2'b11:clk_out=clk_300;
    2'b10:clk_out=clk_250;
    2'b01:clk_out=clk_200;
    default:clk_out=clk_150;
    endcase

always @(posedge clk_out) begin
    in_delay<=in_reg;
    out_reg<=in_delay;
    end

endmodule

В sdc указал только ограничения на входную тактовую частоту и derive pll clock. clk_out - пустил по глобальной шане (по глобальной шине тактовых сигналов пустить его не удалось, ибо этот сигнла формируется на логике).

Результат - quartus сделал всего 2 pll, одну на 250МГц, и одну на остальные. Максимальные частоты - более 500МГц для всех моделей анализа, НО очень много Slack и они большие (более 20нс) в момент переключения мультиплексоров на рабочую частоту (при переходе с одной рабочей частоты на другую) из-за причин, указанных мною ранее.

Выход - формирование некоего сброса на несколько рабочих тактов и подача его на всю рабочую логику, начало формирования сброса - изменение сигнала SW, при отсутствии этого сброса возможны глюки в этот момент времени и, при наличии обратной связи неработоспособность схемы.

 

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


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

А если преобразование частоты не требуется, используется только частота внешнего кварца, насколько полезным было бы использовать PLL? Время компиляции увеличивается.

 

Вставил блок PLL в маленький проект, в котором урезанная версия RS-232 контроллера. Если моделирование проводить в Квартусе, то время, затрачиваемое на симуляцию в разы возрастает.

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


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

Здравствуйте, Иван.

Если изменение частоты Вам нужно только для изменения общего быстродействия и важно её среднее значение, а не равномерность каждого такта, то можно применить подход с пропуском тактов одной максимальной частоты 300 МГц.

Например, пропустив 1 из 6 тактов частоты 300 МГц, Вы получаете среднюю 250 МГц, 2 из 6 - 200 МГц, 3 из 6 - 150 МГц.

Разумеется, что сама задача и дизайн должны допускать такой подход.

Для пропусков можно сделать отдельный счётчик состояний от 0 до 5 с выработкой периодов Enable/Disable (в зависимости от состояния SW) для всего остального дизайна, где уже ввести этот сигнал разрешения.

Управляющие сигналы SW надо тоже стробировать частотой 300 МГц и тогда у Вас не будет проблем с переключением частот.

Но ещё раз предупреждаю - далеко не всегда это правильно, например, запустить интерфейс с 200/250МГц ОЗУ таким образом не получится.

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


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

А если преобразование частоты не требуется, используется только частота внешнего кварца, насколько полезным было бы использовать PLL? Время компиляции увеличивается.

Вы когда нибудь смотрели частоту с кварца на входном пине ПЛИС с помощью осциллографа? Если есть возможность пропустить через pll - пропускайте.

Если моделирование проводить в Квартусе, то время, затрачиваемое на симуляцию в разы возрастает.

На моделсиме или VCS такого не наблюдал.

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


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

В sdc указал только ограничения на входную тактовую частоту и derive pll clock. clk_out - пустил по глобальной шане (по глобальной шине тактовых сигналов пустить его не удалось, ибо этот сигнла формируется на логике).

 

Результат - quartus сделал всего 2 pll, одну на 250МГц, и одну на остальные. Максимальные частоты - более 500МГц для всех моделей анализа, НО очень много Slack и они большие (более 20нс) в момент переключения мультиплексоров на рабочую частоту (при переходе с одной рабочей частоты на другую) из-за причин, указанных мною ранее.

Выход - формирование некоего сброса на несколько рабочих тактов и подача его на всю рабочую логику, начало формирования сброса - изменение сигнала SW, при отсутствии этого сброса возможны глюки в этот момент времени и, при наличии обратной связи неработоспособность схемы.

 

Уважаемый Роман,

 

огромное Вам спасибо! Ваш ответ помог мне найти баг, я забыл написать derive pll clock, вернее до Вашего ответа не знал о ее существовании!!!

 

Кстати, в топикстарте я кажется ошибся с количеством используемых PLL - действительно, на 200, 250, 300, 350МГц используется только 2 штуки, в то время как я пробовал и еще один дизайн с 250, 300, 350, 400МГц, где их уже было больше (не 4, а 3 получается).

 

По поводу слаков - борюсь с этим другими методами, после переключения частоты я могу почти милисекунду нечего не делать, поэтому меня это не сильно тревожит. На более низких частотах у меня схема почти в 2 раза меньше энергии потребляет, поэтому мне это очень сподручно, но, бывает, что данных много и надо включить вентилятор и пустить максимальную частоту :)

 

Кстати у меня слаки до 30 микросекунд доходят, так как сам модуль довольно заумный.

 

Здравствуйте, Иван.

Если изменение частоты Вам нужно только для изменения общего быстродействия и важно её среднее значение, а не равномерность каждого такта, то можно применить подход с пропуском тактов одной максимальной частоты 300 МГц.

Например, пропустив 1 из 6 тактов частоты 300 МГц, Вы получаете среднюю 250 МГц, 2 из 6 - 200 МГц, 3 из 6 - 150 МГц.

Разумеется, что сама задача и дизайн должны допускать такой подход.

Для пропусков можно сделать отдельный счётчик состояний от 0 до 5 с выработкой периодов Enable/Disable (в зависимости от состояния SW) для всего остального дизайна, где уже ввести этот сигнал разрешения.

Управляющие сигналы SW надо тоже стробировать частотой 300 МГц и тогда у Вас не будет проблем с переключением частот.

Но ещё раз предупреждаю - далеко не всегда это правильно, например, запустить интерфейс с 200/250МГц ОЗУ таким образом не получится.

Добрый день, Евгений,

 

большое спасибо за идею! Она также разумна для моего другого проекта, но именно в этом проекте все у меня завязанно на то, что мне надо этот клок отдавать и внешнему потребителю, а потом синхронизоваться с его ответом, а внешний потребитель скорее всего будет глючить при пропусках. Кстати, возможно таким образом, если мне не будет хватать пллек, я, например, мог бы самопально реализовать делитель, то есть работать, например, на частотах 300, 200, 150, 120, 100 МГц, имея исходную в 600МГц.

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


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

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

Вы учтите, что quartus будет разводить схему согласно неким временным требованиям и увидя, что есть проблемы во времени переключения SW будет пытаться соптимизировать именно эти пути, игнорируя, возможно, другие - критические для Вашего дизайна, проект будет разведен неоптимально. Соответственно было бы правильным указать, что Вам не важно время переключения и отключить оптимизацию и анализ путей во время установки - для этого есть ограничение set_false_patch.

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


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

Мне еще отец говорил - система должна быть синхронная. Один быстрый такт на всю схему и там уже несколько CE(разрешения работать) длительностью 1 быстрый такт.

примерно так

 

а уж чего у Вас будет в формировании СЕ ...

 

always @(posedge clk)

if(ce) begin//

a <= a + 1;

end

 

 

А уж если решили мультиплексировать клоки, то пользуйтесь штатными средствами - Altclkctrl например

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


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

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

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

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

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

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

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

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

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

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