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

Первый вариант:

использую такие выходы DCMа:

CLKDV_OUT

CLK0_OUT

прога работает

 

Первый вариант:

использую такие выходы DCMа:

CLKDV_OUT

CLK0_OUT

 

CLKFX_OUT

входная частота 20МГц, коеффициенты D=M=2(для начала, чтобы схема работала на той же частоте, что и в первом варианте)

 

в результате в железе прога не работает, такое впечатление, что DCM не выдаёт клоки CLK0 и CLKFX,

причём клок CLKDV присутствует

 

В чём может быть проблемы? что за сигнгал CLKIN_IBUFG_OUT я его не использую

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


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

входная частота 20МГц,

 

IMHO проблема в этом.

Если мне не изменяет склероз, мин. вх. частота у Spartan3 =25 МГц

Посмотрите в даташите.

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


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

как указать синтезатору сигналы, которые должны быть выведены на глобальные линии синхронизации?

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


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

проблему нашел, но пока что-то не пойму как победить

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 изменяется

 

Сказанное относится к железу, в симуляторе всё корректно работает

Изменено пользователем _zx_

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


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

как указать синтезатору сигналы, которые должны быть выведены на глобальные линии синхронизации?

 

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) если НЕТ, то инкремент.

 

Такое должно работать.

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


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

XST например сам это знает. Еще можно указать ему это косвенно, руками вставив BUFG (или иной элемент), такой, что синтезатор наперед знает, что его надо подключить к глобальной линии.

 

В том и вопрос- Как вставить "BUFG (или иной элемент)"

 

Мне кажется, у вас тут логическая ошибка. Вы по одному и тому же фронту клока одновременно хотите 1) Инкрементировать счетчик 2) Сравнить его с константой (забывая, что счетчик все еще МЕНЯЕТСЯ) 3) Обнулить счетчик.

 

Не многого ли вы хотите от бедного счетчика за один фронт?

 

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

 

Перепишите ваш процесс таким образом, чтобы по фронту клока

1) анализировалось, равен ли счетчик константе.

 

2) если ДА, то загрузить нули

 

3) если НЕТ, то инкремент.

 

Такое должно работать.

 

Если я правильно понимаю работу оператора process, то фрагмент кода должен работать так:

1) планируется инкрементировать счётчик

2) сравнивается значение счётчика с константой и по условию планируется обнулить счётчик

3) по окончанию последовательных команд в оператре process значение счётчика обновляется

 

А в железе работает, если не использовать сигнал CLKFX_OUT для других процессов, или если приведённый процесс тактировать от CLKFX_OUT - вот это не понятно, ведь логика работы процесса не изменяется от того, какие у меня в схеме тактовые сигналы!!!

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


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

 

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);

 

 

 

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

Удачи. Она вам понадобится.

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


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

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

Удачи. Она вам понадобится.

 

 

Жестко, но по теме:)... Кстати,… к нянькам, тряпкам… то кажется не Кутузов, а так разыгранный образ, но не суть.

 

Указываю на ошибку, которую человек сам описал, но не проанализировал.

 

допустим счетчик равен 3 и константа по которой он обнуляется тоже 3

 

далее как вы сами пишите

--1) планируется инкрементировать счётчик

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

--2) сравнивается значение счётчика с константой и по условию планируется обнулить счётчик

три равно трем, то есть счетчик планируется обнуляться, и из 3 должен стать нулем по выходу из процесса.

 

внимание вопрос, чему должен стать равен счетчик по выходу из процесса? Ведь в начале было запланировано что 0, а в конце что 4?

в пользу какого числа должна сделать выбор железяка? Не знаете? Так вот и компилятор ваш не знает, о чем вам и сообщает!

 

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

 

 

решение простое если счетчик равен константе, то нулить, а если нет, то увеличивать.

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

 

 

хорошее слово коллизия...

 

мда... ну и успехов вам:)

Изменено пользователем Golikov A.

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


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

ээээ народ, что вы парня замутили ? какой не правильный процесс ?? вы что ? все у него нормально написанно, кривовато конечно, но не не правильно.

 

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

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


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

ээээ народ, что вы парня замутили ? какой не правильный процесс ?? вы что ? все у него нормально написанно, кривовато конечно, но не не правильно.

 

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

 

 

ну процесс кривоват, не знаю как там синтезатор разрулил ситуацию, но допустим...

 

я еще посмею предположить, что при настройке ДКМ вы отказались от буферов на входе и выходе клоковых сигналов. Или не выжидаете необходимое время, за которое ДКМ выходит на рабочий режим, не используете управляющие и статусные ножки ДКМ, может быть такое?

 

Может нестабильность клока выдаваемого ДКМом все и портит, потому что не может процесс на одном клоковом сигнале работать, а на другом нет... Хотя! может и это может быть в том случае если не хватает время на установку сигнала перед фронтами клока, это может ввести нестабильность и непонятность в работу схемы, может стоит вывести клок и сигналы счетчика наружу и потыкать осциллографом? или правильно использовать все управляющие ноги?

 

 

CLKIN_IBUFG_OUT - это входной клок на буфер и с него на ружу, внутри ДКМ он используеться как главный клок, это для синхрона ДКМ и внешних схем. кстати а вы могли просто не включить ножки клоков, например CLKFX_OUT, или поставили что опорный клок внешний и не завели его?

Изменено пользователем Golikov A.

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


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

ээээ народ, что вы парня замутили ? какой не правильный процесс ?? вы что ? все у него нормально написанно, кривовато конечно, но не не правильно.

 

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

 

 

Поэтому и пишу "Мне кажется, у вас тут логическая ошибка", а не семь лет расстрела за такой процесс :)

Кривовато, вы правы. А вот как на эту кривизну синтезатор посмотрит - неизвестно. И даже если съест, то непонятно, что синтезирует. А ситуация мутная, сам автор описывает. То работает, то не работает. КОнечно, причина может быть и вовсе не в этом процессе. А например в другом, так же криво написанном.

 

Я бы посоветовал автору топика сгенерировать все нужные ему клоки и вывести их наружу для контроля, но не непосредственно, а в качестве тактовых входов счетных триггеров, выход которых вывести на пины. Тогда не придется гадать, пропал клок или нет. Да и осциллографом фазу можно будет сравнить. А то случаи разные бывают. Неплохо также вывести наружу сигнал LOCKED от DCM. Иногда очень помогает. Вдруг окажется, что DCM хаотически не LOCKED? Тогда все объясняется.

Тут и у самого правильного процесса крышу сорвет.

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


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

Я бы посоветовал автору топика сгенерировать все нужные ему клоки и вывести их наружу для контроля, но не непосредственно, а в качестве тактовых входов счетных триггеров, выход которых вывести на пины. Тогда не придется гадать, пропал клок или нет. Да и осциллографом фазу можно будет сравнить. А то случаи разные бывают.

Не пойму, почему надо тактовый сигнал через триггера на внешние пины выводить, если можно в FPGA editor вевести их сразу от DCM наружу без перекомпиляции проекта? Да и еще он задержку от DCM до самого пина покажет.

Проблема, конечно, описана мутно, но уж больно мне кажется что синтезатор просто выкидывает уже работаюшую часть схемы после того как _zx_ подает клок на другую часть схемы, вроде бы не связанную с первой. В общем, надо ворнинги почитать (они есть?) и RTL посмотреть.

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


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

Я бы посоветовал автору топика сгенерировать все нужные ему клоки и вывести их наружу для контроля, но не непосредственно, а в качестве тактовых входов счетных триггеров, выход которых вывести на пины. Тогда не придется гадать, пропал клок или нет. Да и осциллографом фазу можно будет сравнить. А то случаи разные бывают.

Не пойму, почему надо тактовый сигнал через триггера на внешние пины выводить, если можно в FPGA editor вевести их сразу от DCM наружу без перекомпиляции проекта? Да и еще он задержку от DCM до самого пина покажет.

Проблема, конечно, описана мутно, но уж больно мне кажется что синтезатор просто выкидывает уже работаюшую часть схемы после того как _zx_ подает клок на другую часть схемы, вроде бы не связанную с первой. В общем, надо ворнинги почитать (они есть?) и RTL посмотреть.

 

 

Ну, лично я предпочитаю руками в потроха не лазить. Разве что очень припечет. А вообще, почему бы и нет? Речь шла о том, чтобы вывести наружу подозрительные клоки на просмотр. А уж как именно - тут хозяин - барин.

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


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

Ну, лично я предпочитаю руками в потроха не лазить. Разве что очень припечет. А вообще, почему бы и нет? Речь шла о том, чтобы вывести наружу подозрительные клоки на просмотр. А уж как именно - тут хозяин - барин.

 

Ну почему же сразу 'руками'? Этот инструмент (probes) как раз позволяет не вмешиваясь в сушествующую разводку вевести сигналы наружу. А то вдруг после добавления триггера и переразводки баг изчезнет? Где его потом искать? :(

А в общем согласен, универсальных рецептов нет, да и хозяин - барин. Что-то от него вестей нет, может, нашел уже хомут, а мы тут все гадаем?

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


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

А вот как на эту кривизну синтезатор посмотрит - неизвестно. И даже если съест, то непонятно, что синтезирует.

 

В том то и дело что в ВХДЛ сие поведение строго детерминированно :) и всегда собираеться как надо.

Я очень часто пользуюсь подобным приемом, но НЕ в случае счетчиков.

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


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

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

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

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

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

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

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

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

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

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