Здравствуйте!
Нужно реализовать подсчёт длительности нахождения входного сигнала в '1' (в периодах тактовой частоты), а затем в этом же процессе реализовать задержку на такое же количество периодов тактовой частоты.
Пробовал сделать подсчёт сделать так:
А задержку так:
Весь процесс выглядит так:
Но при этом схема приобретает устрашающе большие размеры, и при симуляции на Post-Translate уровне работа схемы неудовлетворительная, хотя на Behavioral уровне всё было супер. Мне нужно чтоб счётчик тактов успевал обработать как короткие входные импульсы на входе CONVERT, так и длинные, до 10000000 тактов.
Как правильно сделать такую задержку?
Если нужно, могу выложить весь проект или нужные скриншоты.
Заранее спасибо.
Раздел: ПЛИС
Нужно реализовать подсчёт длительности нахождения входного сигнала в '1' (в периодах тактовой частоты), а затем в этом же процессе реализовать задержку на такое же количество периодов тактовой частоты.
Пробовал сделать подсчёт сделать так:
if (CLK'event and CLK='0') then
if RESET='1' then
..............
else
if CONVERT = '1' then
sample_length := sample_length +1;
end if;
end if;
end if;
А задержку так:
if (CLK'event and CLK='0') then
if RESET='1' then
..............
else
if sample_length = 1 then
sample_length := 0;
state <= idle;
else
sample_length := sample_length - 1;
end if;
end if;
end if;
Весь процесс выглядит так:
MAIN: process (CLK)
variable clk_count : clk_count_type := 0;
variable sample_length : natural := 0;
begin
if (CLK'event and CLK='0') then
if RESET='1' then
state <= idle;
DATA_RDY <= '0';
DATA_OUT <= "0000000000";
else
if CONVERT = '1' then
state <= wiat_coorect_ADC_data;
sample_length := sample_length +1;
end if;
case (state) is
when idle =>
DATA_RDY <= '0';
DATA_OUT <= "0000000000";
when wiat_coorect_ADC_data =>
if clk_count < (adc_propagation - 2) then
clk_count := clk_count+1;
else
clk_count := 0;
state <= coorect_ADC_data;
end if;
when coorect_ADC_data =>
DATA_RDY <= '1';
DATA_OUT <= DATA_IN;
if sample_length = 1 then
sample_length := 0;
state <= idle;
else
sample_length := sample_length - 1;
end if;
end case;
end if;
end if;
end process;
Но при этом схема приобретает устрашающе большие размеры, и при симуляции на Post-Translate уровне работа схемы неудовлетворительная, хотя на Behavioral уровне всё было супер. Мне нужно чтоб счётчик тактов успевал обработать как короткие входные импульсы на входе CONVERT, так и длинные, до 10000000 тактов.
Как правильно сделать такую задержку?
Если нужно, могу выложить весь проект или нужные скриншоты.
Заранее спасибо.
Раздел: ПЛИС