Jump to content

    

Подсчет импульсов

Совершенно не "адекватен"!!! Даже идейно вреден...

Ставим автомат и таймер если нужно, только так... Автомат выдает "одиночный импульс", и на следующих тактах продолжает "длительного процесса"... Длительность которого задается таймером...

 

А зачем так сложно? Чем плох rs-триггер с самосбросом?

 

Подход адекватен, код неадекватен.

Надо учитывать, что в always-блоках все операторы выполняются последовательно.

Сам так пишу (без "else"):

pulse <= 0;
if(cnt == 0) pulse <= 1;

Второй оператор "отменяет" первый при выполнении условия "cnt == 0".

Условие "if(pulse)" - лишнее.

 

Что-то я сомневаюсь что данный код будет работать, т.к. все операторы присвоения же (внутри веток if'ов) выполняются параллельно. Т.е., грубо говоря, одномоментно при доходе счетчика до нуля будет попытка установки и в единицу и в ноль, не говоря уже о том что присвоение нуля выполняется всегда безусловно.

Edited by dmy

Share this post


Link to post
Share on other sites
А зачем так сложно? Чем плох rs-триггер с самосбросом?

Мне доводилось "писать программы", втыкая в машину штырьки с дырочками, потом были программы в машинных кодах, потом на ассемблере, потом, Бэйсик, Форт, Си и т.д.

А Вы как ведете проект в ПЛИС, на каком уровне? На уровне триггеров или на уровне "процессов"?

Share this post


Link to post
Share on other sites
Т.е., грубо говоря, одномоментно при доходе счетчика до нуля будет попытка установки и в единицу и в ноль, не говоря уже о том что присвоение нуля выполняется всегда безусловно.

Нет. Можно так рассуждать:

все операторы одного always-блока последовательно просматриваются,

и потом выполняются все последние присваивания.

Поэтому в коде:

pulse <= 0;

pulse <= 1;

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

А если есть условия, то в зависимости от выполнения этих условий.

 

Share this post


Link to post
Share on other sites
А Вы как ведете проект в ПЛИС, на каком уровне? На уровне триггеров или на уровне "процессов"?

 

Я оперирую модулями (module), автоматами и их состояниями (fsm), блоками (always), регистрами (триггерами, reg), сигналами (wire), последовательностями сигналов (во времени). Конечно, код не рисуется, а пишется, но мы же понимаем во что это все выльется в итоге - все синтезируется именно в триггера с логикой вокруг них. Процесс в моем видении - это последовательность переключений триггеров во времени по заданной мною схеме (алгоритму). Грубо говоря, когда пишу код, то вижу перед собой не программу, а rtl-схему.

 

Вот, например, я предпочитаю делать импульсы так как писал выше. Но вижу что уважаемые люди делают иначе и вроде даже против предложенного мной подхода. Хочется понять почему неправильно так делать, докопаться до самых низов. Если, конечно, это не дело исключительно вкуса, цвета, стиля написания кода и удобства его чтения/сопровождения.

Edited by dmy

Share this post


Link to post
Share on other sites
Но вижу что уважаемые люди делают иначе и вроде даже против предложенного мной подхода. Хочется понять почему неправильно так делать, докопаться до самых низов. Если, конечно, это не дело исключительно вкуса, цвета, стиля написания кода и удобства его чтения/сопровождения.

Завтра с 11 до 12 у меня есть время на разговоры... По скайпу...

Ну и статьи мои можете почитать...

Удачи!

 

Share this post


Link to post
Share on other sites
почему неправильно так делать

if(cnt > 0) pulse <= 1;

if(pulse) pulse <= 0;

Все время, пока (cnt > 0), будет генерироваться меандр, тк после " pulse <= 0" снова выполнится "pulse <= 1" в следующем такте.

Edited by Leka

Share this post


Link to post
Share on other sites
На самом деле все, что происходит внутри ПЛИС и должно делаться по "укороченным импульсам". Так что никаких "лишних" затрат и не будет...

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

 

Вот как надо на автомате

YoaR4uWCE3c.jpg

В прикрепленном архиве весь проект, тестбенч, синтез.

PulseCnt.7z

Share this post


Link to post
Share on other sites
Вот как надо на автомате

......

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

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

 

x4xPodwrKpY.jpg

PulseCnt_v1.7z

Share this post


Link to post
Share on other sites
На самом деле все, что происходит внутри ПЛИС и должно делаться по "укороченным импульсам". Так что никаких "лишних" затрат и не будет...

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

 

Здравствуйте.

Можно по-подробнее, на первом состоянии автомата устанавливаем управляющий сигнал, при следующем состоянии сбрасываем?

А далее управляющий сигнал идёт непосредственно на счётчик, напр: CNT_REG <= CNT_REG + PLS_SIG.

Так-же и для делителей частоты, не нужно генерировать сигнал со скважностью 50%, достаточно ширины в один такт?

Share this post


Link to post
Share on other sites
Здравствуйте.

Можно по-подробнее, на первом состоянии автомата устанавливаем управляющий сигнал, при следующем состоянии сбрасываем?

А далее управляющий сигнал идёт непосредственно на счётчик, напр: CNT_REG <= CNT_REG + PLS_SIG.

Так-же и для делителей частоты, не нужно генерировать сигнал со скважностью 50%, достаточно ширины в один такт?

Да, примерно так и надо действовать... Вот только здесь не "CNT_REG <= CNT_REG + PLS_SIG", а просто у всех триггеров и регистров должен быть сигнал разрешения...

 

Share this post


Link to post
Share on other sites
Да, примерно так и надо действовать... Вот только здесь не "CNT_REG <= CNT_REG + PLS_SIG", а просто у всех триггеров и регистров должен быть сигнал разрешения...

 

Что-то я совсем запутался, пожалуйста покритикуйте мой счётчик:

 

1 вариант:

always @ (posedge CLK or posedge RST)
begin
  if(RST) begin
    CNT_REG   <= 24'd0;
    CNT_OUT   <= 24'd0;
  end
  else if(ENB) begin
    if(LATCH) begin
      CNT_OUT <= CNT_REG + PLS;
      CNT_REG <= 24'd0;
    end
    else CNT_REG = CNT_REG + PLS;
  end
  else begin
    CNT_REG   <= 24'd0;
    CNT_OUT   <= 24'd0;
  end
end

 

2 вариант:

always @ (posedge CLK or posedge RST)
begin
  if(RST) begin
    CNT_REG   <= 24'd0;
    CNT_OUT   <= 24'd0;
  end
  else if(ENB) begin
    if(LATCH) begin
      if(PLS) CNT_OUT <= CNT_REG + 1'b1;
      else CNT_OUT <= CNT_REG;
      CNT_REG <= 24'd0;
    end
    else if(PLS) CNT_OUT <= CNT_REG + 1'b1;
  end
  else begin
    CNT_REG   <= 24'd0;
    CNT_OUT   <= 24'd0;
  end
end

 

Share this post


Link to post
Share on other sites
Что-то я совсем запутался, пожалуйста покритикуйте мой счётчик:

Скайп есть?

Share this post


Link to post
Share on other sites
Нет.

Ну и как Вам все объяснять?

Ведь все эти ENB, LATCH, PLS не прокомментированы...

 

Вот это зачем?

else begin

CNT_REG <= 24'd0;

CNT_OUT <= 24'd0;

 

И это не "айс":

... CNT_REG <= 24'd0;

end

else CNT_REG = CNT_REG + PLS;

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this