Последовательностная логика. Счетчики
module counter ( input wire C, // синхросигнал input wire reset, // сигнал сброса output reg [3:0] Q // 4-разрядный счетчик ); always @(posedge C or posedge reset) begin if (reset) begin Q <= 4'b0000; //сброс счетчика end else begin Q <= Q + 1; //инкремент end end endmoduleЛистинг 5.1.
`timescale 1ns / 1ps module testbench; reg C; // регистровая переменная для тактового сигнала reg reset; // регистровая переменная для сигнала сброса wire [3:0] Q; // подключение выхода счетчика // инициализация счетчика counter uut ( .C(C), .reset(reset), .Q(Q) ); // генерация синхросигнала initial begin C = 0; forever #5 C = ~C; // ререключение каждый 5 нс end // тестирование счетчика initial begin // сброс счетчика reset = 1; #10; reset = 0; // ожидание счета #100; // вывод текущего значения счетчика $display("Final Count: %b", Q); // завершение симуляции $finish; end endmoduleЛистинг 5.2.
Групповой перенос в счетчиках обеспечивается введением в схему конъюкторов (элементов "И"). Причем разрядность данных элементов растет от младшего триггера к страшему. Реализуем синхронный счетчик с групповым переносом. В основе счетчика лежат JK-триггеры. В синхронном счетчике все синхроводы триггеров будут объеденены синхросигралом, а счетный режим будет обеспечен групповым переносом. На рисунке 5.5 приведена схема синхронного суммирующего счетчика с групповым переносом. Для управления старшим триггером D4 применяется четырехвходовый элемент "И". На схеме добавлен выход переполнения (переноса) СО. Данный выход объединяет все выходы триггеров и сигнализирует о достижении счетчиков предельного значения. Исходя из того, что для группового переноса применяется комбинационная логика, которая усложняется с каждым следующим разрядом, то для увеличения разрядности счетчиков применяется их каскадное включение. На рисунке 5.6 приведен собранный в модуль верхнего уровня счетчик, а также диаграмма его переключений.
Реверсивный счетчик позволяет осуществлять счет, суммируя или вычитая текущее состояние. Данный функционал обеспечивается вводом дополнительных входов управления. Для управления переключениями используется коммутационная схема, аналогичная применяемой в сдвиговых регистрах.
На примере трехразрядного асинхронного счетчика с модулем счета 8 будет рассмотрена организация реверсивного счета. В зависимости от варианта организации связи выходов младших триггеров (прямой или инверсный) со счётными входами старших триггеров будет зависеть направление счета. Коммутируя данные выходы, организуется управление реверсом. Дополнительно в проектируемый счетчик будет введен общий сброс схемы и вход управления счетом (разрешение/запрет работы счетчика). На рисунке 5.7 приведена функциональная схема счетчика. На схеме входы и выходы имеют следующие обозначения:
- R - reset, асинхронный сброс счетчика, активный уровень лог. &1 &;
- С - clock, синхровход, срабатывание по переднему фронту;
- Cu - count up, вход управления суммирующим счетом, лог. &1 &;
- Cd - count down, вход управления вычитающим счетом лог. &1 &;
- EN - enable вход управления работой счетчика. При лог. &0 & счетчик не работает, так как на объединенных входах JK всех триггеров присутствует лог. &0 &. При лог. &1 & счетчик осуществляет счет.
- Q0-Q2 - выходы данных.
Реализуем условное графическое обозначение, спроектированного счетчика, подключим к нему осциллограф и проанализируем работу. На рисунке 5.8 приведена схема моделирования различных режимом работы счетчика. В таблице 5.3 приведена таблица работы, построенная по данным осциллограммы.