![]() |
![]() |
|||||||||||||||
Счетчик. Часть 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-разрядным счетчиком. Настолько неплохим, что его даже можно оформить как отдельный символ. Вот такой:
В следующий раз мы немного доработаем его: приделаем вход сброса, разрешения счета. Может быть сделаем параллельную загрузку… Короче, придумаем чего-нибудь… <<--Вспомним пройденное----Поехали дальше-->>
|
|
|||||||||||||||
![]() |
![]() |


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





