(Я бы разместил это в EE, но, похоже, здесь гораздо больше вопросов по VHDL ...)
Предпосылки. Я использую ПЛИС Xilinx Spartan-6LX9 с Xilinx ISE 14.4 (веб-пакет).
Сегодня я наткнулся на ужасное предупреждение «PhysDesignRules: 372 - Gated Clock», и я вижу, что по этому поводу в целом ведется МНОГО дискуссий. Похоже, что консенсус состоит в том, чтобы использовать один из DCM на FPGA для деления тактовой частоты, но ... мой DCM, похоже, не способен перейти от 32 МГц до 4,096 кГц (согласно мастеру он достигает нижней границы на 5 МГц на основе 32 МГц ... и кажется абсурдным пытаться объединить несколько DCM в цепочку для этой низкочастотной цели).
Моя текущая конструкция использует clk_in для подсчета до указанного значения (15265), сбрасывает это значение на ноль и переключает бит clk_out (так что у меня рабочий цикл равен 50%, FWIW). Он выполняет свою работу, и я легко могу использовать передний край clk_out для перехода к следующему этапу моего дизайна. Кажется, все работает нормально, но ... синхронизированные часы (даже если они не входят в диапазон, в котором асимметрия часов, ИМХО, будет очень актуальна). (Примечание: все тесты часов выполняются с использованием функции rise_edge () в процессах, чувствительных к данным часам.)
Итак, мои вопросы:
Если мы говорим о получении относительно медленного clk_out из гораздо более быстрого clk_in, считается ли стробирование плохим? Или этот вид «подсчитать до x и отправить импульс» довольно типичен для ПЛИС для генерации «часов» в диапазоне кГц, и вместо этого может запускаться какой-то другой ненужный побочный эффект это предупреждение?
Есть ли лучший способ создать тактовую частоту с низким кГц-диапазоном из основных тактовых импульсов с МГц-диапазоном, имея в виду, что использование нескольких DCM здесь кажется излишним (если это вообще возможно, учитывая очень низкую выходную частоту)? Я понимаю, что 50% -ный рабочий цикл может быть излишним, но если предположить, что один тактовый сигнал и не используются встроенные DCM, как еще можно выполнить основное деление тактовой частоты с помощью FPGA?
Изменить: учитывая следующее (где CLK_MASTER - это входная частота 32 МГц, а CLK_SLOW - желаемая частота медленной частоты, а LOCAL_CLK_SLOW была способом сохранить состояние часов для всего рабочего цикла), я узнал, что эта конфигурация вызывает предупреждение:
architecture arch of clock is
constant CLK_MASTER_FREQ: natural := 32000000; -- time := 31.25 ns
constant CLK_SLOW_FREQ: natural := 2048;
constant MAX_COUNT: natural := CLK_MASTER_FREQ/CLK_SLOW_FREQ;
shared variable counter: natural := 0;
signal LOCAL_CLK_SLOW: STD_LOGIC := '0';
begin
clock_proc: process(CLK_MASTER)
begin
if rising_edge(CLK_MASTER) then
counter := counter + 1;
if (counter >= MAX_COUNT) then
counter := 0;
LOCAL_CLK_SLOW <= not LOCAL_CLK_SLOW;
CLK_SLOW <= LOCAL_CLK_SLOW;
end if;
end if;
end process;
end arch;
Принимая во внимание, что эта конфигурация НЕ вызывает предупреждение:
architecture arch of clock is
constant CLK_MASTER_FREQ: natural := 32000000; -- time := 31.25 ns
constant CLK_SLOW_FREQ: natural := 2048;
constant MAX_COUNT: natural := CLK_MASTER_FREQ/CLK_SLOW_FREQ;
shared variable counter: natural := 0;
begin
clock_proc: process(CLK_MASTER)
begin
if rising_edge(CLK_MASTER) then
counter := counter + 1;
if (counter >= MAX_COUNT) then
counter := 0;
CLK_SLOW <= '1';
else
CLK_SLOW <= '0';
end if;
end if;
end process;
end arch;
Итак, в данном случае это было все из-за отсутствия другого (как я уже сказал, рабочий цикл 50% изначально был интересен, но в конечном итоге не был обязательным требованием, и переключение бита «локальных» часов казалось довольно умным при время ...) Похоже, я был в основном на правильном пути.
На данный момент мне не ясно, почему использование счетчика (в котором хранится много битов) не вызывает предупреждений, а бит вывода с сохранением и переключением действительно вызывает предупреждения. < / strong> Мысли?