|
Тактовый сигнал 1 кГц |
|
|
|
Aug 23 2015, 21:39
|

Участник

Группа: Участник
Сообщений: 68
Регистрация: 2-05-15
Из: Смоленск
Пользователь №: 86 484

|
Для реализации антитвита необходим тактовый сигнал 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;
Сообщение отредактировал des00 - Aug 24 2015, 03:24
Причина редактирования: используйте теги code для оформления кода (с) модератор
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 33)
|
Aug 24 2015, 02:58
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(aleshanoff @ Aug 24 2015, 03:39)  Для реализации антитвита необходим тактовый сигнал 1 кГц. Как его получить? Через IP (core) Single DCM_SP не получается - максимальный коэффициент всего лишь 16. ПЛИС spartan3E. Глабальный CLK 25 МГц. Код антитвита: Рекомендую осилить такой элемент как двоичный счётчик. При должной сноровке он позволит вам поделить свои 25МГц на 25000 и в итоге получить необходимый строб разрешения с требуемой частотой. Только не вздумайте этот строб использовать для прямого тактирования синхронных элементов - только как clock enable. Иначе - сразу будет gated clock, а это моветон, куча граблей и презрение всего цивилизованого сообщества.
Причина редактирования: избыточное цитирование (с) модератор
|
|
|
|
|
Aug 24 2015, 03:47
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 12-06-15
Из: Земля
Пользователь №: 87 133

|
Цитата(Bad0512 @ Aug 24 2015, 05:58)  Только не вздумайте этот строб использовать для прямого тактирования синхронных элементов - только как clock enable. Иначе - сразу будет gated clock, а это моветон, куча граблей и презрение всего цивилизованого сообщества. Если применить синхронный делитель частоты, то никаких граблей. Но про переходы в разные домены клока забывать нельзя (если они есть, конечно).
|
|
|
|
|
Aug 24 2015, 06:17
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(blackfin @ Aug 24 2015, 12:07)  И тем не менее: [attachment=94839:UG903.jpg] См. Xilinx, UG903, стр.77 Хочу Вас расстроить, Кэп, но асинхронные счётчики давно вышли из моды, сейчас чтобы собрать такое чудо нужно специально вручную лепить примитивы низкого уровня, при этом постоянно продираясь через тучи варнингов в стиле "чувак, так делать не рекомендуется, ты идёшь по граблям!". Обычные конструкции типа : Код always@(posedge clk) counter <= counter + 1'b1; Всегда генерят счётчик с синхронным переносом. Обсуждаемый вопрос вообще к этому не относится - вопрос в том, что потом делать с результатом подобного деления частоты.
|
|
|
|
|
Aug 24 2015, 08:16
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(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] Всё собирается без ошибок и варнингов.. Что я делаю не так???
|
|
|
|
|
Aug 24 2015, 08:46
|

Участник

Группа: Участник
Сообщений: 68
Регистрация: 2-05-15
Из: Смоленск
Пользователь №: 86 484

|
Цитата(blackfin @ Aug 24 2015, 12:40)  Дык, если на новом (низкочастотном) клоке логики сидит не много, то, как уже сказали, лучше (и проще) использовать выход счетчика в качестве clk_ena, а если на этом новом клоке сидит половина FPGA, то лучше сделать честный клок и сэкономить тучу киловатт*часов электроэнергии..
ИМХО, конечно.. Спасибо. Висит на этом клоке только два счетчика антитвита. Но чтобы в двоичной системе 25000 = 110000110101000. Счетчик получается 15 разрядный. С какого выхода счетчика тактировать антитвит?
|
|
|
|
|
Aug 24 2015, 08:56
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(blackfin @ Aug 24 2015, 14:48)  Ну, ясное дело, вот с этого:
wire comp = ((12500-1) == cntr25MHz); Ужос-ужос-ужос! Волосы на клоке детектед! Тогда уж так : reg comp;
always@(posedge clk) comp <= ((12500-1) == cntr25MHz);
|
|
|
|
|
Aug 24 2015, 08:59
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Bad0512 @ Aug 24 2015, 11:56)  Ужос-ужос-ужос! Волосы на клоке детектед! Еще раз.. Вы невнимательны к контексту. Здесь уже нету клока, а есть clk_ena == comp, для которого сработают setup/hold всего проекта.. PS. Если, конечно, ТС не захочет создавать отдельный клок, чтобы тактировать "только два счетчика антитвита".. Чудесато!..
|
|
|
|
|
Aug 24 2015, 09:07
|

Знающий
   
Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402

|
Цитата Ужос-ужос-ужос! Волосы на клоке детектед! Прости господи (и модер за офф), буква лишняя померещилась  А зачем несчастному антидребезгу настолько высокая точность, что именно 1кГц, а не 900Гц и не 1.2кГц? Подобрали примерно близкое что-то с одной единичкой в коде (в старшем разряде) и пользуйте её. Ни шума, ни волос в непотребных местах, ни логики лишней.
--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
|
|
|
|
|
Aug 24 2015, 09:15
|

Участник

Группа: Участник
Сообщений: 68
Регистрация: 2-05-15
Из: Смоленск
Пользователь №: 86 484

|
Цитата(blackfin @ Aug 24 2015, 13:11)  А Вы чего ожидали? Что соберется Intel Core-i7? я ждал, что будет один вход глобального такта и один выход 1 кГц А кто такой ТС?
|
|
|
|
|
Aug 24 2015, 09:21
|

Знающий
   
Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402

|
Цитата(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
--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
|
|
|
|
|
Aug 24 2015, 09:25
|

Участник

Группа: Участник
Сообщений: 68
Регистрация: 2-05-15
Из: Смоленск
Пользователь №: 86 484

|
Цитата(blackfin @ Aug 24 2015, 13:17)  И формулируйте свои хотелки более внятно, а то народ (включая меня) неверно реагирует..  Спасибо за замечание. Прину к сведению.
|
|
|
|
|
Aug 24 2015, 10:33
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(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 такт, но значительно уменьшает проблемы тайминга.
|
|
|
|
|
Aug 26 2015, 06:23
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Цитата(blackfin @ Aug 24 2015, 15:40)  Дык, если на новом (низкочастотном) клоке логики сидит не много, то, как уже сказали, лучше (и проще) использовать выход счетчика в качестве clk_ena, а если на этом новом клоке сидит половина FPGA, то лучше сделать честный клок и сэкономить тучу киловатт*часов электроэнергии.. Как мы не так давно выяснили, использование CE снижает потребление.
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
|
Aug 26 2015, 07:00
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(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.
|
|
|
|
|
Aug 26 2015, 14:32
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 4-06-08
Из: Москва
Пользователь №: 38 056

|
Набираем в гугле "verilog debounce example" Первая же ссылка выводит на готовый пример. Работает.
|
|
|
|
|
Aug 26 2015, 18:15
|
Частый гость
 
Группа: Участник
Сообщений: 123
Регистрация: 12-06-15
Из: Земля
Пользователь №: 87 133

|
Цитата(Krys @ Aug 26 2015, 12:30)  Синхронный делитель - и у меня такой термин вызвал недопонимание Я имел ввиду делитель на синхронном счетчике.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|