![]() |
![]() |
|||||||||||||||
Счетчик. Часть 2. Проверяем на симуляторе, создаем символы.
Автор: Ну продолжаем, короче…
Как рисовать схему, вы уже знаете. Поэтому открываем наш прожект: ![]()
Внизу окошка выбираем тип отрываемого файла - Graphic Editor files *.gdf
На всякий случай, еще раз сделаем этот файл проектом - мало ли чего могло произойти со времени его последнего использования.
Теперь можно рисовать схему. Как рисовать - вы уже знаете. Должно получиться что-то типа вот: ![]()
Это и есть схема 4-разрядного счетчика. Она состоит из 4-х счетных триггеров, включенных последовательно. ![]()
В File>End Time… ![]() устанавливаем Time = 10.0us. Это - время окончания графика. Вам не знакома величина us? Это "микросекунда". Почему u? Да потому что буква "мю", которая обозначает у буржуев приставку "микро-", очень похожа на букву u. Поскольку "мю" на клаве нет - используют ее заменитель. Не сильно увлекайтесь - берите всегда минимально необходимое время. Симулятор считает довольно медленно.
Едем дальше. ![]() Ну, в принципе, очень даже неплохо. По графику четко прослеживается работа счетчика. И вроде бы, он работает как надо… Но! Давайте увеличим масштаб: ![]()
Посмотрите! Как вам это нравится? Все фронты, отмеченные красным (кроме первого),
должны происходить в одно и то же время. Однако, мы видим совершенно обратное: Возникает резонный вопрос: кто виноват и что делать?
По порядку.
Виновата наша схема, а точнее - каскадное включение счетных триггеров. Что делать? Мы хотим, чтоб триггеры переключались одновременно? Хорошо. Значит - к черту счетный триггер. Делаем хитрее: рисуем вот такую схему: ![]()
Это - ни что иное, как 4-разрядный регистр параллельной загрузки.
В момент фронта на тактовых входе clk, во все триггеры захлопываются логические уровни по входам D[3..0]. ![]() На входы D[] совершенно от балды подаем какие-то значения и смотрим на выходы.
"Так а причем здесь счетчик?" - спросите вы.
Счетчик что делает? Считает!
То есть, по каждому такту его значение увеличивается на 1.
Иначе говоря, каждое последующее значение счетчика равно предыдущему+1, верно? 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, он инвертирует состояние другого входа. Такое вот волшебство :) ![]()
Перенос на 2-й разряд происходит, когда 0-й и 1-й равны 1.
Значит, придется использовать элемент "И". Он называется "and2". Почему "2"?
Да потому что - два входа. есть and3 - у нее 3 входа. И так далее… ![]() Ну, что нужно для обработки 3-го разряда, думаю, и так ясно. ![]() Все! Теперь мы можем оформить эту схему как отдельный элемент.
Делаем раз: сохраняем файл со схемой. Пусть его зовут increment.gdf. ![]() Из списка Symbol Files выбираем только что созданный символ. И вот он, такой молодой и красивый, появляется на нашей схеме: ![]() Гармонично дополняем им наше произведение: ![]() Проверяем на симуляторе: ![]()
Это - в общем виде. Похоже? Похоже! ![]() Красота! Задержка после тактового сигнала осталась, остальные - исчезли без следа :) Теперь это уже можно назвать неплохим 4-разрядным счетчиком. Настолько неплохим, что его даже можно оформить как отдельный символ. Вот такой: ![]() В следующий раз мы немного доработаем его: приделаем вход сброса, разрешения счета. Может быть сделаем параллельную загрузку… Короче, придумаем чего-нибудь… <<--Вспомним пройденное----Поехали дальше-->>
|
|
|||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |