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

Схемотехнические трюки для ПЛИСоводов

Если число делится на 2, у него только одна единица среди битов. 4-входовая LUT выдает 1 для чисел 0001, 0010, 0100, 1000. Следующая такая же LUT принимает 4 выхода с предыдущего слоя, и т.д. Красота.

Так просто не выйдет, если, например, взять числа 1000 0000 и 1000 0110, на выходе нижнего слоя различий не будет, получим ложное срабатывание. Поэтому требуется два бита с каждой группы нижнего слоя. И формулировка задачи не "число делится на два", а "число является степенью двойки":).

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


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

Так просто не выйдет, если, например, взять числа 1000 0000 и 1000 0110, на выходе нижнего слоя различий не будет, получим ложное срабатывание. Поэтому требуется два бита с каждой группы нижнего слоя. И формулировка задачи не "число делится на два", а "число является степенью двойки":).

Да, степенью двойки, конечно. Я неправильно выразился.

Да, не получается. :crying:

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


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

Дайте подсказку как лучше организовать отсчёт нужного количества тактов.

Пример: есть автомат который должен находиться в одном из состояний определённое количество тактов, например: Из состояния S3 автомат переходит в состояние S4, там находится 2 такта, а на третий такт переходит в следующее состояние S5. Как это правильнее реализовать. На счетчике, или на сдвиговом регистре ?

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


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

Дайте подсказку как лучше организовать отсчёт нужного количества тактов.

Пример: есть автомат который должен находиться в одном из состояний определённое количество тактов, например: Из состояния S3 автомат переходит в состояние S4, там находится 2 такта, а на третий такт переходит в следующее состояние S5. Как это правильнее реализовать. На счетчике, или на сдвиговом регистре ?

можно на каждом состоянии загружать декрементирующий счетчик начальным значением и считать до нуля

 

reg_cnt <= reg_cnt - std_logic_vector(to_unsigned(1, reg_cnt 'length)));

 

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

 

upd

процесс счетчика (отдельный) примерно такой:

 

Process (all)
begin
if rst = '1' then
reg_cnt <= (OTHERS => '0');  
elsif clk='1' and clk'event then
if reg_cnt =  std_logic_vector(to_unsigned(0, cnt 'length))) then 
   reg_cnt <= load_cnt;  
  else
   reg_cnt <= reg_cnt -  std_logic_vector(to_unsigned(1, cnt 'length)));
end if;
end if;
end process;

 

в состояниях автомата присваиваете load_cnt необходимое значение и счетчик начинает отсчет... Как-то так

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


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

http://www.iconfs.net/en/w.infocom2016/met...osuvannyam-vhdl

 

Методика проектування цифрових фільтрів з застосуванням VHDL

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


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

Понравилась идея борьбы с дребезгом на дискретных входах на ресурсе http://embedders.org/blog/gdi/debouncing.html

 

Попробовал для усвоения и показалось интересным. Оказалось задержка не 3 тика, а 4. Даю вместе с бенчем.

drebezg.zip

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


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

Понравилась идея борьбы с дребезгом на дискретных входах на ресурсе http://embedders.org/blog/gdi/debouncing.html

 

Попробовал для усвоения и показалось интересным. Оказалось задержка не 3 тика, а 4. Даю вместе с бенчем.

Какая практическая польза от применения такого антидребезга в FPGA ?

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


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

Какая практическая польза от применения такого антидребезга в FPGA ?

Прямая...

При сборе информации с дискретных входов я обычно делал "в лоб". Это усложняло архитектуру(хранение счетчиков(предистория) по числу входных разрядов). Тут на порядок проще и экономит ресурс.

 

Странный вопрос

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


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

Прямая...

При сборе информации с дискретных входов я обычно делал "в лоб". Это усложняло архитектуру(хранение счетчиков(предистория) по числу входных разрядов). Тут на порядок проще и экономит ресурс.

 

Странный вопрос

На самом деле немного не так...

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

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

 

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


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

На самом деле немного не так...

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

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

Так это как раз мой случай. Я ведь принимаю непрерывно про SPI больше сотни входов. Это порождает громоздкие постороения на счетчиках для дальнейшего учета в память.(это уже доступно внешнему процессору) Тут решается красивее.

 

Тут только фильтр. Простой и понятный. Для расширение разрядности счетчиков нужно добавлять дополнительные регистры. 2**N

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


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

можно на каждом состоянии загружать декрементирующий счетчик начальным значением и считать до нуля

 

reg_cnt <= reg_cnt - std_logic_vector(to_unsigned(1, reg_cnt 'length)));

 

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

 

upd

процесс счетчика (отдельный) примерно такой:

 

....

 

в состояниях автомата присваиваете load_cnt необходимое значение и счетчик начинает отсчет... Как-то так

 

Добрый день! Интересно, почему часто применяется отсчет счетчиком до нуля и загрузка в него каких-то начальных значений. Почему просто не обнулять счетчик и не считать до требуемой величины? Например:

 

reg [7:0] cnt;

always@(posedge iclk) begin
  if (rst)               cnt <= '0;
  else if (~&cnt)    cnt <= cnt + 1'b1;
end

always_comb begin
  strb0 = cnt == 10;
  strb1 = cnt == 12;
  ...
end

 

Стробы strb0,1... можно использовать для переход МКС. Rst = strb0||strb1... ну или в состояниях МКС описать.

 

На мой взгляд, гораздо логичнее выглядит. Отсчет от Н до нуля - это вопрос предпочтений? Или есть какое-то обоснование, почему так лучше?

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


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

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

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


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

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

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

 

Другой вопрос, если нам надо например одним счетчиком отсчитывать разные интервалы. Например:

Счетчик досчитал до 10 - что-то делаем, и сбрасываем счетчик.

Счетчик досчитал до 15 - что-то делаем, и сбрасываем счетчик.

Счетчик досчитал до 18 - что-то делаем, и сбрасываем счетчик.

Счетчик досчитал до 24 - что-то делаем, и сбрасываем счетчик.

Счетчик досчитал до 32 - что-то делаем, и сбрасываем счетчик.

В этом случае у нас будет несколько схем сравнения с 10, 15, 18, 24, 32 - что собственно совсем не хорошо.

В случае если счетчик считает до 0 у нас будет только 1 схема сравнения с нулем.

Изменено пользователем Flip-fl0p

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


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

Сравнение с нулём - это простое ИЛИ всех битов счётчика.

 

Сравнение с каким-то числом - это сначала XOR с заданным значением, после чего уже ИЛИ всех битов результата.

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

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


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

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

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

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

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

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

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

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

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

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