dummy 0 14 июля, 2016 Опубликовано 14 июля, 2016 (изменено) · Жалоба Совершенно не "адекватен"!!! Даже идейно вреден... Ставим автомат и таймер если нужно, только так... Автомат выдает "одиночный импульс", и на следующих тактах продолжает "длительного процесса"... Длительность которого задается таймером... А зачем так сложно? Чем плох rs-триггер с самосбросом? Подход адекватен, код неадекватен. Надо учитывать, что в always-блоках все операторы выполняются последовательно. Сам так пишу (без "else"): pulse <= 0; if(cnt == 0) pulse <= 1; Второй оператор "отменяет" первый при выполнении условия "cnt == 0". Условие "if(pulse)" - лишнее. Что-то я сомневаюсь что данный код будет работать, т.к. все операторы присвоения же (внутри веток if'ов) выполняются параллельно. Т.е., грубо говоря, одномоментно при доходе счетчика до нуля будет попытка установки и в единицу и в ноль, не говоря уже о том что присвоение нуля выполняется всегда безусловно. Изменено 14 июля, 2016 пользователем dmy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 14 июля, 2016 Опубликовано 14 июля, 2016 · Жалоба А зачем так сложно? Чем плох rs-триггер с самосбросом? Мне доводилось "писать программы", втыкая в машину штырьки с дырочками, потом были программы в машинных кодах, потом на ассемблере, потом, Бэйсик, Форт, Си и т.д. А Вы как ведете проект в ПЛИС, на каком уровне? На уровне триггеров или на уровне "процессов"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 14 июля, 2016 Опубликовано 14 июля, 2016 · Жалоба Т.е., грубо говоря, одномоментно при доходе счетчика до нуля будет попытка установки и в единицу и в ноль, не говоря уже о том что присвоение нуля выполняется всегда безусловно. Нет. Можно так рассуждать: все операторы одного always-блока последовательно просматриваются, и потом выполняются все последние присваивания. Поэтому в коде: pulse <= 0; pulse <= 1; первый оператор будет проигноирован, и всегда выполняться только второй. А если есть условия, то в зависимости от выполнения этих условий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dummy 0 14 июля, 2016 Опубликовано 14 июля, 2016 (изменено) · Жалоба А Вы как ведете проект в ПЛИС, на каком уровне? На уровне триггеров или на уровне "процессов"? Я оперирую модулями (module), автоматами и их состояниями (fsm), блоками (always), регистрами (триггерами, reg), сигналами (wire), последовательностями сигналов (во времени). Конечно, код не рисуется, а пишется, но мы же понимаем во что это все выльется в итоге - все синтезируется именно в триггера с логикой вокруг них. Процесс в моем видении - это последовательность переключений триггеров во времени по заданной мною схеме (алгоритму). Грубо говоря, когда пишу код, то вижу перед собой не программу, а rtl-схему. Вот, например, я предпочитаю делать импульсы так как писал выше. Но вижу что уважаемые люди делают иначе и вроде даже против предложенного мной подхода. Хочется понять почему неправильно так делать, докопаться до самых низов. Если, конечно, это не дело исключительно вкуса, цвета, стиля написания кода и удобства его чтения/сопровождения. Изменено 14 июля, 2016 пользователем dmy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 14 июля, 2016 Опубликовано 14 июля, 2016 · Жалоба Но вижу что уважаемые люди делают иначе и вроде даже против предложенного мной подхода. Хочется понять почему неправильно так делать, докопаться до самых низов. Если, конечно, это не дело исключительно вкуса, цвета, стиля написания кода и удобства его чтения/сопровождения. Завтра с 11 до 12 у меня есть время на разговоры... По скайпу... Ну и статьи мои можете почитать... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 14 июля, 2016 Опубликовано 14 июля, 2016 (изменено) · Жалоба почему неправильно так делать if(cnt > 0) pulse <= 1; if(pulse) pulse <= 0; Все время, пока (cnt > 0), будет генерироваться меандр, тк после " pulse <= 0" снова выполнится "pulse <= 1" в следующем такте. Изменено 14 июля, 2016 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dummy 0 15 июля, 2016 Опубликовано 15 июля, 2016 (изменено) · Жалоба . Изменено 15 июля, 2016 пользователем dmy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
druzhin 4 18 июля, 2016 Опубликовано 18 июля, 2016 · Жалоба На самом деле все, что происходит внутри ПЛИС и должно делаться по "укороченным импульсам". Так что никаких "лишних" затрат и не будет... Скорее всего дело в том, что Вы не умеете применять автоматы. С автоматами все дело значительно упрощается... Могу рассказать по скайпу. Вот как надо на автомате В прикрепленном архиве весь проект, тестбенч, синтез. PulseCnt.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
druzhin 4 19 июля, 2016 Опубликовано 19 июля, 2016 · Жалоба Вот как надо на автомате ...... Вот так можно тоже, с немного не каноническим выходом автомата не по состоянию, а по входу в состояние. Автомат получился вырожденный, Symplify этот автомат привел к одному триггеру. Оба варианта занимают одинаково 10 триггреров для 8-разрядного счетчика импульсов, более простой автомат имеет более сложную дешифрацию выходов. PulseCnt_v1.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rmods 0 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба На самом деле все, что происходит внутри ПЛИС и должно делаться по "укороченным импульсам". Так что никаких "лишних" затрат и не будет... Скорее всего дело в том, что Вы не умеете применять автоматы. С автоматами все дело значительно упрощается... Здравствуйте. Можно по-подробнее, на первом состоянии автомата устанавливаем управляющий сигнал, при следующем состоянии сбрасываем? А далее управляющий сигнал идёт непосредственно на счётчик, напр: CNT_REG <= CNT_REG + PLS_SIG. Так-же и для делителей частоты, не нужно генерировать сигнал со скважностью 50%, достаточно ширины в один такт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Здравствуйте. Можно по-подробнее, на первом состоянии автомата устанавливаем управляющий сигнал, при следующем состоянии сбрасываем? А далее управляющий сигнал идёт непосредственно на счётчик, напр: CNT_REG <= CNT_REG + PLS_SIG. Так-же и для делителей частоты, не нужно генерировать сигнал со скважностью 50%, достаточно ширины в один такт? Да, примерно так и надо действовать... Вот только здесь не "CNT_REG <= CNT_REG + PLS_SIG", а просто у всех триггеров и регистров должен быть сигнал разрешения... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rmods 0 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Да, примерно так и надо действовать... Вот только здесь не "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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Что-то я совсем запутался, пожалуйста покритикуйте мой счётчик: Скайп есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rmods 0 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Скайп есть? Нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 5 сентября, 2016 Опубликовано 5 сентября, 2016 · Жалоба Нет. Ну и как Вам все объяснять? Ведь все эти ENB, LATCH, PLS не прокомментированы... Вот это зачем? else begin CNT_REG <= 24'd0; CNT_OUT <= 24'd0; И это не "айс": ... CNT_REG <= 24'd0; end else CNT_REG = CNT_REG + PLS; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться