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

Удвоение клока задержками логики

Пытаюсь удвоить клок задержками логики:

задержать клок на входе на четверть периода, затем подать входной и задержанный на XOR и получить удвоенный клок с примерно 50% duty cycle.

Ессно, решение кривое, но что-то более серьезное сейчас нет возможности делать (есть на то причины), нужно срочно как временное решение.

 

Вот код:

library ieee;
use ieee.std_logic_1164.all;

entity OLED_interface is
port (
    CLK_IN: in std_logic;
    and1_sig_out, and2_sig_out: out std_logic;
    CLK_OUT:             out std_logic
);
end entity;

architecture OLED_interface_arch of OLED_interface is
    attribute syn_keep: boolean;
    signal and1_sig, and2_sig, CLK_OUT_sig: std_logic;
    attribute syn_keep of and1_sig, and1_sig_out, and2_sig, and2_sig_out, CLK_OUT_sig: signal is true;

begin
            and1_sig <= CLK_IN and '1';
            and1_sig_out <= and1_sig;
            and2_sig <= and1_sig and '1';
            and2_sig_out <= and2_sig;
            
            CLK_OUT_sig <= and2_sig xor CLK_IN;
            CLK_OUT <= CLK_OUT_sig;
        
end;

 

первый and1_sig_out в timing simulation дает сдвиг клока, второй (and2_sig_out) не дает относительно первого - т.е. повторяет and1_sig_out в плане timingа. Это то что показывает ModelSim.

Кроме того, CLK_OUТ заткнут в нуле, XORа не делает с and2_sig...

 

Подскажите, в чем лажа ? (или может кто предложит более нормальное решение удвоения клока без PLLей при сохранении 40-60% duty cycle ?)

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


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

возможно оптимизатор выкидывает ваши задержки, так же, как компилятор оптимизирует пустые циклы и паузы на нопах

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


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

Пытаюсь удвоить клок задержками логики:

Подскажите, в чем лажа ? (или может кто предложит более нормальное решение удвоения клока без PLLей при сохранении 40-60% duty cycle ?)

 

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

Вот только меандр так Вы с большим трудом получите. И ресурсов может не хватить.

На циклоне длительность импульса на двух lcell составила 1.5нс

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

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


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

возможно оптимизатор выкидывает ваши задержки, так же, как компилятор оптимизирует пустые циклы и паузы на нопах

 

Да, оптимизатор в синтезе действительно будет выкидывать задержки, именно поэтому вставил атрибуты синтезатора (Synplify) удерживающие nodes от оптимизации.

Первая задержка сработала - симулятор показывает ее (and1_sig), a вот далее - упразднил (т.е. and2_sig просто повторяет в timingе and1_sig). Порылся на форуме Lattice - наткнулся на похожий вопрос по искуственным задержкам. Support Latticeа ответил что атрибут удержания нодов с Synplicity (syn_keep в VHDL), при cascaded multiple nodes конфигурации действительно удерживает первый node, но остальные все равно будут упразднены. Что-бы этого не случилось они рекоммендуют вставлять двойные инверторы в такие nodes ибо синтезатор не упараздняет инверторы...:

http://www.latticesemi.com/forums/forum/me...p;enterthread=y

 

вроде сделал это:

architecture OLED_interface_arch of OLED_interface is
    attribute syn_keep: integer;
    signal and1_sig, and2_sig, and1_sig_not1, and1_sig_not2, CLK_OUT_sig: std_logic;
    attribute syn_keep of and1_sig, and1_sig_not1, and1_sig_not2, and2_sig, CLK_OUT_sig: signal is 1;
    attribute OPT: string;
    attribute OPT of and1_sig, and1_sig_not1, and1_sig_not2, and2_sig, CLK_OUT_sig: signal is "KEEP";

begin
    
            and1_sig <= CLK_IN and '1';
            and1_sig_out <= and1_sig;
            and1_sig_not1 <= not and1_sig;
            and1_sig_not2 <= not and1_sig_not1;
            and2_sig <= and1_sig_not2 and '1';
            and2_sig_out <= and2_sig;
            
            CLK_OUT_sig <= and1_sig_not2 xor CLK_IN;
            CLK_OUT <= CLK_OUT_sig;
        
end;

 

все равно не помагает.

 

Кроме того, XOR не работает ибо почему-то оптимизированный сигнал вместо задержанного and1_sig_not2...не пойму почему....

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


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

Поставьте внешний генератор и не партесь.

Даже на эдементах средней степени интеграции от такого умножителя были одни неприятности.

Солнышко пригреет и все в разнос идет. неужели в кристалле pll нет

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


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

Поставьте внешний генератор и не партесь.

Даже на эдементах средней степени интеграции от такого умножителя были одни неприятности.

Солнышко пригреет и все в разнос идет. неужели в кристалле pll нет

 

Да, вы правы, факторы типа температуры могут вполне повлиять... :cranky: .

PLL в чипе есть, но он начинате работать с 25MHz а у меня 13 MHz клок.

 

Внешний генератор ? Проблема в том что борд-то уже готов, частично работает, борд очень плотный, сложная разводка и т.д. и т.п. Кроме того, если делать внешним генератором то он должен быть закрыт на фазу исходного клока (т.е. внешний PLL ?) ибо он клок данных и видео синхронизации.

Да и скорее всего к нему физически не подобраться (к сигналу) ибо источник (CPU) и приемник (CPLD) - оба BGA и расположены на плане один над другим (component side - print side), на самом сигнале - никакого резистора, он проходит от донго чипа к другому под ними....

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


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

Есть еще один вариант задержки, он для системы оптимизаторов менее "прозрачный" - делать задержки на latch с G = '1', только прийдется навесить пачку constraints на этот сигнал G, чтобы система его не выкинула (вместе с latch) - термины/входы по среде Xilinx.

 

Что-то у Вас я не нашел ни ссылку на среды разработки ни на использованный ПЛИС - без этого затруднительно что-то советывать...

 

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

Вдобавок вы можете положить элементы задержки в разные концы кристала (дял FPGA) - тогда в задержку включиться еще и разводочный ресурс ;-))

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


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

2 Саша Z

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

Как тут дела обстоят у латиса (вроде эту МС вы используете), а у ксилинкса через FPGA Editor найти все элементы нужной цени, узнать их физические имена и прописать в ucf файле жесткий лок на элемент программируемого массива ПЛИС

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


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

Да, вы правы, факторы типа температуры могут вполне повлиять... :cranky: .

PLL в чипе есть, но он начинате работать с 25MHz а у меня 13 MHz клок.

 

Внешний генератор ? Проблема в том что борд-то уже готов, частично работает, борд очень плотный, сложная разводка и т.д. и т.п. Кроме того, если делать внешним генератором то он должен быть закрыт на фазу исходного клока (т.е. внешний PLL ?) ибо он клок данных и видео синхронизации.

Да и скорее всего к нему физически не подобраться (к сигналу) ибо источник (CPU) и приемник (CPLD) - оба BGA и расположены на плане один над другим (component side - print side), на самом сигнале - никакого резистора, он проходит от донго чипа к другому под ними....

А может стоит попробывать более правильное железо(пока еще не поздно)?

Например возьмите Spartan StarterKit S3E от Xilinx, на кристалле PLL работает от 5 MHz,

есть разъем на свободные ноги плис. Можно быстро сделать несложную двусторонюю платку - переходник на вашу панель, вообщем это недорого то и стоит, преимущества очевидны: не надо извращаться в коде, все можно сделать правильно, этот борд как раз хорошо подходит для таких задач. Ну а после того как отладите алгоритм, не фокус будет спроектировать и сделать suitable hardware.

 

ps

я бы советовал не извращаться(все выше и ниже описанное) с clk для видеосигнала, потому как фаза clk не должна "плавать", лучше сделать правильно и надежно через PLL.

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


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

С chds полностью согласел, встречался даже, что в Xilinx XPLA3 проект перестал работать из-за другой партии ПЛИС.

Сделал я не очень корректное место (в блочке по переводу события с одного clk на другой). Вот пришли ПЛИС 2007 года выпуска и проект (уже готовая прошивка) перестал работать, а на ПЛИС до 2007 года все работает прекрасно. Заметьте: ревизии ПЛИС совпадают, различаются только даты производства и партии.

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


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

В принципе, делал такое на MAX3000. Все нормально работало. Описание еще на AHDL, но думаю не составит труда разобраться ;)

 

SUBDESIGN multi1 -- умножитель частоты в 2 раза

(

clk_in : INPUT; -- входной сигнал

clk_out : OUTPUT; -- выходной сигнал

)

VARIABLE

d_f[1..0] : DFF;

dd[5..0]: LCELL;

clk_out : LCELL;

 

BEGIN

d_f[1..0].clk = (clk_in, !clk_in);

d_f[1..0].d = vcc;

d_f[1..0].clrn = dd[5..4].out; -- протяжка

dd[5..2].in = dd[3..0].out;

dd[1..0].in = !d_f[1..0].q;

clk_out.in = d_f[1] # d_f[0];

END;

 

Меняя количество LCELL можно подправить форму сигнала.

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


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

Вот что нарылось, взял ОТСЮДА:

# Как удвоить тактовый сигнал? Если на кристалле нет PLL, то Fx2 = Fin $ LCELL(Fin); - XOR на задержке. Способ, конечно некрасивый, но если нет другого выхода... Th получается длительностью в задержку на LCELL, при необходимости можно поставить несколько LCELL. Проверено - работает.

 

А в англоязычной части пишут:

XOR has two inputs isnt it?

First inputs conect to systemclock.Next input is connected with 1/4th delay time systemclock what u connected in first input.

 

Вроде задержать сигнал на 1/4th периоде плевое дело :)

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


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

Вот вариант сотрудника Xilinx (Peter Alfke). См. #4 по ссылке.

 

http://www.pldworld.com/_xilinx/html/tip/sixeasypieces.htm

 

6easy_4.gif

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


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

Спасибо всем.

Теперь по порядку:

Boris_TS: работаю с Латтисом (ISPLever), чип о котором идет речь: семейство MachXO 2280C.

 

chds: да, это реальный проэкт на работе. Достался "по наследству" (тяжелое наследие), разрабатывался фирмой - подрядчиком года 2 тому, теперь дисплеы который там дарйвиться перестал выпускаться, а новая версия теерь требует значительно более высокой частоты, соответственно и логика ее драйвящая должна работать ан соотв. частотах...

Железо уже давно готово, работает (со старым дисплеем), менять чип (CPLD/FPGA) - не вариант в данной версии системы. В новой версии ессно будем менять возможно и concept, да и у Латтица тоже предостаточно нормальных чипов..

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

Насчет "не извращяться" - это верно, посему и в начале и думали в сторону PLLя чтоб держать фазу. А умножая клок с постоянной задержкой - фаза сохранялась-бы (с определенной постоянной задержкой), но опять-же ежели исключить влияния среды, работать с одной и той-же серией CPLD и т.д. и т.п.

Не понял что вы имели ввиду насчет англо-язычной литературы...

Ессно что у XORа 2 входа, и я так именно и пытаюсь делать - сделать задержку на четверть периода и ее пдоать вместе с оригинальным клоком на вход XORa. Тут и так все понятно.

А задержать на 1/4 периода пытаюсь несколькими инверторами или andами с постоянной '1' по одному входу.

 

Джеймс: спасибо, попробую...

 

А вообще я не могу не согласиться с общим мнением о проблематичности такого подхода, но как говориться: last resort...

В целом проверяю takve опцию добавить внешний PLL чип и запустить его в CPLD...

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


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

Спасибо всем.

Теперь по порядку:

Boris_TS: работаю с Латтисом (ISPLever), чип о котором идет речь: семейство MachXO 2280C.

 

Когда-то читал статью, как у Virtex можно извлечь встроенный configuration clock на пользовательский уровень и работать от него. За давностью лет подробностей не помню. Может быть и в вашем случае попробовать посмотреть в эту сторону?

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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