su_evgeniy 0 23 августа, 2013 Опубликовано 23 августа, 2013 · Жалоба Поскажите начинающему как реализовать, вроде-бы, несложную схему на 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. Тогда ругается компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 августа, 2013 Опубликовано 23 августа, 2013 · Жалоба сдвиньте все на 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) - оба фронта в этом случае вы можете включатся по одному фронту, и выключатся по другому... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 23 августа, 2013 Опубликовано 23 августа, 2013 · Жалоба сдвиньте все на 0.5 clk, вот эта конструкция clk_s <= clk and en_st; не сработает мгновенно, по восходящему фронту clk, начнет выставляться en_st, и только через некоторое время он станет 1, и тогда появится первый клок на выходе, то есть фактически первый клок из цикла будет укорочен, выдайте на ружу лучше clk_s <= ~clk and en_st; или как там в вхдл будет инверсия CLK, тогда все переходные процессы у вас будут как бы в 0 выходного клока, и окончание и начало. на мой взгляд данный совет не совсем коректен лучше пользоваться СЕ у триггера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 23 августа, 2013 Опубликовано 23 августа, 2013 · Жалоба Поскажите начинающему как реализовать, вроде-бы, несложную схему на VHDL: Есть сигнал start. Все это делается гораздо проще. Есть такой термин "программируемый таймер" и есть "статический автомат"... По приходу "старта", автомат записывает в таймер требуемое число, которое таймер будет считать. А таймер обычно выдает два сигнала: Занят и Готов... Так вот, Занят - это будет разрешением на прием клоков (CE), подается на вход разрешения триггеров. А сигнал Готов анализируется автоматом и по его приходу автомат становится в исходное и снова ждет Старт... У меня приведены примеры в "Кратком Курсе", см. мой сайт... При таком построении всегда можно все легко перестроить и провести отладку... Так же таймер можно загружать не фиксированным кодом, а данными от какой-нибудь шины... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 23 августа, 2013 Опубликовано 23 августа, 2013 · Жалоба на мой взгляд данный совет не совсем коректен лучше пользоваться СЕ у триггера Обоснуйте, чем лучше? Как вы победите задержку после фронта клока при включении и выключении? Все это делается гораздо проще. Есть такой термин "программируемый таймер" и есть "статический автомат"... По приходу "старта", автомат записывает в таймер требуемое число, которое таймер будет считать. А таймер обычно выдает два сигнала: Занят и Готов... Так вот, Занят - это будет разрешением на прием клоков (CE), подается на вход разрешения триггеров. А сигнал Готов анализируется автоматом и по его приходу автомат становится в исходное и снова ждет Старт... У меня приведены примеры в "Кратком Курсе", см. мой сайт... При таком построении всегда можно все легко перестроить и провести отладку... Так же таймер можно загружать не фиксированным кодом, а данными от какой-нибудь шины... Удачи! и сработает без задержке? начнет выдавать прям с того же такта как старт придет? Неужели конечный автомат и таймер, будет проще счетчика и сигнала разрешения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 23 августа, 2013 Опубликовано 23 августа, 2013 · Жалоба Обоснуйте, чем лучше? Как вы победите задержку после фронта клока при включении и выключении? и сработает без задержке? начнет выдавать прям с того же такта как старт придет? Неужели конечный автомат и таймер, будет проще счетчика и сигнала разрешения? В синхронных схемах все делается только по фронтам клоков. Первый фронт - это сигнал старта, следующий - загрузка таймера. Или если в таймер заносится константа, то возможно и без этого фронта обойтись. И дальше выдается сигнал разрешения, а не сами клоки... Клоки никогда ничем не стробируются... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба схема предложенная ТС гораздо проще и изящней больших автоматов. И позволяет получить минимальную задержку выхода. На вхдл тяжело, давно на верелоге пишу, но на нем так //вход клока 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 задержатся и дождаться падения старта... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nand_gates 0 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба Можете ли вы предоставить волны? о том, что именно вы ищете? спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба схема предложенная ТС гораздо проще и изящней больших автоматов. И позволяет получить минимальную задержку выхода. На вхдл тяжело, давно на верелоге пишу, но на нем так //вход клока 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... Количество тактов, которое будет выдаваться, выбирайте любое, главное чтобы на скриншоте было видно весь процесс от начала до конца и несколько тактов после окончания выдачи... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба что-то я даже не осилю чего вы хотите:) не то чтобы это реализовать... может вы просто зададите вопросом то в чем вы подозреваете эту схему, а я вам также просто текстом отвечу... ну или сами сделайте скриншот этот, и мы вместе посмотрим что там не так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба что-то я даже не осилю чего вы хотите:) не то чтобы это реализовать... может вы просто зададите вопросом то в чем вы подозреваете эту схему, а я вам также просто текстом отвечу... ну или сами сделайте скриншот этот, и мы вместе посмотрим что там не так... Под скриншотом я имел ввиду снимок/фото экрана ПК с запущенным симулятором... Описание слова скриншот в вики Пример во вложении Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба вот как то так, на 3 клока, старт через каждые 5 клоков... чет как то картинку по нормальному выложить я так и не смог... http://files.mail.ru/A80A85A5255C4F20B75E3CB76C3E8970?t=1 вот так, чтоб без баб голых:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
su_evgeniy 0 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба вот как то так, на 3 клока, старт через каждые 5 клоков... чет как то картинку по нормальному выложить я так и не смог... http://files.mail.ru/A80A85A5255C4F20B75E3CB76C3E8970?t=1 вот так, чтоб без баб голых:) Спасибо! То что нужно. Также, всех благодарю за участие в обсуждении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба схема предложенная ТС гораздо проще и изящней больших автоматов. И позволяет получить минимальную задержку выхода.А так же она позволяет получить gated clock, что для FPGA дюже не хорошо B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба о чем среда тут же предупредит, и предложит на выходе поставить DDR или буфер, мне во всяком случае как я такую штуку наружу вывел сразу же предложила, даже сказала где тимплайт взять для такого решения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться