AlexZabr 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Пытаюсь удвоить клок задержками логики: задержать клок на входе на четверть периода, затем подать входной и задержанный на 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 ?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 23 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба возможно оптимизатор выкидывает ваши задержки, так же, как компилятор оптимизирует пустые циклы и паузы на нопах Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Пытаюсь удвоить клок задержками логики: Подскажите, в чем лажа ? (или может кто предложит более нормальное решение удвоения клока без PLLей при сохранении 40-60% duty cycle ?) В Квартусе работает. ваши атрибуты задействовали примитив lcell, задержка на логических ячейках. Вот только меандр так Вы с большим трудом получите. И ресурсов может не хватить. На циклоне длительность импульса на двух lcell составила 1.5нс Можно сделать задерку за счет прохождения сигнала через контакты ввода вывода. Если есть резервные пины. Но с меандром наверно точно также будет напряженка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба возможно оптимизатор выкидывает ваши задержки, так же, как компилятор оптимизирует пустые циклы и паузы на нопах Да, оптимизатор в синтезе действительно будет выкидывать задержки, именно поэтому вставил атрибуты синтезатора (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...не пойму почему.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Поставьте внешний генератор и не партесь. Даже на эдементах средней степени интеграции от такого умножителя были одни неприятности. Солнышко пригреет и все в разнос идет. неужели в кристалле pll нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Поставьте внешний генератор и не партесь. Даже на эдементах средней степени интеграции от такого умножителя были одни неприятности. Солнышко пригреет и все в разнос идет. неужели в кристалле pll нет Да, вы правы, факторы типа температуры могут вполне повлиять... :cranky: . PLL в чипе есть, но он начинате работать с 25MHz а у меня 13 MHz клок. Внешний генератор ? Проблема в том что борд-то уже готов, частично работает, борд очень плотный, сложная разводка и т.д. и т.п. Кроме того, если делать внешним генератором то он должен быть закрыт на фазу исходного клока (т.е. внешний PLL ?) ибо он клок данных и видео синхронизации. Да и скорее всего к нему физически не подобраться (к сигналу) ибо источник (CPU) и приемник (CPLD) - оба BGA и расположены на плане один над другим (component side - print side), на самом сигнале - никакого резистора, он проходит от донго чипа к другому под ними.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Есть еще один вариант задержки, он для системы оптимизаторов менее "прозрачный" - делать задержки на latch с G = '1', только прийдется навесить пачку constraints на этот сигнал G, чтобы система его не выкинула (вместе с latch) - термины/входы по среде Xilinx. Что-то у Вас я не нашел ни ссылку на среды разработки ни на использованный ПЛИС - без этого затруднительно что-то советывать... И имейте ввиду, что и у логики и у триггеров задержки в кристале не всегда максимальные. Вдобавок вы можете положить элементы задержки в разные концы кристала (дял FPGA) - тогда в задержку включиться еще и разводочный ресурс ;-)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chds 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба 2 Саша Z Если Вы делаете проект, который должен работать в реальных условиях, а не для того, что бы сдать лабу вредному преподу, лучше послушать советы людей и не городить задержку на залоченных элементах. По крайней мере так, как вы написали, ваш умножитель может работать только несколько сборок проекта подряд, а на какой нибудь сборке имплементатор поменяет прохождение трассы и все задержки поехали. Если хочется всетаки ломиться в закрытые двери, то нужно прописать констрейны на каждый элемент, расположив их по разным сторонам FPGA и надеяться на то, что летом не будет сильно жарко, а зимой сильно холодно. Как тут дела обстоят у латиса (вроде эту МС вы используете), а у ксилинкса через FPGA Editor найти все элементы нужной цени, узнать их физические имена и прописать в ucf файле жесткий лок на элемент программируемого массива ПЛИС Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
atlantic 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Да, вы правы, факторы типа температуры могут вполне повлиять... :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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба С chds полностью согласел, встречался даже, что в Xilinx XPLA3 проект перестал работать из-за другой партии ПЛИС. Сделал я не очень корректное место (в блочке по переводу события с одного clk на другой). Вот пришли ПЛИС 2007 года выпуска и проект (уже готовая прошивка) перестал работать, а на ПЛИС до 2007 года все работает прекрасно. Заметьте: ревизии ПЛИС совпадают, различаются только даты производства и партии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andr2I 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба В принципе, делал такое на 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 можно подправить форму сигнала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chds 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Вот что нарылось, взял ОТСЮДА: # Как удвоить тактовый сигнал? Если на кристалле нет 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 периоде плевое дело :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 4 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Вот вариант сотрудника Xilinx (Peter Alfke). См. #4 по ссылке. http://www.pldworld.com/_xilinx/html/tip/sixeasypieces.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 мая, 2008 Опубликовано 5 мая, 2008 · Жалоба Спасибо всем. Теперь по порядку: Boris_TS: работаю с Латтисом (ISPLever), чип о котором идет речь: семейство MachXO 2280C. chds: да, это реальный проэкт на работе. Достался "по наследству" (тяжелое наследие), разрабатывался фирмой - подрядчиком года 2 тому, теперь дисплеы который там дарйвиться перестал выпускаться, а новая версия теерь требует значительно более высокой частоты, соответственно и логика ее драйвящая должна работать ан соотв. частотах... Железо уже давно готово, работает (со старым дисплеем), менять чип (CPLD/FPGA) - не вариант в данной версии системы. В новой версии ессно будем менять возможно и concept, да и у Латтица тоже предостаточно нормальных чипов.. Переходник на плату то-же мало-реально, уже думали насчет этого. Физически проблематично да и нет столько времени на все это. Насчет "не извращяться" - это верно, посему и в начале и думали в сторону PLLя чтоб держать фазу. А умножая клок с постоянной задержкой - фаза сохранялась-бы (с определенной постоянной задержкой), но опять-же ежели исключить влияния среды, работать с одной и той-же серией CPLD и т.д. и т.п. Не понял что вы имели ввиду насчет англо-язычной литературы... Ессно что у XORа 2 входа, и я так именно и пытаюсь делать - сделать задержку на четверть периода и ее пдоать вместе с оригинальным клоком на вход XORa. Тут и так все понятно. А задержать на 1/4 периода пытаюсь несколькими инверторами или andами с постоянной '1' по одному входу. Джеймс: спасибо, попробую... А вообще я не могу не согласиться с общим мнением о проблематичности такого подхода, но как говориться: last resort... В целом проверяю takve опцию добавить внешний PLL чип и запустить его в CPLD... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 6 мая, 2008 Опубликовано 6 мая, 2008 · Жалоба Спасибо всем. Теперь по порядку: Boris_TS: работаю с Латтисом (ISPLever), чип о котором идет речь: семейство MachXO 2280C. Когда-то читал статью, как у Virtex можно извлечь встроенный configuration clock на пользовательский уровень и работать от него. За давностью лет подробностей не помню. Может быть и в вашем случае попробовать посмотреть в эту сторону? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться