Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Тактовый сигнал 1 кГц
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
aleshanoff
Для реализации антитвита необходим тактовый сигнал 1 кГц. Как его получить? Через IP (core) Single DCM_SP не получается - максимальный коэффициент всего лишь 16. ПЛИС spartan3E. Глабальный CLK 25 МГц.
Код антитвита:
Код
library IEEE;
use IEEE.STD_LOGIC_1164 .ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity antitwit_fix is
Port ( INSIG : in STD_LOGIC;
N1kHz : in STD_LOGIC;
OUTSIG : out STD_LOGIC);
end antitwit_fix;

architecture Behavioral of antitwit_fix is

signal INT1, INT2,: STD_LOGIC; -- декларируем внутренние сигналы
signal BUS1: STD_LOGIC_VECTOR (7 downto 0):= ”00000000”;


begin

process (N1kHz)
begin
if N1kHz 'event and N1kHz = ‘1’ then
if INT1 = '1’ then
BUS1 <= BUS1 + 1;
end if;
end if;
end process;

INT1 <= ‘1’ when  or INSIG = ‘1’ else ‘0’;
OUTSIG <= INT2;
INT2 <= ‘0’ when BUS1 = ”00000000” else ‘1’;
end Behavioral;
Bad0512
Цитата(aleshanoff @ Aug 24 2015, 03:39) *
Для реализации антитвита необходим тактовый сигнал 1 кГц. Как его получить? Через IP (core) Single DCM_SP не получается - максимальный коэффициент всего лишь 16. ПЛИС spartan3E. Глабальный CLK 25 МГц.
Код антитвита:

Рекомендую осилить такой элемент как двоичный счётчик. При должной сноровке он позволит вам поделить свои 25МГц на 25000 и в итоге получить необходимый строб разрешения с требуемой частотой. Только не вздумайте этот строб использовать для прямого тактирования синхронных элементов - только как clock enable. Иначе - сразу будет gated clock, а это моветон, куча граблей и презрение всего цивилизованого сообщества.
bugdesigner
Цитата(Bad0512 @ Aug 24 2015, 05:58) *
Только не вздумайте этот строб использовать для прямого тактирования синхронных элементов - только как clock enable. Иначе - сразу будет gated clock, а это моветон, куча граблей и презрение всего цивилизованого сообщества.

Если применить синхронный делитель частоты, то никаких граблей. Но про переходы в разные домены клока забывать нельзя (если они есть, конечно).
Bad0512
Цитата(bugdesigner @ Aug 24 2015, 09:47) *
Если применить синхронный делитель частоты

А что это за зверь такой? И чем он к примеру от "асинхронного" отличается?
blackfin
Цитата(Bad0512 @ Aug 24 2015, 09:29) *
А что это за зверь такой? И чем он к примеру от "асинхронного" отличается?

Asynchronous (ripple) counter vs Synchronous counter.
Bad0512
Спасибо, Кэп!
Про разные типы счетчиков тут речь не шла.
blackfin
Цитата(Bad0512 @ Aug 24 2015, 08:59) *
Спасибо, Кэп!
Про разные типы счетчиков тут речь не шла.

И тем не менее:
Нажмите для просмотра прикрепленного файла
См. Xilinx, UG903, стр.77
Bad0512
Цитата(blackfin @ Aug 24 2015, 12:07) *
И тем не менее:
Нажмите для просмотра прикрепленного файла
См. Xilinx, UG903, стр.77

Хочу Вас расстроить, Кэп, но асинхронные счётчики давно вышли из моды, сейчас чтобы собрать такое чудо нужно
специально вручную лепить примитивы низкого уровня, при этом постоянно продираясь через тучи варнингов в стиле
"чувак, так делать не рекомендуется, ты идёшь по граблям!".
Обычные конструкции типа :
Код
always@(posedge clk)
  counter <= counter + 1'b1;

Всегда генерят счётчик с синхронным переносом.
Обсуждаемый вопрос вообще к этому не относится - вопрос в том, что потом делать с результатом подобного деления частоты.
blackfin
Цитата(Bad0512 @ Aug 24 2015, 09:17) *
Хочу Вас расстроить, Кэп, но асинхронные счётчики давно вышли из моды..

Не надо меня лечить..

Вы спросили: "А что это за зверь такой? И чем он к примеру от "асинхронного" отличается?"

Я дал ссылку на Wiki. К Wiki претензии есть?

biggrin.gif

Bad0512
Цитата(blackfin @ Aug 24 2015, 12:20) *
Вы спросили: "А что это за зверь такой? И чем он к примеру от "асинхронного" отличается?"

Я дал ссылку на Wiki. К Wiki претензии есть?

biggrin.gif

Разницу между терминами "счётчик" и "делитель частоты" улавливаете?
blackfin
Цитата(Bad0512 @ Aug 24 2015, 10:15) *
Разницу между терминами "счётчик" и "делитель частоты" улавливаете?

Ну, "делителя частоты" в котором нет "счётчика" я пока еще не встречал..

Вот, собрал тестовый проектик:
Код
module async
(
  clk25MHz,

  nrst1KHz,
  nrst25MHz,

  cntr1KHz
);
input        clk25MHz;

input        nrst1KHz;
input        nrst25MHz;

output [7:0] cntr1KHz;

reg          clk1KHz;
reg   [13:0] cntr25MHz;

wire         comp = ((12500-1) == cntr25MHz);

always @(posedge clk25MHz or negedge nrst25MHz)
begin
  if (nrst25MHz == 0)
  begin
    clk1KHz <= 0;
    cntr25MHz <= 0;
  end
  else
  begin
    if (comp)
    begin
      clk1KHz <= !clk1KHz;
      cntr25MHz <= 0;
    end
    else
    begin
      cntr25MHz <= cntr25MHz + 1;
    end
  end
end

reg [7:0] cntr1KHz;

always @(posedge clk1KHz or negedge nrst1KHz)
begin
  if (nrst1KHz == 0)
  begin
    cntr1KHz <= 0;
  end
  else
  begin
    cntr1KHz <= cntr1KHz + 1;
  end
end

endmodule

Код
# Clock constraints
create_clock -name clk25MHz -period 40.000 [get_ports {clk25MHz}] -waveform {0.000 20.000}

# tsu/th constraints
set_input_delay -clock clk25MHz -min 1.0 [get_ports nrst25MHz]
set_input_delay -clock clk25MHz -max 2.0 [get_ports nrst25MHz]

create_generated_clock -name clk1KHz -source [get_ports clk25MHz] -divide_by 25000 [get_pins clk1KHz_reg/Q]

set_clock_groups -asynchronous -group clk25MHz -group clk1KHz

set_input_delay -clock clk1KHz -min 1.0 [get_ports nrst1KHz]
set_input_delay -clock clk1KHz -max 2.0 [get_ports nrst1KHz]

# Constrain the output I/O path
set_output_delay -clock clk1KHz -min 0.000 [all_outputs]
set_output_delay -clock clk1KHz -max 1.000 [all_outputs]

Всё собирается без ошибок и варнингов..

Что я делаю не так???

biggrin.gif
Golikov A.
Цитата
Что я делаю не так???

делите частоту на 50 вместо 25?
blackfin
Цитата(Golikov A. @ Aug 24 2015, 11:24) *
делите частоту на 50 вместо 25?

А.. ну да, ну да..

biggrin.gif wacko.gif

PS. Исправил.. на всякий случай..
aleshanoff
Товарищи, спасибо за бурное обсуждение!
Но все же как мне сделать антидребезг?
на его вход подать сигнал со счетчика?
blackfin
Цитата(aleshanoff @ Aug 24 2015, 11:34) *
Но все же как мне сделать антидребезг?
на его вход подать сигнал со счетчика?

Дык, если на новом (низкочастотном) клоке логики сидит не много, то, как уже сказали, лучше (и проще) использовать выход счетчика в качестве clk_ena,
а если на этом новом клоке сидит половина FPGA, то лучше сделать честный клок и сэкономить тучу киловатт*часов электроэнергии..

ИМХО, конечно..
aleshanoff
Цитата(blackfin @ Aug 24 2015, 12:40) *
Дык, если на новом (низкочастотном) клоке логики сидит не много, то, как уже сказали, лучше (и проще) использовать выход счетчика в качестве clk_ena,
а если на этом новом клоке сидит половина FPGA, то лучше сделать честный клок и сэкономить тучу киловатт*часов электроэнергии..

ИМХО, конечно..

Спасибо. Висит на этом клоке только два счетчика антитвита. Но чтобы в двоичной системе 25000 = 110000110101000. Счетчик получается 15 разрядный. С какого выхода счетчика тактировать антитвит?
blackfin
Цитата(aleshanoff @ Aug 24 2015, 11:46) *
С какого выхода счетчика тактировать антитвит?

Ну, ясное дело, вот с этого:

wire comp = ((12500-1) == cntr25MHz);
Bad0512
Цитата(blackfin @ Aug 24 2015, 14:48) *
Ну, ясное дело, вот с этого:

wire comp = ((12500-1) == cntr25MHz);

Ужос-ужос-ужос! Волосы на клоке детектед!

Тогда уж так :

reg comp;

always@(posedge clk)
comp <= ((12500-1) == cntr25MHz);

blackfin
Цитата(Bad0512 @ Aug 24 2015, 11:56) *
Ужос-ужос-ужос! Волосы на клоке детектед!

Еще раз.. Вы невнимательны к контексту.

Здесь уже нету клока, а есть clk_ena == comp, для которого сработают setup/hold всего проекта..

PS. Если, конечно, ТС не захочет создавать отдельный клок, чтобы тактировать "только два счетчика антитвита"..

Чудесато!..
EvgenyNik
Цитата
Ужос-ужос-ужос! Волосы на клоке детектед!
Прости господи (и модер за офф), буква лишняя померещилась sm.gif
А зачем несчастному антидребезгу настолько высокая точность, что именно 1кГц, а не 900Гц и не 1.2кГц? Подобрали примерно близкое что-то с одной единичкой в коде (в старшем разряде) и пользуйте её. Ни шума, ни волос в непотребных местах, ни логики лишней.
aleshanoff
собрал код, любезно предоставленный blackfin - получился модуль с 3 входами и шиной выходов. Чет я совсем запутался))).
blackfin
Цитата(aleshanoff @ Aug 24 2015, 12:08) *
собрал код, любезно предоставленный blackfin - получился модуль с 3 входами и шиной выходов. Чет я совсем запутался))).

А Вы чего ожидали? Что соберется Intel Core-i7?
aleshanoff
Цитата(blackfin @ Aug 24 2015, 13:11) *
А Вы чего ожидали? Что соберется Intel Core-i7?

я ждал, что будет один вход глобального такта и один выход 1 кГц

А кто такой ТС?
blackfin
Цитата(aleshanoff @ Aug 24 2015, 12:15) *
А кто такой ТС?

ТС - Топик Стартер.. Вы, то бишь..

И формулируйте свои хотелки более внятно, а то народ (включая меня) неверно реагирует.. biggrin.gif
EvgenyNik
Цитата(aleshanoff @ Aug 24 2015, 13:15) *
я ждал, что будет один вход глобального такта и один выход 1 кГц
Код
module async
(
  clk25MHz,
  clk1KHz
);
input clk25MHz;
output reg clk1KHz;

reg   [13:0] cntr25MHz;

always @(posedge clk25MHz)
    begin
    if (cntr25MHz == 12499)
        begin
        clk1KHz <= !clk1KHz;
        cntr25MHz <= 0;
        end
    else
        begin
        cntr25MHz <= cntr25MHz + 1;
        end
    end
endmodule
aleshanoff
Цитата(blackfin @ Aug 24 2015, 13:17) *
И формулируйте свои хотелки более внятно, а то народ (включая меня) неверно реагирует.. biggrin.gif

Спасибо за замечание. Прину к сведению.
Bad0512
Цитата(blackfin @ Aug 24 2015, 14:59) *
Еще раз.. Вы невнимательны к контексту.

Здесь уже нету клока, а есть clk_ena == comp, для которого сработают setup/hold всего проекта..

PS. Если, конечно, ТС не захочет создавать отдельный клок, чтобы тактировать "только два счетчика антитвита"..

Чудесато!..

Насколько я вас понял - речь шла именно за полноценный клок (иначе к чему все эти пляски с "create_generated_clock"?), а не за clock_enable.
Но в любом случае защёлкнуть результат сравнения в триггере очень полезно потому что :
1. Если константа сравнения достаточно большая, то на сравнении мы запросто можем получить 3 слоя логики - а это уже немало по времени.
2. У цепей как клока так и CE как правило довольно большой fanout получается (мы сейчас не говорим за данный конкретный случай, а немного обобщаем).
3. Пункты 1 и 2 вместе могут очень запросто привести к проблемам в тайминге. Триггер добавляет задержку в 1 такт, но значительно уменьшает
проблемы тайминга.
Krys
Цитата(blackfin @ Aug 24 2015, 15:40) *
Дык, если на новом (низкочастотном) клоке логики сидит не много, то, как уже сказали, лучше (и проще) использовать выход счетчика в качестве clk_ena,
а если на этом новом клоке сидит половина FPGA, то лучше сделать честный клок и сэкономить тучу киловатт*часов электроэнергии..
Как мы не так давно выяснили, использование CE снижает потребление.
blackfin
Цитата(Krys @ Aug 26 2015, 09:23) *
Как мы не так давно выяснили, использование CE снижает потребление.

Quartus II Handbook Version 15.0.0, page 738:
Цитата
From a functional point of view, you can shut down a clock domain in a purely synchronous manner using a synchronous clock enable signal.
However, when using a synchronous clock enable scheme, the clock network continues toggling.
This practice does not reduce power consumption as much as gating the clock at the source does.
Krys
Спасибо за новый материал по теме снижения потребления. Я туда эту цитату приведу, чтобы в профильной теме общаться.
Krys
Цитата(blackfin @ Aug 24 2015, 15:16) *
Ну, "делителя частоты" в котором нет "счётчика" я пока еще не встречал..
И тем не менее, давайте использовать правильные термины. Синхронный делитель - и у меня такой термин вызвал недопонимание, я бы тоже уточняющий вопрос задал. Да, синхронный счётчик - есть такой термин.
aabmail
Набираем в гугле "verilog debounce example"
Первая же ссылка выводит на готовый пример. Работает.
bugdesigner
Цитата(Krys @ Aug 26 2015, 12:30) *
Синхронный делитель - и у меня такой термин вызвал недопонимание

Я имел ввиду делитель на синхронном счетчике.
Krys
Ну теперь-то мы уже путём длительного холивара разобрались )))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.