Счетчик. Часть 2. Проверяем на симуляторе, создаем символы.

Ну продолжаем, короче…
Как рисовать схему, вы уже знаете. Поэтому открываем наш прожект:
File>Open

Внизу окошка выбираем тип отрываемого файла - Graphic Editor files *.gdf
Выбираем из списка наш файл - counter.gdf. Жмем OK. Файл открывается.
На всякий случай, еще раз сделаем этот файл проектом - мало ли чего могло произойти со времени его последнего использования.
File>Project>Set Project to Current File
Теперь можно рисовать схему. Как рисовать - вы уже знаете. Должно получиться что-то типа вот:

Это и есть схема 4-разрядного счетчика. Она состоит из 4-х счетных триггеров, включенных последовательно.
Компилируем. Открываем Waveform editor, вытаскиваем на него все входы и выходы схемы.

В File>End Time…

устанавливаем Time = 10.0us. Это - время окончания графика.
Вам не знакома величина us? Это "микросекунда". Почему u? Да потому что буква "мю", которая обозначает у буржуев приставку "микро-", очень похожа на букву u. Поскольку "мю" на клаве нет - используют ее заменитель.
Не сильно увлекайтесь - берите всегда минимально необходимое время. Симулятор считает довольно медленно.
Едем дальше.
Генерим на входе CLK тактовую частоту, сохраняем файл под именем counter.snf, запускаем симулятор. Как симулятор все просимулирует, пересимулирует, высимулирует - смотрим график. Должно быть что-то вроде:

Ну, в принципе, очень даже неплохо. По графику четко прослеживается работа счетчика. И вроде бы, он работает как надо… Но! Давайте увеличим масштаб:

Посмотрите! Как вам это нравится? Все фронты, отмеченные красным (кроме первого), должны происходить в одно и то же время. Однако, мы видим совершенно обратное:
Фронт на Q0 отстает от фронта CLK на 2,5 нс.
Фронт на Q1 отстает от вронта Q0 ажно на 5 нс.
То же безобразие творится между фронтами Q1,Q2 и Q3.
Возникает резонный вопрос: кто виноват и что делать?
По порядку.
Кто виноват?
Виновата наша схема, а точнее - каскадное включение счетных триггеров.
Каждый триггер вносит свою задержку - в результате каскадного (последовательного) включения эти задержки суммируются. Вот если бы мы смогли сделать так чтобы все триггеры срабатывали одновременно…
Что делать?
Мы хотим, чтоб триггеры переключались одновременно? Хорошо. Значит - к черту счетный триггер. Делаем хитрее: рисуем вот такую схему:

Это - ни что иное, как 4-разрядный регистр параллельной загрузки. В момент фронта на тактовых входе clk, во все триггеры захлопываются логические уровни по входам D[3..0].
Происходит это совершенно одновременно. Вот график работы этой схемы:

На входы D[] совершенно от балды подаем какие-то значения и смотрим на выходы.
"Так а причем здесь счетчик?" - спросите вы.
"Адын мамэнт" - отвечу я.
Счетчик что делает? Считает! То есть, по каждому такту его значение увеличивается на 1. Иначе говоря, каждое последующее значение счетчика равно предыдущему+1, верно?
Гениально! Значит что мы сделаем. Мы нарисуем хитрющую схемулину, которая будет прибавлять единицу к 4-разрядному числу, и включим эту схему между выходом и входом регистра. Для начала составим таблицу истинности:
D[3210] Q[3210] 0 0000 | 0001 1 0001 | 0010 2 0010 | 0011 3 0011 | 0100 4 0100 | 0101 5 0101 | 0110 6 0110 | 0111 7 0111 | 1000 8 1000 | 1001 9 1001 | 1010 10 1010 | 1011 11 1011 | 1100 12 1100 | 1101 13 1101 | 1110 14 1110 | 1111 15 1111 | 0000 Теперь создадим новый графический файл - и приступим.
Смотрим в таблицу истинности.Что мы сразу видим? А вот что: младший разряд выхода (Q0) всегда противоположен младшему разряду входа (D0) - значит, смело ставим инвертор.

Если D0 равен 1, то на выходе меняется состояние Q1 на противоположное. Например, смотрим строчки 1, 3, 5 и т.д. Значит, юзаем элемент "исключающее ИЛИ". Вот его таблица истинности:
D[10]| Q -------- 00 | 0 01 | 1 10 | 1 11 | 0 Этот элемент можно назвать "управляемым инвертером". Когда на одном из его входов 1, он инвертирует состояние другого входа. Такое вот волшебство :)
В МаксПлюсе этот элемент зовут "xor". Дополняем схему:

Перенос на 2-й разряд происходит, когда 0-й и 1-й равны 1. Значит, придется использовать элемент "И". Он называется "and2". Почему "2"? Да потому что - два входа. есть and3 - у нее 3 входа. И так далее…
Продолжаем наши художества:

Ну, что нужно для обработки 3-го разряда, думаю, и так ясно.

Все! Теперь мы можем оформить эту схему как отдельный элемент.
Делаем раз: сохраняем файл со схемой. Пусть его зовут increment.gdf.
Теперь делаем два: File>Create Default Symbol.
Делаем три: открываем схему регистра, которую мы нарисовали в начале сегодняшней беседы. Тыкаемся два раза по пустому месту - появляется окошко:

Из списка Symbol Files выбираем только что созданный символ. И вот он, такой молодой и красивый, появляется на нашей схеме:

Гармонично дополняем им наше произведение:

Проверяем на симуляторе:

Это - в общем виде. Похоже? Похоже!
Увеличиваем масштаб:

Красота! Задержка после тактового сигнала осталась, остальные - исчезли без следа :)
Теперь это уже можно назвать неплохим 4-разрядным счетчиком. Настолько неплохим, что его даже можно оформить как отдельный символ. Вот такой:

В следующий раз мы немного доработаем его: приделаем вход сброса, разрешения счета. Может быть сделаем параллельную загрузку… Короче, придумаем чего-нибудь…






Рекомендуемый контент




Copyright © 2010-2019 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.