реклама на сайте
подробности

 
 
> Удвоение клока задержками логики, Да, не здоровое решение, но нужно
Саша Z
сообщение May 5 2008, 13:00
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Пытаюсь удвоить клок задержками логики:
задержать клок на входе на четверть периода, затем подать входной и задержанный на 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 ?)
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 19)
MrYuran
сообщение May 5 2008, 13:46
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sazh
сообщение May 5 2008, 14:16
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Саша Z @ May 5 2008, 17:00) *
Пытаюсь удвоить клок задержками логики:
Подскажите, в чем лажа ? (или может кто предложит более нормальное решение удвоения клока без PLLей при сохранении 40-60% duty cycle ?)


В Квартусе работает. ваши атрибуты задействовали примитив lcell, задержка на логических ячейках.
Вот только меандр так Вы с большим трудом получите. И ресурсов может не хватить.
На циклоне длительность импульса на двух lcell составила 1.5нс
Можно сделать задерку за счет прохождения сигнала через контакты ввода вывода. Если есть резервные пины. Но с меандром наверно точно также будет напряженка.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 5 2008, 14:25
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(MrYuran @ May 5 2008, 16:46) *
возможно оптимизатор выкидывает ваши задержки, так же, как компилятор оптимизирует пустые циклы и паузы на нопах


Да, оптимизатор в синтезе действительно будет выкидывать задержки, именно поэтому вставил атрибуты синтезатора (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...не пойму почему....
Go to the top of the page
 
+Quote Post
sazh
сообщение May 5 2008, 14:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Поставьте внешний генератор и не партесь.
Даже на эдементах средней степени интеграции от такого умножителя были одни неприятности.
Солнышко пригреет и все в разнос идет. неужели в кристалле pll нет
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 5 2008, 15:15
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(sazh @ May 5 2008, 17:47) *
Поставьте внешний генератор и не партесь.
Даже на эдементах средней степени интеграции от такого умножителя были одни неприятности.
Солнышко пригреет и все в разнос идет. неужели в кристалле pll нет


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

Внешний генератор ? Проблема в том что борд-то уже готов, частично работает, борд очень плотный, сложная разводка и т.д. и т.п. Кроме того, если делать внешним генератором то он должен быть закрыт на фазу исходного клока (т.е. внешний PLL ?) ибо он клок данных и видео синхронизации.
Да и скорее всего к нему физически не подобраться (к сигналу) ибо источник (CPU) и приемник (CPLD) - оба BGA и расположены на плане один над другим (component side - print side), на самом сигнале - никакого резистора, он проходит от донго чипа к другому под ними....
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение May 5 2008, 16:24
Сообщение #7


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



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

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

И имейте ввиду, что и у логики и у триггеров задержки в кристале не всегда максимальные.
Вдобавок вы можете положить элементы задержки в разные концы кристала (дял FPGA) - тогда в задержку включиться еще и разводочный ресурс ;-))
Go to the top of the page
 
+Quote Post
chds
сообщение May 5 2008, 16:53
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 5-11-07
Из: Чернигов, Украина
Пользователь №: 32 078



2 Саша Z
Если Вы делаете проект, который должен работать в реальных условиях, а не для того, что бы сдать лабу вредному преподу, лучше послушать советы людей и не городить задержку на залоченных элементах. По крайней мере так, как вы написали, ваш умножитель может работать только несколько сборок проекта подряд, а на какой нибудь сборке имплементатор поменяет прохождение трассы и все задержки поехали. Если хочется всетаки ломиться в закрытые двери, то нужно прописать констрейны на каждый элемент, расположив их по разным сторонам FPGA и надеяться на то, что летом не будет сильно жарко, а зимой сильно холодно.
Как тут дела обстоят у латиса (вроде эту МС вы используете), а у ксилинкса через FPGA Editor найти все элементы нужной цени, узнать их физические имена и прописать в ucf файле жесткий лок на элемент программируемого массива ПЛИС
Go to the top of the page
 
+Quote Post
atlantic
сообщение May 5 2008, 17:06
Сообщение #9


участник
****

Группа: Свой
Сообщений: 573
Регистрация: 16-02-06
Пользователь №: 14 402



Цитата(Саша Z @ May 5 2008, 18:15) *
Да, вы правы, факторы типа температуры могут вполне повлиять... cranky.gif .
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.
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение May 5 2008, 17:07
Сообщение #10


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



С chds полностью согласел, встречался даже, что в Xilinx XPLA3 проект перестал работать из-за другой партии ПЛИС.
Сделал я не очень корректное место (в блочке по переводу события с одного clk на другой). Вот пришли ПЛИС 2007 года выпуска и проект (уже готовая прошивка) перестал работать, а на ПЛИС до 2007 года все работает прекрасно. Заметьте: ревизии ПЛИС совпадают, различаются только даты производства и партии.
Go to the top of the page
 
+Quote Post
Andr2I
сообщение May 5 2008, 17:08
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379



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

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 можно подправить форму сигнала.
Go to the top of the page
 
+Quote Post
chds
сообщение May 5 2008, 17:35
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 5-11-07
Из: Чернигов, Украина
Пользователь №: 32 078



Вот что нарылось, взял ОТСЮДА:
Цитата
# Как удвоить тактовый сигнал? Если на кристалле нет 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 периоде плевое дело smile.gif
Go to the top of the page
 
+Quote Post
Джеймс
сообщение May 5 2008, 18:47
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 20-01-06
Пользователь №: 13 399



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

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

Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 5 2008, 19:56
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



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

chds: да, это реальный проэкт на работе. Достался "по наследству" (тяжелое наследие), разрабатывался фирмой - подрядчиком года 2 тому, теперь дисплеы который там дарйвиться перестал выпускаться, а новая версия теерь требует значительно более высокой частоты, соответственно и логика ее драйвящая должна работать ан соотв. частотах...
Железо уже давно готово, работает (со старым дисплеем), менять чип (CPLD/FPGA) - не вариант в данной версии системы. В новой версии ессно будем менять возможно и concept, да и у Латтица тоже предостаточно нормальных чипов..
Переходник на плату то-же мало-реально, уже думали насчет этого. Физически проблематично да и нет столько времени на все это.
Насчет "не извращяться" - это верно, посему и в начале и думали в сторону PLLя чтоб держать фазу. А умножая клок с постоянной задержкой - фаза сохранялась-бы (с определенной постоянной задержкой), но опять-же ежели исключить влияния среды, работать с одной и той-же серией CPLD и т.д. и т.п.
Не понял что вы имели ввиду насчет англо-язычной литературы...
Ессно что у XORа 2 входа, и я так именно и пытаюсь делать - сделать задержку на четверть периода и ее пдоать вместе с оригинальным клоком на вход XORa. Тут и так все понятно.
А задержать на 1/4 периода пытаюсь несколькими инверторами или andами с постоянной '1' по одному входу.

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

А вообще я не могу не согласиться с общим мнением о проблематичности такого подхода, но как говориться: last resort...
В целом проверяю takve опцию добавить внешний PLL чип и запустить его в CPLD...
Go to the top of the page
 
+Quote Post
alexadmin
сообщение May 6 2008, 08:56
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 572
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Цитата(Саша Z @ May 5 2008, 23:56) *
Спасибо всем.
Теперь по порядку:
Boris_TS: работаю с Латтисом (ISPLever), чип о котором идет речь: семейство MachXO 2280C.


Когда-то читал статью, как у Virtex можно извлечь встроенный configuration clock на пользовательский уровень и работать от него. За давностью лет подробностей не помню. Может быть и в вашем случае попробовать посмотреть в эту сторону?
Go to the top of the page
 
+Quote Post
r_dot
сообщение May 7 2008, 15:44
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 237
Регистрация: 14-08-07
Из: Москва
Пользователь №: 29 791



Цитата(Саша Z @ May 5 2008, 23:56) *
... теперь дисплей, который там дарйвиться перестал выпускаться, а новая версия теерь требует значительно более высокой частоты, соответственно и логика ее драйвящая должна работать ан соотв. частотах...


Ещё вариант - добавить переходную плату на ПЛИС между устройством и дисплеем, осуществляющую преобразование старого интерфейса дисплея в новый. Преимущества - не нужно трогать отлаженый девайс, не будет сомнительных по надёжности схемных решений и можно будет опять модифицировать схему, когда и новый дисплей перестанет выпускаться.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 8 2008, 15:00
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(r_dot @ May 7 2008, 19:44) *
Ещё вариант - добавить переходную плату на ПЛИС между устройством и дисплеем, осуществляющую преобразование старого интерфейса дисплея в новый. Преимущества - не нужно трогать отлаженый девайс, не будет сомнительных по надёжности схемных решений и можно будет опять модифицировать схему, когда и новый дисплей перестанет выпускаться.


Данный вариант уже рассматривался нами в самом начале ...увы не реален в плане реализации - механика борта не позволяет, да и piggyback на борту не реален ввиду проблематичности к механическим нагрузкам устройства.
Выяснилось что первый вариант дисплея, т.е. тот под который рабоатем на данный моемтн - был pre-engineering samples и не пошел в серию. Новый вариант - уже серийная модель которая в full production производителем и значит ОК для конкретной версии нашего устрочства. Далее, все равно планируется новая версия устройства где будет возможно если не самый полный то весьма существенный re-design той части котора в частности и драйвит дисплей. А это значит что тогда и проверим будущность этих дисплеев, ежели будет продозрение на то что они уходят (либо не удовлетворят нас по качеству/надежности) - будем заранее проэктировать новую вресию под другие дисплеи.

А пока у меня кажется уже вырисовывается более реальное решение проблемы - нашел простые чипы PLLя с фиксированным коефф. умножения, очень простая обвязка извне (питание, земля, и пару ног закорочены между собой). У борта есть выход другого клока наружу - кратного исходному. Выведу его наружу на PLL который закрепим не борту, выход PLLя заведу на свободную ногу CPLD (пусть и не глобальный клок, но все-таки), тогда изменения в его коде нужно будет только в плане изменения ноги нужного клока.
Думаю должно спасти положение.
Go to the top of the page
 
+Quote Post
r_dot
сообщение May 10 2008, 04:10
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 237
Регистрация: 14-08-07
Из: Москва
Пользователь №: 29 791



Цитата(Саша Z @ May 8 2008, 19:00) *
... нашел простые чипы PLLя с фиксированным коефф. умножения, очень простая обвязка извне (питание, земля, и пару ног закорочены между собой). ...


Да, нормальное решение, если доработочку аккуратно сделать.
Наверное, и сам знаешь, но на всякий случай напомню, чтобы за переделкой проекта не забылось: около этих чипов обязательно по питанию ставить емкость и максимально коротко соединять с "землёй", чтобы не "хлопали" такт пачками.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 10 2008, 15:46
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(r_dot @ May 10 2008, 08:10) *
Да, нормальное решение, если доработочку аккуратно сделать.
Наверное, и сам знаешь, но на всякий случай напомню, чтобы за переделкой проекта не забылось: около этих чипов обязательно по питанию ставить емкость и максимально коротко соединять с "землёй", чтобы не "хлопали" такт пачками.


Да, спасибо за напоминание, но это я в курсе, давно пройденный этап... smile.gif
но за напоминание - спасибо.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение May 31 2008, 18:11
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(Саша Z @ May 8 2008, 18:00) *
Данный вариант уже рассматривался нами в самом начале ...увы не реален в плане реализации - механика борта не позволяет, да и piggyback на борту не реален ввиду проблематичности к механическим нагрузкам устройства.
Выяснилось что первый вариант дисплея, т.е. тот под который рабоатем на данный моемтн - был pre-engineering samples и не пошел в серию. Новый вариант - уже серийная модель которая в full production производителем и значит ОК для конкретной версии нашего устрочства. Далее, все равно планируется новая версия устройства где будет возможно если не самый полный то весьма существенный re-design той части котора в частности и драйвит дисплей. А это значит что тогда и проверим будущность этих дисплеев, ежели будет продозрение на то что они уходят (либо не удовлетворят нас по качеству/надежности) - будем заранее проэктировать новую вресию под другие дисплеи.

А пока у меня кажется уже вырисовывается более реальное решение проблемы - нашел простые чипы PLLя с фиксированным коефф. умножения, очень простая обвязка извне (питание, земля, и пару ног закорочены между собой). У борта есть выход другого клока наружу - кратного исходному. Выведу его наружу на PLL который закрепим не борту, выход PLLя заведу на свободную ногу CPLD (пусть и не глобальный клок, но все-таки), тогда изменения в его коде нужно будет только в плане изменения ноги нужного клока.
Думаю должно спасти положение.


Реализовал решение с внешним PLL - все работает как положени и дешево, хотя немного усложнилась механ. часть (интеграция mini-piggyback с PLLем на плату системы).
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 11:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01588 секунд с 7
ELECTRONIX ©2004-2016