Перейти к содержанию
    

Таймер задержки на VHDL

Хотите об этом поговорить.

............ Выигрывает вовсе не тот, кто играет по всем правилам:

выигрывает тот, кто умеет отказаться в нужный момент от всех правил, навязать игре свои правила,

неизвестные противнику, а когда понадобиться- отказаться и от них....

А. и Б. Стругацкие, "Град обреченных" (1970-1987 гг.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините что долго не посещал свой топик,просто инета небыло. Я смотрю тут разгорелась неплохая дискуссия,рад что смог вас чем-то заинтересовать. Сейчас ворвался с головой в топики, но ещё до конца во всё не вник,вот просто сначала изложу ситуацию.

В общем дело обстоит так:близиться мой час Х,а проблема пока не решена и весь проект упирается в этот счётчик.Исходя из этого по прежнему молю о помощи.

В общем вся соль в том что сначала запутали меня, а я потом запутал вас. Уточняю задачу:

Изначально мы имеем некоторый тактовый генератор чатота с которого поступает на программируемый делитель частоты с коэфициентом деления от 1 до 65536 и на вход clk таймера задержки, который необходимо описать. С выхода делителя частоты сигналы поступают на вход set таймера задержки,т.е. set равен clk/(1...65536).Количество тактов clk, через которое сигнал set должен появится на выходе таймера задержки pinout задаётся на входе таймера prog. Задерживаться должен КАЖДЫЙ сигнал set. Например, при коэффициенте делителя частоты =2 и prog=1 должно получиться следующее:

001100110011001100110011001100110011 clk

001100000011000000110000001100000011 set

000000110000001100000011000000110000 pinout

У меня,как человека начинающего, фантазии на это не хватает, всегда получается нечто безобразное, прошу принять мою благодарность тем кто уже пытался мне помочь, и тем кто поможет ещё в дальнейшем.

Изменено пользователем darkniisiis

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не секрет, то что за делитель частоты использован?

И выровнены ли передние фронты SET и CLK на входе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините что долго не посещал свой топик,просто инета небыло. Я смотрю тут разгорелась неплохая дискуссия,рад что смог вас чем-то заинтересовать. Сейчас ворвался с головой в топики, но ещё до конца во всё не вник,вот просто сначала изложу ситуацию.

В общем дело обстоит так:близиться мой час Х,а проблема пока не решена и весь проект упирается в этот счётчик.Исходя из этого по прежнему молю о помощи.

В общем вся соль в том что сначала запутали меня, а я потом запутал вас. Уточняю задачу:

Изначально мы имеем некоторый тактовый генератор чатота с которого поступает на программируемый делитель частоты с коэфициентом деления от 1 до 65536 и на вход clk таймера задержки, который необходимо описать. С выхода делителя частоты сигналы поступают на вход set таймера задержки,т.е. set равен clk/(1...65536).Количество тактов clk, через которое сигнал set должен появится на выходе таймера задержки pinout задаётся на входе таймера prog. Задерживаться должен КАЖДЫЙ сигнал set. Например, при коэффициенте делителя частоты =2 и prog=1 должно получиться следующее:

001100110011001100110011001100110011 clk

001100000011000000110000001100000011 set

000000110000001100000011000000110000 pinout

У меня,как человека начинающего, фантазии на это не хватает, всегда получается нечто безобразное, прошу принять мою благодарность тем кто уже пытался мне помочь, и тем кто поможет ещё в дальнейшем.

 

У меня тоже не хватает фантазии по тому что у вас получается что сигналы set/pinout меняются по обеим кромкам клока что странно.

Изменено пользователем klop

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не секрет, то что за делитель частоты использован?

И выровнены ли передние фронты SET и CLK на входе?

Делитель частоты представляет собой следующее, вроде всё работает как надо:

process(clk) -- делитель частоты

begin

if (clk'event and clk='1') then

if res_clk='1' then

st<= conv_std_logic_vector(0,16);

elsif set_clk='1' then

if st=program_CLK-1 then

st<= conv_std_logic_vector(0,16);

else st<=st+1;

end if;

end if;

if program_CLK="0000000000000001" then

out_clk <= clk;

elsif (st=program_CLK-1 and set_clk='1' and clk='1')then

out_clk <= '1';

else

out_clk <= '0';

end if;

end if;

end process; -- конец делителя частоты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не секрет, то что за делитель частоты использован?

И выровнены ли передние фронты SET и CLK на входе?

Делитель частоты представляет собой следующее, вроде всё работает как надо:

process(clk) -- делитель частоты

begin

if (clk'event and clk='1') then

if res_clk='1' then

st<= conv_std_logic_vector(0,16);

elsif set_clk='1' then

if st=program_CLK-1 then

st<= conv_std_logic_vector(0,16);

else st<=st+1;

end if;

end if;

if program_CLK="0000000000000001" then

out_clk <= clk;

elsif (st=program_CLK-1 and set_clk='1' and clk='1')then

out_clk <= '1';

else

out_clk <= '0';

end if;

end if;

end process; -- конец делителя частоты

 

Даа. RMM отдыхает.

 

Ето то зачем -> elsif (st=program_CLK-1 and set_clk='1' and clk='1')then

после -> if (clk'event and clk='1') then

Изменено пользователем klop

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тоже не хватает фантазии по тому что у вас получается что сигналы set/pinout меняются по обеим кромкам клока что странно.

Извините,я вас не совсем понял

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Изначально мы имеем некоторый тактовый генератор чатота с которого поступает на программируемый делитель частоты с коэфициентом деления от 1 до 65536 и на вход clk таймера задержки//////

если частота тактового генератора clk, которая поступает на делитель частоты

001100110011001100110011001100110011 clk

и если set это выход этого делителя частоты, то такого

001100000011000000110000001100000011 set

неполучить без смешивания с самим clk.

если замешали. то это явно никчему.

Короче таких времянок не бывает, потому что без надобности

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тоже не хватает фантазии по тому что у вас получается что сигналы set/pinout меняются по обеим кромкам клока что странно.

Извините,я вас не совсем понял

 

Вы видели когда нибудь как работает обычный D-триггер? Он меняет свое знначеение по перепаду клокового сигнала (по фронту или по спаду) . Если диаграмка нарисованая Вами верна(извините но уменя возникают некие сомнения в верности постанвк задачи) то Вам надо использовать две группы тригеров одна работает по фронту другая по спаду но я не уверен что в таком виде задача реализуема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну реализовать-то можно... Проблема в том, что описанная вами модель делителя при коэффициенте делителя=4 выдаст такое:

CLK: 001100110011001100110011001100110011001100

SET: 001111000000000000111100000000000011110000

а не то, что вы написали...

Вы как проверяли работу делителя?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы уверены, что код выдает нарисованные вами сигналы ? if (clk'event and clk='1') предполагает изменение всех синхронных сигналов по переднему фронту clk

 

process(clk) -- делитель частоты
begin
    if (clk'event and clk='1') then
        if res_clk='1' then
            st<= conv_std_logic_vector(0,16);
        elsif set_clk='1' then
            if st=program_CLK-1 then
                st<= conv_std_logic_vector(0,16);
            else
                st<=st+1;
            end if;
        end if;

        if program_CLK="0000000000000001" then
            out_clk <= clk;
        elsif (st=program_CLK-1 and set_clk='1' and clk='1')then
            out_clk <= '1';
        else
            out_clk <= '0';
        end if;
    end if;
end process;

 

0011001100110011001100

0011000000000011000000

 

Такое только на DDR-регистрах получить можно... Ну или с асинхронной логикой, выдавая gated-клок.

 

И пора бы уже научиться кодами форума пользоваться, а то код смотреть неудобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я понял кто мне мозги парит, а за одно и вам!! Пошёл поговорил с постановщиком задачи, удалось убедить его в том что он не прав. Спасибо вам. Теперь жду на задание сервис пака первого :).

А на счёт делителя, то это не совсем тот текстовичёк, ошибочка вышла, вот совсем последняя версия с учётом правильной работы триггера,соответственно теперь длительность сигнала на выходе равна периоду clk, а не как говорилось раньше.

process(clk,prog_clk) -- делитель частоты

begin

if prog_clk="0000000000000001" then

out_clk<=clk;

end if;

if (clk'event and clk='1') then

if res_clk='1' then

st<= conv_std_logic_vector(0,16);

elsif set_clk='1' then

if st=prog_CLK-1 then

st<= conv_std_logic_vector(0,16);

else st<=st+1;

end if;

end if;

if (st=prog_CLK-1 and set_clk='1' and clk='1')then

out_clk <= '1';

else

out_clk <= '0';

end if;

end if;

end process; -- конец делителя частоты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем вся соль в том что сначала запутали меня, а я потом запутал вас. Уточняю задачу:

Изначально мы имеем некоторый тактовый генератор чатота с которого поступает на программируемый делитель частоты с коэфициентом деления от 1 до 65536 и на вход clk таймера задержки, который необходимо описать. С выхода делителя частоты сигналы поступают на вход set таймера задержки,т.е. set равен clk/(1...65536).Количество тактов clk, через которое сигнал set должен появится на выходе таймера задержки pinout задаётся на входе таймера prog от 0 до 65565. Задерживаться должен КАЖДЫЙ сигнал set. Например, при коэффициенте делителя частоты =2 и prog=1 должно получиться следующее:

0011001100110011001100110011001100 clk

0011110000111100001111000011110000 set

0000001111000011110000111100001111 pinout

Вот надеюсь так будет правильнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:) еще один глупый вопрос - что должно быть на выходе при коэффициенте делителя = 1 ?

А сделать проще делитель и "сдвиг" совместно. Тогда только счетчиками можно обойтись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...