zxazx 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба Первый вариант: использую такие выходы DCMа: CLKDV_OUT CLK0_OUT прога работает Первый вариант: использую такие выходы DCMа: CLKDV_OUT CLK0_OUT CLKFX_OUT входная частота 20МГц, коеффициенты D=M=2(для начала, чтобы схема работала на той же частоте, что и в первом варианте) в результате в железе прога не работает, такое впечатление, что DCM не выдаёт клоки CLK0 и CLKFX, причём клок CLKDV присутствует В чём может быть проблемы? что за сигнгал CLKIN_IBUFG_OUT я его не использую Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
o-henry 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба входная частота 20МГц, IMHO проблема в этом. Если мне не изменяет склероз, мин. вх. частота у Spartan3 =25 МГц Посмотрите в даташите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zxazx 0 16 июня, 2006 Опубликовано 16 июня, 2006 · Жалоба как указать синтезатору сигналы, которые должны быть выведены на глобальные линии синхронизации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zxazx 0 16 июня, 2006 Опубликовано 16 июня, 2006 (изменено) · Жалоба проблему нашел, но пока что-то не пойму как победить constant toggle_clk_uart : integer := 10; ...................... process (clk20) begin if rising_edge(clk20) then count_clk_uart<=count_clk_uart+1; if count_clk_uart=(toggle_clk_uart) then count_clk_uart<=(others=> '0'); clkFORuart<= not clkFORuart; end if; end if; end process; условие if count_clk_uart=(toggle_clk_uart) then выполняется, если НЕ использую CLKFX(CLKFX=> open) если CLKFX подвожу к процессу, который никак не связан с сигналами clk20, clkFORuart и count_clk_uart, то условие if count_clk_uart=(toggle_clk_uart) then не выполняется, хотя на сигнале clk20 есть клок, count_clk_uart изменяется Сказанное относится к железу, в симуляторе всё корректно работает Изменено 16 июня, 2006 пользователем _zx_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 18 июня, 2006 Опубликовано 18 июня, 2006 · Жалоба как указать синтезатору сигналы, которые должны быть выведены на глобальные линии синхронизации? XST например сам это знает. Еще можно указать ему это косвенно, руками вставив BUFG (или иной элемент), такой, что синтезатор наперед знает, что его надо подключить к глобальной линии. По умолчанию каждый сигнал, поступающий на тактовый вход триггера, будет рассатриваться как глобальный (пока хватает глобальных линий). Если не хватило - начинаются большие проблемы. проблему нашел, но пока что-то не пойму как победить constant toggle_clk_uart : integer := 10; ...................... process (clk20) begin if rising_edge(clk20) then count_clk_uart<=count_clk_uart+1; if count_clk_uart=(toggle_clk_uart) then count_clk_uart<=(others=> '0'); clkFORuart<= not clkFORuart; end if; end if; end process; условие if count_clk_uart=(toggle_clk_uart) then выполняется, если НЕ использую CLKFX(CLKFX=> open) если CLKFX подвожу к процессу, который никак не связан с сигналами clk20, clkFORuart и count_clk_uart, то условие if count_clk_uart=(toggle_clk_uart) then не выполняется, хотя на сигнале clk20 есть клок, count_clk_uart изменяется Сказанное относится к железу, в симуляторе всё корректно работает Мне кажется, у вас тут логическая ошибка. Вы по одному и тому же фронту клока одновременно хотите 1) Инкрементировать счетчик 2) Сравнить его с константой (забывая, что счетчик все еще МЕНЯЕТСЯ) 3) Обнулить счетчик. Не многого ли вы хотите от бедного счетчика за один фронт? Симулятор, он глупый. А в железе такое не катит. В чем вы и убедились. Перепишите ваш процесс таким образом, чтобы по фронту клока 1) анализировалось, равен ли счетчик константе. 2) если ДА, то загрузить нули 3) если НЕТ, то инкремент. Такое должно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zxazx 0 19 июня, 2006 Опубликовано 19 июня, 2006 · Жалоба XST например сам это знает. Еще можно указать ему это косвенно, руками вставив BUFG (или иной элемент), такой, что синтезатор наперед знает, что его надо подключить к глобальной линии. В том и вопрос- Как вставить "BUFG (или иной элемент)" Мне кажется, у вас тут логическая ошибка. Вы по одному и тому же фронту клока одновременно хотите 1) Инкрементировать счетчик 2) Сравнить его с константой (забывая, что счетчик все еще МЕНЯЕТСЯ) 3) Обнулить счетчик. Не многого ли вы хотите от бедного счетчика за один фронт? Симулятор, он глупый. А в железе такое не катит. В чем вы и убедились. Перепишите ваш процесс таким образом, чтобы по фронту клока 1) анализировалось, равен ли счетчик константе. 2) если ДА, то загрузить нули 3) если НЕТ, то инкремент. Такое должно работать. Если я правильно понимаю работу оператора process, то фрагмент кода должен работать так: 1) планируется инкрементировать счётчик 2) сравнивается значение счётчика с константой и по условию планируется обнулить счётчик 3) по окончанию последовательных команд в оператре process значение счётчика обновляется А в железе работает, если не использовать сигнал CLKFX_OUT для других процессов, или если приведённый процесс тактировать от CLKFX_OUT - вот это не понятно, ведь логика работы процесса не изменяется от того, какие у меня в схеме тактовые сигналы!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 19 июня, 2006 Опубликовано 19 июня, 2006 · Жалоба XST например сам это знает. Еще можно указать ему это косвенно, руками вставив BUFG (или иной элемент), такой, что синтезатор наперед знает, что его надо подключить к глобальной линии. В том и вопрос- Как вставить "BUFG (или иной элемент)" Мне кажется, у вас тут логическая ошибка. Вы по одному и тому же фронту клока одновременно хотите 1) Инкрементировать счетчик 2) Сравнить его с константой (забывая, что счетчик все еще МЕНЯЕТСЯ) 3) Обнулить счетчик. Не многого ли вы хотите от бедного счетчика за один фронт? Симулятор, он глупый. А в железе такое не катит. В чем вы и убедились. Перепишите ваш процесс таким образом, чтобы по фронту клока 1) анализировалось, равен ли счетчик константе. 2) если ДА, то загрузить нули 3) если НЕТ, то инкремент. Такое должно работать. Если я правильно понимаю работу оператора process, то фрагмент кода должен работать так: 1) планируется инкрементировать счётчик 2) сравнивается значение счётчика с константой и по условию планируется обнулить счётчик 3) по окончанию последовательных команд в оператре process значение счётчика обновляется А в железе работает, если не использовать сигнал CLKFX_OUT для других процессов, или если приведённый процесс тактировать от CLKFX_OUT - вот это не понятно, ведь логика работы процесса не изменяется от того, какие у меня в схеме тактовые сигналы!!! Вот вам для изучения пример процесса из живого изделия. process (clk) begin if (clk 'event and clk = '1') then if (load = '1') then count <= "000111" after 1 ns; elsif (count="000000")then count <= "000000" after 1 ns; else count <= count - 1 after 1 ns; end if; end if; end process; Обратите внимание, здесь не заставляют счетчик делать три операции за раз. РАБОТАЮТ триггеры, а не мифические процессы. Это надо ОЧЕНЬ ясно представлять себе. Процесс - всего лишь способ описания триггера или комбинационной схемы таким образом, чтобы синтезатор долго не думал, а вставил то, что хотел разработчик - если, конечно, тот сам знает, что делает. Как это - "как вставить BUFG" ? Домой! К младенцам, нянькам, тряпкам! (с) Кутузов. В архитектуре после объявления сигналов пишем: component BUFG port ( I : in std_logic; O : out std_logic); end component; а потом после Begin: CLK0_BUFG_INST : BUFG port map (I=>CLK0_BUF, O=>CLKFB_IN); Совет дня: не вступайте в схоластические споры о процессах, если не знаете, как вставить компонент. Удачи. Она вам понадобится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 июня, 2006 Опубликовано 19 июня, 2006 (изменено) · Жалоба Совет дня: не вступайте в схоластические споры о процессах, если не знаете, как вставить компонент. Удачи. Она вам понадобится. Жестко, но по теме:)... Кстати,… к нянькам, тряпкам… то кажется не Кутузов, а так разыгранный образ, но не суть. Указываю на ошибку, которую человек сам описал, но не проанализировал. допустим счетчик равен 3 и константа по которой он обнуляется тоже 3 далее как вы сами пишите --1) планируется инкрементировать счётчик то есть счетчик должен стать из трех четырьмя по выходу из процесса, но пока счетчик 3 --2) сравнивается значение счётчика с константой и по условию планируется обнулить счётчик три равно трем, то есть счетчик планируется обнуляться, и из 3 должен стать нулем по выходу из процесса. внимание вопрос, чему должен стать равен счетчик по выходу из процесса? Ведь в начале было запланировано что 0, а в конце что 4? в пользу какого числа должна сделать выбор железяка? Не знаете? Так вот и компилятор ваш не знает, о чем вам и сообщает! эту коллизию вам справедливо и предлагает решить Горби, и он тут как всегда абсолютно прав:)... вы же знаете что хотели, и чему хотели чтобы был равен счетчик решение простое если счетчик равен константе, то нулить, а если нет, то увеличивать. тогда все однозначно, если равен будет запланировано обнулить, и на иначе программа не посмотрит, а если не равен, то будет запланировано увеличить, и третьего не дано, и коллизий не будет.. хорошее слово коллизия... мда... ну и успехов вам:) Изменено 19 июня, 2006 пользователем Golikov A. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 июня, 2006 Опубликовано 20 июня, 2006 · Жалоба ээээ народ, что вы парня замутили ? какой не правильный процесс ?? вы что ? все у него нормально написанно, кривовато конечно, но не не правильно. почему у человека не работает нужно разбираться, но именно в этом процессе косяков с синтезом нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 20 июня, 2006 Опубликовано 20 июня, 2006 (изменено) · Жалоба ээээ народ, что вы парня замутили ? какой не правильный процесс ?? вы что ? все у него нормально написанно, кривовато конечно, но не не правильно. почему у человека не работает нужно разбираться, но именно в этом процессе косяков с синтезом нет. ну процесс кривоват, не знаю как там синтезатор разрулил ситуацию, но допустим... я еще посмею предположить, что при настройке ДКМ вы отказались от буферов на входе и выходе клоковых сигналов. Или не выжидаете необходимое время, за которое ДКМ выходит на рабочий режим, не используете управляющие и статусные ножки ДКМ, может быть такое? Может нестабильность клока выдаваемого ДКМом все и портит, потому что не может процесс на одном клоковом сигнале работать, а на другом нет... Хотя! может и это может быть в том случае если не хватает время на установку сигнала перед фронтами клока, это может ввести нестабильность и непонятность в работу схемы, может стоит вывести клок и сигналы счетчика наружу и потыкать осциллографом? или правильно использовать все управляющие ноги? CLKIN_IBUFG_OUT - это входной клок на буфер и с него на ружу, внутри ДКМ он используеться как главный клок, это для синхрона ДКМ и внешних схем. кстати а вы могли просто не включить ножки клоков, например CLKFX_OUT, или поставили что опорный клок внешний и не завели его? Изменено 20 июня, 2006 пользователем Golikov A. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 20 июня, 2006 Опубликовано 20 июня, 2006 · Жалоба ээээ народ, что вы парня замутили ? какой не правильный процесс ?? вы что ? все у него нормально написанно, кривовато конечно, но не не правильно. почему у человека не работает нужно разбираться, но именно в этом процессе косяков с синтезом нет. Поэтому и пишу "Мне кажется, у вас тут логическая ошибка", а не семь лет расстрела за такой процесс :) Кривовато, вы правы. А вот как на эту кривизну синтезатор посмотрит - неизвестно. И даже если съест, то непонятно, что синтезирует. А ситуация мутная, сам автор описывает. То работает, то не работает. КОнечно, причина может быть и вовсе не в этом процессе. А например в другом, так же криво написанном. Я бы посоветовал автору топика сгенерировать все нужные ему клоки и вывести их наружу для контроля, но не непосредственно, а в качестве тактовых входов счетных триггеров, выход которых вывести на пины. Тогда не придется гадать, пропал клок или нет. Да и осциллографом фазу можно будет сравнить. А то случаи разные бывают. Неплохо также вывести наружу сигнал LOCKED от DCM. Иногда очень помогает. Вдруг окажется, что DCM хаотически не LOCKED? Тогда все объясняется. Тут и у самого правильного процесса крышу сорвет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladz 0 20 июня, 2006 Опубликовано 20 июня, 2006 · Жалоба Я бы посоветовал автору топика сгенерировать все нужные ему клоки и вывести их наружу для контроля, но не непосредственно, а в качестве тактовых входов счетных триггеров, выход которых вывести на пины. Тогда не придется гадать, пропал клок или нет. Да и осциллографом фазу можно будет сравнить. А то случаи разные бывают. Не пойму, почему надо тактовый сигнал через триггера на внешние пины выводить, если можно в FPGA editor вевести их сразу от DCM наружу без перекомпиляции проекта? Да и еще он задержку от DCM до самого пина покажет. Проблема, конечно, описана мутно, но уж больно мне кажется что синтезатор просто выкидывает уже работаюшую часть схемы после того как _zx_ подает клок на другую часть схемы, вроде бы не связанную с первой. В общем, надо ворнинги почитать (они есть?) и RTL посмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 20 июня, 2006 Опубликовано 20 июня, 2006 · Жалоба Я бы посоветовал автору топика сгенерировать все нужные ему клоки и вывести их наружу для контроля, но не непосредственно, а в качестве тактовых входов счетных триггеров, выход которых вывести на пины. Тогда не придется гадать, пропал клок или нет. Да и осциллографом фазу можно будет сравнить. А то случаи разные бывают. Не пойму, почему надо тактовый сигнал через триггера на внешние пины выводить, если можно в FPGA editor вевести их сразу от DCM наружу без перекомпиляции проекта? Да и еще он задержку от DCM до самого пина покажет. Проблема, конечно, описана мутно, но уж больно мне кажется что синтезатор просто выкидывает уже работаюшую часть схемы после того как _zx_ подает клок на другую часть схемы, вроде бы не связанную с первой. В общем, надо ворнинги почитать (они есть?) и RTL посмотреть. Ну, лично я предпочитаю руками в потроха не лазить. Разве что очень припечет. А вообще, почему бы и нет? Речь шла о том, чтобы вывести наружу подозрительные клоки на просмотр. А уж как именно - тут хозяин - барин. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladz 0 20 июня, 2006 Опубликовано 20 июня, 2006 · Жалоба Ну, лично я предпочитаю руками в потроха не лазить. Разве что очень припечет. А вообще, почему бы и нет? Речь шла о том, чтобы вывести наружу подозрительные клоки на просмотр. А уж как именно - тут хозяин - барин. Ну почему же сразу 'руками'? Этот инструмент (probes) как раз позволяет не вмешиваясь в сушествующую разводку вевести сигналы наружу. А то вдруг после добавления триггера и переразводки баг изчезнет? Где его потом искать? :( А в общем согласен, универсальных рецептов нет, да и хозяин - барин. Что-то от него вестей нет, может, нашел уже хомут, а мы тут все гадаем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 20 июня, 2006 Опубликовано 20 июня, 2006 · Жалоба А вот как на эту кривизну синтезатор посмотрит - неизвестно. И даже если съест, то непонятно, что синтезирует. В том то и дело что в ВХДЛ сие поведение строго детерминированно :) и всегда собираеться как надо. Я очень часто пользуюсь подобным приемом, но НЕ в случае счетчиков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться