Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Частотомер
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Sergey Reva
Вот решил вернутся к частотомеру на плис, который когда то хотел сделать.
Все эксперименты проводил на EPF8282ALC84-4, код на VHDL.

Если сигнал sync и input берутся из одного генератора то показания 100% точные, с разных - отличаются на несколько герц, раньше ещё и прыгали довольно в большых пределах, немного переделал теперь в пределах +/-1-2 Гц прыгают.

Кроме того частотомер занял 148 LС, а хотелось бы запихнуть его в чип со 128ю LС.

В общем, подскажите что можно здесь улучшить?

Нажмите для просмотра прикрепленного файла
rv3dll(lex)
Цитата(Sergey Reva @ Nov 8 2007, 02:22) *
Вот решил вернутся к частотомеру на плис, который когда то хотел сделать.
Все эксперименты проводил на EPF8282ALC84-4, код на VHDL.

Если сигнал sync и input берутся из одного генератора то показания 100% точные, с разных - отличаются на несколько герц, раньше ещё и прыгали довольно в большых пределах, немного переделал теперь в пределах +/-1-2 Гц прыгают.

Кроме того частотомер занял 148 LС, а хотелось бы запихнуть его в чип со 128ю LС.

В общем, подскажите что можно здесь улучшить?

Нажмите для просмотра прикрепленного файла


для начала поставить термостат задающего генератора - без него не о какой точности говорить не приходится
sazh
Цитата(Sergey Reva @ Nov 8 2007, 02:22) *
Вот решил вернутся к частотомеру на плис, который когда то хотел сделать.
Все эксперименты проводил на EPF8282ALC84-4, код на VHDL.

Если сигнал sync и input берутся из одного генератора то показания 100% точные, с разных - отличаются на несколько герц, раньше ещё и прыгали довольно в большых пределах, немного переделал теперь в пределах +/-1-2 Гц прыгают.

Кроме того частотомер занял 148 LС, а хотелось бы запихнуть его в чип со 128ю LС.

В общем, подскажите что можно здесь улучшить?

Нажмите для просмотра прикрепленного файла


Наверно если нужен интервал в 1 сек, то отсчет должен быть от 0 до 999999.
У Вас от 0 до 1000000. тогда на динамическую индикацию получается 7 отсчетов. а не 8.
Нет перехода из одного клокового домена в другой.
если все это корректно делать, то потребуется еще больше ресурсов, чем у вас.
Sergey Reva
Спасибо за ответы

Цитата
У Вас от 0 до 1000000. тогда на динамическую индикацию получается 7 отсчетов. а не 8.

Если я правильно понимаю это происходит 1 раз в секунду при сбросе счётчика
Код
....
if sync_div_cnt="11110100001001000111" then        -- :2
    sync_div_cnt<="00000000000000000000";
    gate<='1';
else
....

дискомфорта не создаёт

Цитата
Нет перехода из одного клокового домена в другой.

Вроде недавно и поднималось в одной из тем, но я всё равно не понял... в той теме конкретно было указано какой клок больше другого... а тут частота на входе может быть как больше так и меньше частоты sync... если можете поясните...
sazh
Я не моделировал. Да и описание по мне некорректно. Мне показалось, что gate в нуле 7 тактов, а не 8.
Непонятно как высвечивается один из 8 знаков.
Может надо типа этого?

process(sync)
begin
if rising_edge(sync) then
-- 1MHz/1E6 '11110100001001000000' :1
-- 1MHz/1E6 '11110100001001000111' :2

-- 1MHz/1E3 '00000000001111101000' :1
-- 1MHz/1E3 '00000000001111101111' :2

if sync_div_cnt = x"F423F" then -- :1
gate <= '0';
elsif sync_div_cnt = x"F4247" then -- :2
gate<='1';
end if;

if sync_div_cnt = x"F4247" then -- :2
sync_div_cnt <= ( others => '0');
else
sync_div_cnt <= sync_div_cnt + 1;
end if;

end if;
end process;
Что касется перехода из одного клокового домена в другой.
Может надо интервал длительности в 1 сек простробировать измеряемой частотой, чтобы получить количество отсчетов, кратное этой частоте. тогда это количество отсчетов от периода к периоду будет изменяться на +- 1 отсчет(1герц). ТОгда и управление динамической индикацией от измеряемой частоты, а не от кварцованной 1 мГц.

process(clk,rst)
begin
if rst='1' then
count<="0000";
else if rising_edge(clk) then
if count="1001" then
count<="0000";
o10<='1';
else
count<=count+"0001";
o10<='0';
Это тоже не есть хорошо.
o10 надо бы в другом процессе. А то порождается вход разрешения в этом триггере по rst.
Да и что касается работы с FPGA, то лучше наверно реализовать счетчик типа ИЕ17 с одной тактированной частотой и сквозным переносом и трюковыми входами.
А если ресурсы не экономить. То все просто.
Чистый двоичный счетчик на интервал отсчета (существенно меньшей разрядности).
Перевод bin2 - bcd. Мультиплекстрование для динамической индикации.
Sergey Reva
Цитата
Я не моделировал. Да и описание по мне некорректно. Мне показалось, что gate в нуле 7 тактов, а не 8.
Непонятно как высвечивается один из 8 знаков.

8й знак (и остальные) высвечивается когда счётчик считает до 999999, независимо от состояния gate или любого другого сигнала
sazh
Цитата(Sergey Reva @ Nov 8 2007, 23:39) *
8й знак (и остальные) высвечивается когда счётчик считает до 999999, независимо от состояния gate или любого другого сигнала


Так оно и есть. Извините, еще в догон.
Если использовать асинхронный rst счетчика, то этот rst наверно должен быть порождением триггера, а не логики. В противном случает возможны сбои этого счетчика в процессе работы от пичков.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.