Например TDA7294

РадиоКот >Обучалка >Микроконтроллеры и ПЛИС >Программируемая логика Altera - первые шаги >

Теги статьи: Добавить тег

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

Автор:
Опубликовано 01.01.1970

Ну продолжаем, короче…

Как рисовать схему, вы уже знаете. Поэтому открываем наш прожект:
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-разрядным счетчиком. Настолько неплохим, что его даже можно оформить как отдельный символ. Вот такой:


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

<<--Вспомним пройденное----Поехали дальше-->>




Как вам эта статья?

Заработало ли это устройство у вас?

10 0 0
2 0 1