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

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

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

 

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

 

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

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

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

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

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

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

 

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

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

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


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

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

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

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

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


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

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

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

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

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

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

pulse <= 0;

pulse <= 1;

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

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

 

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


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

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

 

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

 

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

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

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


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

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

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

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

Удачи!

 

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


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

почему неправильно так делать

if(cnt > 0) pulse <= 1;

if(pulse) pulse <= 0;

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

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

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


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

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

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

 

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

YoaR4uWCE3c.jpg

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

PulseCnt.7z

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


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

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

......

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

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

 

x4xPodwrKpY.jpg

PulseCnt_v1.7z

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


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

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

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

 

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

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

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

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

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


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

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

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

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

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

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

 

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


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

Да, примерно так и надо действовать... Вот только здесь не "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

 

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


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

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

Скайп есть?

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


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

Нет.

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

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

 

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

else begin

CNT_REG <= 24'd0;

CNT_OUT <= 24'd0;

 

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

... CNT_REG <= 24'd0;

end

else CNT_REG = CNT_REG + PLS;

 

 

 

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


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

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

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

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

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

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

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

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

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

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