|
Тактовый сигнал 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 для оформления кода (с) модератор
|
|
|
|
|
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] Всё собирается без ошибок и варнингов.. Что я делаю не так???
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|