Видео в конце...
Назначение счетных устройств
Первое, для чего очень часто применяются элементы памяти это подсчет импульсов. В цифровых устройствах руками разработчика любое событие приводит к появлению импульса. Мы очень часто занимаемся тем, что производим их подсчет . Например, обрабатывая сигналы линий связи, мы точно знаем начиная с какого бита от начала пакета сообщения заложена необходимая нам информация. Чтобы правильно ее обработать необходимо просто посчитать количество бит, начиная от какого-то события.
Счетный триггер
Долгое время под счетными устройствами понимали так называемые T-триггеры. Это такие элементы памяти, у которых инверсный выход подключается к информационному входу.
Это дает триггеру очень нужное свойство. Каждый новый такт изменяет содержимое триггера на противоположное. Давайте разберемся как это связано с тем, что называют счетом. Рассмотрим его временную диаграмму.
Каждый возрастающий фронт тактового сигнала приводит к изменению состояния триггера на противоположное. Если представить, что мы имеем дело с однобитным числом, то происходит проход по двум его состояниям 0 и 1 с возвратом в начальное состояние 0. Это пока еще сложно представить как счет импульсов, нужны примеры с большим количеством триггеров. Однако, на этом этапе нужно четко увидеть одну особенность.
Частота следования импульсов на выходе счетного триггера в два раза ниже, чем частота импульсов на входе.
Теперь рассмотрим классический прямой счетчик, имеющий разрядность 3 бита. Его конструкция довольно проста.
Выход одного счетного триггера связан со входом следующего. Как мы помним, частоты импульсов уменьшаются в два раза с каждым новым триггером, добавленным в цепочку. Вроде ничего особенного, но стоит взглянуть на временную диаграмму, как все становится понятно. На нулевом разряде частота в два раза меньше, чем на входе, на первом еще в два раза меньше и на втором еще отмечаем двукратное уменьшение частоты. Теперь интерпретируем уровни выходов как разряды двоичного числа. Для удобства среда моделирования показывает нам состояние шины. Очевидно, что теперь мы точно имеем дело со счетом импульсов тактового сигнала.
Описание счетчиков на языке Verilog
В программируемых логических интегральных схемах (ПЛИС) логическим базисом является элементарная ячейка с LUT таблицей и триггером. Компилятор в каждой ситуации за нас сам решает как удобно проводить обратные связи к каждому триггеру через матрицу коммутации. Главное, чтобы написанное в исходном коде работало корректно. Существует довольно понятная языковая конструкция, образующая счетные устройства. Однобитный счетчик в виде отдельного модуля описывается следующим образом.
По переднему или заднему фронту тактового импульса происходит сложение содержимого счетчика с единицей. Если в описании будет разность, то получим обратный счет. То, что не задано начальное состояние совершенно не важно при работе на железе. Вне зависимости от начального состояния все равно мы получим последовательность из нулей и единиц и даже если счет будет обратным ничего не изменится. Однако, хороший тон требует указания начального состояния. По крайней мере, при моделировании не будет проблемы в виде неопределенного состояния.
Как моделируют?
Для моделирования подобных устройств, как уже было сказано. необходимо указать исходное значение содержимого триггера. Делается это в еще одной разновидности процедурного блока, которую мы уже рассматривали ранее при моделировании устройств. Такой блок начинается с ключевого слова initial. Перечень начальных состояний указывается в границах ключевых слов begin и end.
Все особенности модуля теста уже были рассмотрены ранее. Происходит включение в состав теста самого модуля (cnt1) и соединение его с проводами теста. В процедурном блоке always указываем непрерывно приходящий тактовый сигнал со временем переключения между уровнями. Не забываем указать начальное состояние тактовой линии. В итоге, получаем нужную временную диаграмму.
Увеличим разрядность счетчика. Описывается это очень просто. Нужно указать сколько разрядов нам необходимо и больше ничего.
Тут всего три разряда со старшего второго по младший нулевой. Синтез при этом выдает регистр из трех бит и 3-битный сумматор. Это, конечно, не похоже на классический счетчик в схемотехнике, но задачу свою выполняет на все 100%. Промоделируем его, не забывая про начальные состояния. С модулем теста никаких проблем не возникает, все как и раньше, только соблюдаем разрядность шин.
Такую временную диаграмму мы уже видели. Это прямой счет от нуля до семи и циклично с нуля далее.
Деление тактовой частоты
Теперь решим простейшую задачу создания мигающего светодиода. В схемотехнике это как программа «Привет мир!» у программистов. На отладочной плате находится кварцевый генератор тактовых импульсов. Его тактова частота (50 МГц) слишком большая для нашего восприятия, поэтому чтобы увидеть смену состояния на линии, нужно воспользоваться свойством счетчика делить частоты следования импульсов. Насколько уже известно, с каждым новым разрядом частота падает в два раза, поэтому нетрудно подсчитать какой разрядности счетчик подойдет.
По своей сути разрабатываемый модуль будет обычным счетчиком, только на выходе у него не будет числа, а только один провод, соединенный со светодиодом.
Объявляется регистр для хранения числа нужной разрядности, сразу соединяем старший разряд числа с выходом модуля при помощи непрерывного назначения assign. В процедурном блоке по переднему фронту тактового сигнала производим счет импульсов. Самый старший разряд этого счетчика поделит входную частоту до нужного нам значения.
Широтно-импульсная модуляция
При помощи счетчиков можно управлять устройствами через так называемую широтно импульсную модуляцию (ШИМ). Как мы уже знаем, в цифровых системах информация передается при помощи всего двух уровней напряжения, это логический 0 и логическая 1. Однако, если рассматривать несколько импульсов на каком-то периоде, то можно заметить, что ширина импульса влияет на величину переданной энергии, и эта величина пропорциональная времени воздействия.
Так при ширине импульса 10 процентов от периода сигнала, энергии будет передано 10 процентов от всего возможного количества. И если ширина импульса будет 90 процентов от периода сигнала, то и энергии будет передано 90 процентов от максимально возможного количества. Так как теперь мы имеем возможность считать приходящие импульсы, то не составляет труда результат счета использовать для изменения уровня выходного сигнала. Например, при 4-битном счетчике мы можем считать от 0 до 15. Причем, до определенной границы выходной сигнал можно держать высоким, а потом низким. Так будет происходить циклически. Положение границы можно регулировать.
Регистр Q и сумматор Add0 с обратной связью к регистру образуют счетчик. Далее содержимое счетчика поступает на два компаратора. Один сравнивает с порогом, другой сравнивает с нулевым значением. Как только счетчик достигает порогового значения, то один из мультиплексоров пропустит на вход триггера ноль. При достижении счетчиком величины ноль, единица поступает на вход триггера, проходя через первый мультиплексор. Выходная линия при этом модулируется шириной импульса. Для сравнения яркостей на другой выход отправляется постоянный логический ноль. На получившейся схеме все очень даже логично и понятно.
Эту схему можно усложнить, добавив изменяющийся порог. Это позволит плавно изменять яркость светодиода.
Описание модуля немного удлинилось и теперь умещается в две колонки. Это теперь не просто счетчик а система из двух счетчиков. Один, как и прежде, занимается модуляцией, другой медленно двигает порог. Под порог выделено пять бит, под задержку времени смены порога двадцать три бита. Зажигается на постоянное свечение один из светодиодов, счетчикам устанавливаются начальные значения. В процедурном блоке по переднему фронту тактового сигнала происходит увеличение счетчика Q на единицу. Если этот счетчик достигает своего максимального значения, то приподнимаем порог на единицу. Самые младшие биты счетчика отвечают за модуляцию на линии светодиода. Все что происходит далее, нам уже знакомо.
Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.