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

Выдача конечного кол-ва clk по сигналу start

Поскажите начинающему как реализовать, вроде-бы, несложную схему на VHDL:

 

Есть сигнал start.

Длительность его лог. 1 = длительности clk.

Скважность = N*clk. Т.е. между фронтами start умещается N clk.

По сигналу start нужно выдать M (M<N) штук clk.

В данный момент N = 20 M = 16, но может измениться.

 

Как я вижу нужен:

 

1. счетчик clk - st_clk. Запускать его по сигналу start.

2. компаратор, выдающий сигнал en_clk <= '1' при st_clk<M else en_clk <= '0'

3. clk_out <= clk and en_clk

 

Что я написал:

 

signal st_calc_clk     : natural range 0 to M := 0;    -- счетчик клоков блока вычислений
signal en_st            : std_logic := '0';
signal clk_s            : std_logic := '0';

clk_s <= clk and en_st; 

process (clk, aclr, start)
begin
    
  if(aclr = '1') then

    st_calc_clk <= 0;    
    en_st <= '0';

  elsif (rising_edge(clk)) then
    
    if(start  = '1') then    

      st_calc_clk <= 0;
      en_st <= '1';

    else    
            
      if (en_st = '1') then
                
        if(st_calc_clk = M) then
                    
          en_st <= '0';
            
          end if;

            st_calc_clk <= st_calc_clk+1;

        end if;
                        
      end if;
        
   end if;
    
end process;

 

Но т.к. все работает по переднему фронту clk. При срабатывании условия if(st_calc_clk = M) then en_st <= '0'; по выходу логического элемента clk_s <= clk and run_st; будет короткий "торчок".

Поэтому мне, наверное, нужно выставить запрет выдачи clk en_st <= '0' либо по предыдущему заднему фронту, либо по лог. 0. Тогда ругается компилятор.

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


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

сдвиньте все на 0.5 clk,

вот эта конструкция

 

clk_s <= clk and en_st;

 

не сработает мгновенно, по восходящему фронту clk, начнет выставляться en_st, и только через некоторое время он станет 1, и тогда появится первый клок на выходе, то есть фактически первый клок из цикла будет укорочен, выдайте на ружу лучше

 

clk_s <= ~clk and en_st;

 

или как там в вхдл будет инверсия CLK,

 

тогда все переходные процессы у вас будут как бы в 0 выходного клока, и окончание и начало.

 

 

 

да кстати помниться были еще

 

if(clk'event and clk == '1') - восходящий фронт

if(clk'event and clk == '0') - падающий фронт

if(clk'event) - оба фронта

в этом случае вы можете включатся по одному фронту, и выключатся по другому...

 

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


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

сдвиньте все на 0.5 clk,

вот эта конструкция

 

clk_s <= clk and en_st;

 

не сработает мгновенно, по восходящему фронту clk, начнет выставляться en_st, и только через некоторое время он станет 1, и тогда появится первый клок на выходе, то есть фактически первый клок из цикла будет укорочен, выдайте на ружу лучше

 

clk_s <= ~clk and en_st;

 

или как там в вхдл будет инверсия CLK,

 

тогда все переходные процессы у вас будут как бы в 0 выходного клока, и окончание и начало.

на мой взгляд данный совет не совсем коректен

 

лучше пользоваться СЕ у триггера

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


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

Поскажите начинающему как реализовать, вроде-бы, несложную схему на VHDL:

 

Есть сигнал start.

Все это делается гораздо проще. Есть такой термин "программируемый таймер" и есть "статический автомат"...

По приходу "старта", автомат записывает в таймер требуемое число, которое таймер будет считать. А таймер обычно выдает два сигнала: Занят и Готов... Так вот, Занят - это будет разрешением на прием клоков (CE), подается на вход разрешения триггеров. А сигнал Готов анализируется автоматом и по его приходу автомат становится в исходное и снова ждет Старт...

У меня приведены примеры в "Кратком Курсе", см. мой сайт...

При таком построении всегда можно все легко перестроить и провести отладку... Так же таймер можно загружать не фиксированным кодом, а данными от какой-нибудь шины...

Удачи!

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


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

на мой взгляд данный совет не совсем коректен

 

лучше пользоваться СЕ у триггера

 

Обоснуйте, чем лучше?

Как вы победите задержку после фронта клока при включении и выключении?

 

 

Все это делается гораздо проще. Есть такой термин "программируемый таймер" и есть "статический автомат"...

По приходу "старта", автомат записывает в таймер требуемое число, которое таймер будет считать. А таймер обычно выдает два сигнала: Занят и Готов... Так вот, Занят - это будет разрешением на прием клоков (CE), подается на вход разрешения триггеров. А сигнал Готов анализируется автоматом и по его приходу автомат становится в исходное и снова ждет Старт...

У меня приведены примеры в "Кратком Курсе", см. мой сайт...

При таком построении всегда можно все легко перестроить и провести отладку... Так же таймер можно загружать не фиксированным кодом, а данными от какой-нибудь шины...

Удачи!

 

и сработает без задержке? начнет выдавать прям с того же такта как старт придет? Неужели конечный автомат и таймер, будет проще счетчика и сигнала разрешения?

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


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

Обоснуйте, чем лучше?

Как вы победите задержку после фронта клока при включении и выключении?

 

и сработает без задержке? начнет выдавать прям с того же такта как старт придет? Неужели конечный автомат и таймер, будет проще счетчика и сигнала разрешения?

В синхронных схемах все делается только по фронтам клоков.

Первый фронт - это сигнал старта, следующий - загрузка таймера. Или если в таймер заносится константа, то возможно и без этого фронта обойтись. И дальше выдается сигнал разрешения, а не сами клоки... Клоки никогда ничем не стробируются...

 

 

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


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

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

На вхдл тяжело, давно на верелоге пишу, но на нем так

 

//вход клока
input clk;
//длина выдачи
localparam CLK_LEN = 16;
//вход старта
input start; 
//счетчик
integer clk_counter = 0;
//выход клока
output clk_out;
//если счетчик не ноль выдаем инверсию клока, иначе 0
assign clk_out (clk_counter !=0) ? ~clk : 0;

//по каждому фронту клока
always @(posedge clk)
  begin
    //по сигналу старта, если счетчик ноль, заряжаем его
    if((start != 0)&&(clk_counter == 0)
      clk_counter <= CLK_LEN;
    else if (clk_counter>0) //иначе 
     clk_counter <= clk_counter - 1; //считаем до нуля 
  end

 

 

фактически это тоже автомат, с нечеткими состояниями... также можно считать до 1, а на 1 задержатся и дождаться падения старта...

 

 

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


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

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

На вхдл тяжело, давно на верелоге пишу, но на нем так

 

//вход клока
input clk;
//длина выдачи
localparam CLK_LEN = 16;
//вход старта
input start; 
//счетчик
integer clk_counter = 0;
//выход клока
output clk_out;
//если счетчик не ноль выдаем инверсию клока, иначе 0
assign clk_out (clk_counter !=0) ? ~clk : 0;

//по каждому фронту клока
always @(posedge clk)
  begin
    //по сигналу старта, если счетчик ноль, заряжаем его
    if((start != 0)&&(clk_counter == 0)
      clk_counter <= CLK_LEN;
    else if (clk_counter>0) //иначе 
     clk_counter <= clk_counter - 1; //считаем до нуля 
  end

 

 

фактически это тоже автомат, с нечеткими состояниями... также можно считать до 1, а на 1 задержатся и дождаться падения старта...

Просто любопытство:

Выложите плиз скриншот моделирования на Post Rout... Количество тактов, которое будет выдаваться, выбирайте любое, главное чтобы на скриншоте было видно весь процесс от начала до конца и несколько тактов после окончания выдачи...

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


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

что-то я даже не осилю чего вы хотите:) не то чтобы это реализовать...

 

может вы просто зададите вопросом то в чем вы подозреваете эту схему, а я вам также просто текстом отвечу... ну или сами сделайте скриншот этот, и мы вместе посмотрим что там не так...

 

 

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


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

что-то я даже не осилю чего вы хотите:) не то чтобы это реализовать...

 

может вы просто зададите вопросом то в чем вы подозреваете эту схему, а я вам также просто текстом отвечу... ну или сами сделайте скриншот этот, и мы вместе посмотрим что там не так...

 

Под скриншотом я имел ввиду снимок/фото экрана ПК с запущенным симулятором...

 

Описание слова скриншот в вики

Пример во вложении

post-24839-1377522628_thumb.jpg

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


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

11a08616cf180a3dd8c9fd5f39d43c46.jpeg

 

 

вот как то так, на 3 клока,

старт через каждые 5 клоков...

 

чет как то картинку по нормальному выложить я так и не смог...

 

http://files.mail.ru/A80A85A5255C4F20B75E3CB76C3E8970?t=1

вот так, чтоб без баб голых:)

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


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

11a08616cf180a3dd8c9fd5f39d43c46.jpeg

 

 

вот как то так, на 3 клока,

старт через каждые 5 клоков...

 

чет как то картинку по нормальному выложить я так и не смог...

 

http://files.mail.ru/A80A85A5255C4F20B75E3CB76C3E8970?t=1

вот так, чтоб без баб голых:)

 

Спасибо! То что нужно.

Также, всех благодарю за участие в обсуждении.

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


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

схема предложенная ТС гораздо проще и изящней больших автоматов. И позволяет получить минимальную задержку выхода.
А так же она позволяет получить gated clock, что для FPGA дюже не хорошо B)

 

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


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

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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