Вы находитесь на странице: 1из 33

ГЛАВА 3

Функциональные узлы комбинационного типа

3.1. Мультиплексоры
Мультиплексором называется цифровой переключатель (коммутатор),
который осуществляет передачу на выход данных, поступающих от одного из n
входных источников.

Input 0
Код на адресных входах определяет, какой из входов данных коммутируется на выход
Input 1
Output

Input N-1

Address inputs
(select)
Рис. 3.1. Объяснение работы мультиплексора
На рис.3.2 приведено условное обозначение мультиплексора (multiplexer).
D0 MUX
D1 D0, D1… Dn-1 – информационные входы мультиплексора,
А0 … Аs-1 - адресные входы мультиплексора.
Dn-1 Y s = log2 n - число адресных входов.
А0
A1

Аs-1

Рис. 3.2. Условное обозначение мультиплексора

53
3.1.1. Мультиплексор 2:1
Мультиплексор 2:1 из двух входных источников данных выбирает один и
передает его данные на выход.
S
MUX
D0
D0 D0 0
D1
D1 Y Y
S D1 1

Рис. 3.3. Графические обозначения мультиплексора 2:1.


Таблица истинности мультиплексора 2:1
Табл. 3.1
S D0
D0 D1 Y
0 0 x 0
0 1S x 1 Y
1 x 0 0
D1
1 x 1 1
Рис. 3.4. Логическая схема и условное
обозначение мультиплексора 2:1

Функция, реализуемая мультиплексором: Y=SD0 + SD1


Описание мультиплексора 2-1 на Verilog
module mux2_1(d0,d1,s,y);
input do,d1,s ;
output y;
assign y=s?d1:d0; //conditional operator
endmodule

3.1.2. Мультиплексор 4:1 со входом разрешения (Enable)


Мультиплексор 4:1 реализует следующую функцию:
Y = En(D0A1A0 + D1A1A0 +D2A1A0 +D3A1A0)

54
D0 MUX
D1
D2 Y
D3

A0
A1
En

Рис. 3.5. Условное обозначение мультиплексора


Табл. 3.2
En D0 D1 D2 D3 A1 A0 Y
0 x x x x x x 0
1 0 x x x 0 0 0
1 1 x x x 0 0 1
1 x 0 x x 0 1 0
1 x 1 x x 0 1 1
1 x x 0 x 1 0 0
1 x x 1 x 1 0 0
1 x x x 0 1 1 0
1 x x x 1 1 1 1

Схема мультиплексора 4:1 со входом разрешения представлена на рис.3.6.


En
D0

D1

Y
D2

D3

А1

А0
Рис. 3.6. Логическая схема мультиплексора 4:1.

3.1.3. Примеры описания мультиплексоров на Verilog

55
Пример 3.1. Структурное (Dataflow) описание мультиплексора 4:1 с
использованием логических операторов
module multiplexer4_1(y,d0,d1,d2,d3,a0,a1,en);
output y;
input en,d0,d1,d2,d3,a0,a1;
// continuos assignment
assign y=en&((d0&~a0&~a1)|d1&a0&~a1)|d2&~a0&a1)|
d3&a0&a1));
endmodule

Первая строка – описание модуля. Ключевое слово module – используется


вместе с именем модуля, по которому осуществляется ссылка на модуль. В
скобках приведен список портов: вначале перечисляются выходы, потом –
входы (может быть любая последовательность портов). Следующие две
строки – объявление портов.
В описании использован оператор непрерывного присвоения assign.
Приемником (переменная слева от знака равенства) может быть только
переменная типа net. Присвоение переменной в левой части оператора
происходит при любом изменении любой переменной, присутствующей в
правой части оператора. ∎
Пример 3.2. Описание мультиплексора 4:1 (без входа разрешения en)
module multiplexer4_1(y,d0,d1,d2,d3,a0,a1);
output y;
input d0,d1,d2,d3,a0,a1;
assign y = a0?(a1?in3:in1):(a1?in2:in0);//conditional
//operator
endmodule

Пример 3.3. Описание мультиплексора 4:1 со входом enable (en)


module multiplexer4_1(y,d0,d1,d2,d3,a0,a1,en);
output y;
input d0,d1,d2,d3, a0, a1;
assign y=en?(a0?(a1?in3:in1):(a1?in2:in0)):1’b0;
//conditional operator
endmodule

Пример 3.4
Описание мультиплексора 4:1 со входом enable с использованием оператора
if-then.
Входные данные data представлены в виде 4-битного вектора, адресные
входы – в виде 2-битного вектора a.

56
Отличие данного описания от предыдущего – использование процедурного
блока always.
Если процедурный (или последовательный) блок содержит несколько
операторов, то они заключается между символами begin и end. Если
используется один оператор, то ключевые слова begin и end можно не
использовать.
Переменные, которым делаются присвоения в процедурном блоке, должны
быть описаны как регистровые (reg). Поэтому выход out определен как
регистр (reg). Такое назначение называется процедурным назначением
(procedural assignment).
Данные типа wire не могут быть назначены явно. Используется оператор
assign – такое назначение называется непрерывным назначением
(continuous assignment).
module multiplexer4_1(y,data,а,en);
input [0:3] data;
input [1:0] a;
input en;
output y;
reg y;
always @(data or a or en)
if (en)
if(a==2’b00) y=data[0];// procedural assignments
else if (a==2’b01)
y=data[1];
else if(a==2’b10)
y=data[2];
else y=data[3];
else y=1’b0;
endmodule

После декларации переменных следует конструкция always. При


изменении хотя бы одного операнда (система их постоянно отслеживает)
выполняется последовательность операторов процедурного блока.
Список переменных называется списком чувствительности (sensitivity list).
В общем случае, структура always блока может быть представлена
следующим образом: В данном случае предполагается, что входные данные
data поступают от одного источника.

always @(sensitivity_list)
[begin]
[procedural assignments]
[if-else statements]
[case statements]
[while, repeat, and for loops]
[task and function calls]
[end]
57

Пример 3.5
Описание мультиплексора 4:1 со входом enable с использованием оператора
case.
В данном описании (пример 3.5) использован оператор case. Условием
является конкатенация или объединение а1 и а0 в двухразрядный код.
Варианты выбора описаны как двухбитные двоичные числа: 2’b00, 2’b01,
2’b10, 2’b11. Завершает операцию выбора ключевое слово endcase.

module multiplexer4_1(y, data, а, en);


input [0:3] data;
input [1:0] a;
input en;
output y;
reg y;
always @(data or a or en)
if (en)
case (a)
2’b00: y=data[0];
2’b01: y=data[1];
2’b10: y=data[2];
2’b11: y=data[3];
endcase
else
y=4’d0;
endmodule


3.1.4. Тестовый модуль
Тестовый модуль (test bench module) представляет собой программу
моделирования заданного в основном модуле устройства.
Данный модуль обеспечивает подачу тестовых сигналов на основной модуль
(мультиплексор в данном случае). Он является модулем верхнего уровня
иерархии, поэтому в его описании отсутствует список портов.
Так как testbench должен обеспечить подачу сигналов на входы тестируемого
устройства, они должны быть декларированы, как регистровые (reg), а выходы
устройства должны быть декларированы как wire.
Эта величина сохраняется до тех пор, пока не сделано новое назначение.
Переменная типа цепь управляется каким-либо источником сигнала
(драйвером). Если драйвер имеет какое-нибудь значение, то и цепь принимает
это значение.
multiplexer4_1 mux (y, d0, d1, d2, d3, a0, a1,en);
58
В этой строке происходит обращение к тестируемому модулю. Список
портов (in order port list в данном случае) устанавливает соответствие между
сигналами тестового и тестируемого модулей. Порядок переменных в списке
портов должен соответствовать их порядку в тестовом модуле (сопоставление
портов по порядку).
(для примера 3.3)

module stimulus;
//Declare variables to be connected to inputs
reg en,d0,d1,d2,d3,a1,a0;
// Declare output wire
wire y;
// Instantiate the multiplexer
multiplexer4_1 mux (y,d0,d1,d2,d3,a0,a1,en);
// Stimulate the inputs
initial begin
// Set inputs
en=0; d0=0; d1=1; d2=1; d3=0;a1=0; a0=0;
#10 en=1; // choose d0
#10 a0=1; // choose d1
#10 a1=1; a0=0; //choose d2
#20 a0=1; //choose d3
#10 en=0;
#20 $finish //terminate the simulation
end
endmodule

Оператор initial является процедурным оператором. Запускается к


исполнению только один раз либо при задании начальных состояний в
моделируемом устройстве, либо для описания (назначения) сигналов в
программе моделирования, поведение которых предопределено сценарием
отладки по всей длине теста. initial begin ……. end
Последовательность операторов заключается в операторные скобки (между
begin и end ).
Перед операцией присваивания в вышерассмотренном примере используется
префикс времени #. После данного символа записывается число, имя
переменной времени или выражение.
В данном примере префикс времени используется в процедурном операторе.
Оператор присвоения в последовательности операторов, записанный после
префикса времени (# 10, например), выполняется через 10 единиц модельного
времени после предыдущего оператора.
Префикс времени перед словом begin, открывающим последовательный блок,
означает задержку начала выполнения этого блока.

59
3.1.5. Синтез логических функций с использованием
мультиплексоров
Мультиплексор является универсальным логическим элементом.
Пусть мультиплексор имеет 2 k информационных входов и k управляющих
входов. В зависимости от комбинации значений сигналов на адресных
(управляющих) входах в мультиплексоре осуществляется передача сигналов от
одного из информационных входов на выход мультиплексора.
Функция, реализуемая мультиплексором, на управляющие входы которого
Ak-1, Ak-2, …,A1,A0 подаются соответственно булевы переменные x k-1, xk-2, …x1,x0,
а на информационные входы переменные d0, d1, …. d2 k-1, выражается
следующим образом:
Y= d0x0x1 … xk-2 xk-1 + d1 x0x1 …xk-2xk-1 + … + d2k-1x0x1 ... xk-2xk-1
Подставляя вместо d0, d1 . . .d2k-1 различные комбинации 1 и 0, можно
получить СДНФ любой булевой функции от k аргументов.

Пример 3.6
Задана функция от трех аргументов (Табл.3.3):

Табл.3.3
x1 x2 x3 Y
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

Требуется реализовать заданную функцию на мультиплексоре 8:1,


графическое изображение которого приведено на рис. 3.7.
“1” “0”
D0 MUX
D1
D2
D3
D4
Y Y
D5
D6
D7
x3 A0
x2 A1
x1 A2
60
Рис. 3.7. Реализация функции от трех переменных на мультиплексоре 8:1.
На входы A2, A1, A0 подаются переменные x1,x2,x3, а на входы D0, D1, …D7
- значения функций d0, d1, …d7 на соответствующих наборах. Тогда
функция, реализуемая мультиплексором, выражается следующим образом:
Y = d0x1x2x3 + d1x1x2x3 + d2x1x2x3 + d3x1x2x3 +d4x1x2x3 +
+ d5x1x2x3 + d6x1x2x3 + d7x1x2x3.
Если подставить d0=f(0,0,0), d1=f(0,0,1), d2=f(0,1,0), d3= f(0,1,1), d4=f(1,0,0),
d5=f(1,0,1), d6=f(1,1,0), d7=f(1,1,1), то данное выражение будет разложением
функции по трем переменным (разложение Шеннона).
Таким образом, для реализации функции от n переменных на основе
мультиплексора, имеющего n адресных входов, на информационные входы
подаются константы “0” и “1”.
В общем случае, при реализации функции на мультиплексоре с числом
адресных входов k<n , на информационные входы мультиплексора D0, D1,
…, D2k-1 подаются функции от n-k переменных, являющиеся кофакторами
(коэффициентами в разложении Шеннона) функции f(x1,x2,…xn) на наборах
из k переменных от 00…0 (k нулей) до 11…1 (k единиц).
d0 - f(0,0,…0, xk+1, …xn)
d1 – f(0,…0,1, xk+1, …xn)
...
d 2k-1 – f(1,1,…1,xk+1,…xn) ∎

Пример 3.7
Реализация функции (табл. 3.4) на мультиплексоре 4:1.На адресные входы
мультиплексора 4-1 подаются переменные x1,x2, на информационные
входы – функции от x3, константы “0” и “1”.
Табл.3.4 x3 D0 MUX
x1 x2 x3 Y D1
0 0 0 1 D2 Y Y
0 0 1 0 D0=x3 “1” D3
0 1 0 0
x2 A0
0 1 1 1 D1=x3 x1 A1
1 0 0 0 “1” En
1 0 1 1 D2= x3
1 1 0 1
1 1 1 1 D3 = 1
Рис. 3.8. Реализация функции от трех
переменных на мультиплексоре

61
3.1.6. Расширение мультиплексоров
Иногда требуется построить схему мультиплексора, имеющего намного
большее число входов, чем серийно выпускаемые мультиплексоры. В этом
случае используют пирамидальные структуры мультиплексоров.
Рассмотрим построение мультиплексора 16:1 на основе мультиплексоров 4:1.
Потребуется 16/4=4 мультиплексора в первом ярусе и один мультиплексор во
втором ярусе.
D0, D1, … ,D15 – информационные входы мультиплексора, A3, A2, A1, A0 –
адресные входы мультиплексора. F – выход мультиплексора 16 :1.
Схема мультиплексора представлена на рис. 3.9. Два младших разряда адреса
A1 и A0 поступают на мультиплексoры первого яруса, a старшие разряды – на
мультиплексор второго яруса. Таблица 3.5 поясняет работу схемы.
Табл.3.5
А3 А2 F
0 0 MUX0 D0, D1,D2,D3
0 1 MUX1 D4, D5,D6,D7
1 0 MUX3 D8, D9, D10,D11
1 1 MUX4 D12,D13 D14,D15

62
D0 D0 MUX
D1 D1
D2 MUX0
D2 Y
D3 D3
А0 A0
А1 A1

D0 MUX
D4
D5 D1
D6 D2 MUX1
Y
D7 D3
A0 D0
A1 D1
D2 D3 F
Y
A0
D8 D0 MUX А2 A1
D9 D1 А3
D10 D2
D11 D3 Y
MUX2
A0
A1

D12 D0 MUX
D13 D1
D14 D2 MUX3
D15 D3 Y
A0
A1

Рис. 3.9. Схема мультиплексора 16:1 на базе мультиплексоров 4:1

3.2. Дешифраторы
Значительная часть информации хранится и обрабатывается в компьютерах в
закодированном виде.
Дешифратор (Decoder) – это логическая схема с несколькими входами и
несколькими выходами, которая преобразует кодированные входные сигналы в
кодированные выходные сигналы. Входной код обычно имеет меньшее число
разрядов, чем выходной код.
Схема, которая преобразует n-разрядный двоичный код в 2 n-разрядный
унарный код “1 из 2n”, называется полным дешифратором (n2n).

63
Дешифратор 24 со входом разрешения (Enable)

DC 0 y0
А0 0 1 y1
A1 1 2 y2
En 2 3 y3

Рис. 3.10. Графическое изображение дешифратора


Таблица истинности дешифратора (Табл.3.6)
Табл. 3.6 y0 = En A1A0
En A1A0 Y0 Y1 Y2 Y3 y1 = EnA1A0
0 x x 0 0 0 0 y2 = En A1A0
1 0 0 1 0 0 0 y3 = En A1 A0
1 0 1 0 1 0 0 Табл. 3.7
1 1 0 0 0 1 0
1 1 1 0 0 0 1

В общем случае дешифратор n2n реализует все минтермы функции от n


переменных. Функции, реализуемые дешифратором представлены в таблице 3.7.
Схема дешифратора представлена на рис.3.11.

y0
A1

A0 y1

En y2

y3
Рис. 3.11. Схема дешифратора 2x4
Пример описания дешифратора 24 на Verilog с использованием оператора
case
module dec2to4(in,en,y);
input [1:0] in;
input en;
output reg[0:3]y;
always @(in or en)
case ({en,in})
3’b100: y=4’b1000;
3’b101: y=4’b0100;

64
3’b110: y=4’b0010;
3’b111: y=4’b0001;
default: y=4’b0000;
endcase
endmodule

Пример 3.8
Описание декодера 24 с использованием оператора for
module dec2to4(in,en,y);
input [1:0] in;
input en;
output reg [0:3] y;
integer k;
always @(in or en)
for (k=0; k<=3; k=k+1)
if(in==k&&en==1)
y[k]=1;
else y[k]=0;
endmodule
Микросхема дешифратора (IC 74x138)
Микросхема является декодером 38 с тремя входами разрешения E1,E2,E3.
Табл. 3.8
Е1 Е2 Е3 A2 A1 A0 Y7_L Y6_L Y5_L Y4_L Y3_L Y2_L Y1_L Y0_L
0 x x x x x 1 1 1 1 1 1 1 1
x 1 x x x x 1 1 1 1 1 1 1 1
x x 1 x x x 1 1 1 1 1 1 1 1
1 0 0 0 0 0 1 1 1 1 1 1 1 0
1 0 0 0 0 1 1 1 1 1 1 1 0 1
1 0 0 0 1 0 1 1 1 1 1 0 1 1
1 0 0 0 1 1 1 1 1 1 0 1 1 1
1 0 0 1 0 0 1 1 1 0 1 1 1 1
1 0 0 1 0 1 1 1 0 1 1 1 1 1
1 0 0 1 1 0 1 0 1 1 1 1 1 1
1 0 0 1 1 1 0 1 1 1 1 1 1 1
Активные уровни входов разрешения: E1– высокий, E2 и E3 – низкий.
Выходные сигналы имеют низкий активный уровень.
Условное обозначение микросхемы приведено на рис.3.12.
Таблица истинности микросхемы представлена в Табл.3.8.
Дешифратор реализует следующие функции:
Y0 = E1E2E3A2A1A0; Y1 = E1E2E3A2A1A0; . . .
. . . Y5 = E1E2E3A2A1A0; . . . Y7 = E1E2E3A2A1A0;

65
DC 0 Y0_L
А0 0 1 Y1_Lдля расширения декодеров – построения декодеров с бо
Входы E1,E2,E3 используются
2 Y2_L
А11 1
3 Y3_L
А2 2 4 Y4_L
5 Y5_L
Е1
6 Y6_L
Е2
7 Y7_L
Е3

Рис. 3.12. Условное обозначение микросхемы


3.3. Демультиплексоры
Демультиплексор выполняет функцию, обратную мультиплексору.
Мультиплексор передает данные от N входных источников данных на один
выход под управлением log2 N адресных входов. Демультиплексор помещает
данные от одного входного источника данных на один из N выходов.
Схема демультиплексора с одним входом и N выходами может быть
изображена следующим образом (рис.3.14.).

DMX
Output 0
A0 Y0
Output 1 Y1
Input A1
Y2
Output N-1 In Y3

Address inputs (select)

Рис. 3.14. Объяснение работы Рис. 3.15. Условное


демультиплексора обозначение демультиплексора

3.3. 1. Построение демультиплексора 1 – 4


Демультиплексор реализует следующие функции:
Y0 =InA1A0; Y1=InA1 A0; Y2 =In A1A0; Y3 =In A1 A0;
Схема демультиплексора приведена на рис.3.1б.
Данная схема совпадает со схемой декодера 24 со входом разрешения En.
Разница лишь в том, что в декодере входы A1, A0 являются информационными,
а в демультиплексоре – адресными (входами выбора нужного выходного
канала). Вход разрешения En дешифратора идентичен входу In, но в
демультиплексоре это информационный вход.
Серийно выпускаемые дешифраторы со входами разрешения являются
демультиплексорами. Например, микросхему дешифратора 74x138 можно
интерпретировать как демультиплексор с одним входом и восемью выходами.

66 Y0
In

A0 Y1

A1
Y2

Y3
Рис. 3.16. Схема демультиплексора
3.3.2. Пример описания демультиплексора на Verilog
В данном примере невыбранные каналы (выходы) устанавливаются в
состояние z.
module demultiplexer1_to_4(out,in,s);
output reg[0:3]out;
input in;
input [1:0]s;
always @(s , in)
case (s) // Switch based on control signals
2'b00:out={in,3’bz};
2'b01:out={1’bz,in,2’bz};
2'b10:out={2’bz,in,1’bz};
2'b11:out={3’bz,in};
default:out =4’bz;
endcase
endmodule
3.4. Шифраторы
Полные дешифраторы являются преобразователями двоичного n-разрядного
кода в унитарный 2n-разрядный код, все разряды которого, за исключением
одного, равны нулю. Шифраторы выполняют обратное преобразование, т.е. на
вход шифратора подается унитарный код, а на выходе образуется
соответствующий двоичный код.
Обозначим входы шифратора I0,I1.. .Ii... Для шифратора должно выполняться
условие Ii&Ij =0. Если Ii =1, то на выходе шифратора должен быть двоичный код
числа i.
Если сигналы на вход шифратора поступают от независимых источников, то
условие Ii&Ij=0 для любых i и j невыполнимо. В этом случае каждому входу
назначается приоритет. Будем считать, что чем больше номер входа i, тем выше
приоритет входа. Шифратор должен выдавать на выход двоичный код номера i,
если на все входы Ij , имеющие больший приоритет, поданы нули. Такие
шифраторы называются приоритетными шифраторами.

67
3.4.1. Схемы шифраторов
На рис.3.17 представлены условное обозначение и таблица истинности
шифратора 4-2.
Табл. 3.9
I3 A1
I2
A0
I1
I0 G

(a) (б)
Рис. 3.17: (a) обозначение шифратора, (б) таблица истинности
Шифратор имеет четыре входа I3, I2, I1 ,I0 , два адресных выхода A1, A0 и
выход G (group select). Активный уровень входных и выходных сигналов
высокий. Вход I3 имеет наивысший приоритет.
Приоритетная схема преобразует входной код в унитарный (One-hot code) и
реализует следующие функции:
H3 = I3; H2= I3I2; H1= I3I2I1;
H3
I3 A1

H2
I2

H1 A0
I1

G
I0
Рис. 3.18. Схема приоритетного шифратора 4-2
Выходные функции шифратора: A1= H3 + H2; A0 = H3 + H1;
G = I3 + I2 + I1 + I0; Сигнал G – Group Select – активен, когда хотя бы на
одном из входов имеется единица.
Микросхема 74x148.
Микросхема представляет собой 8-входовой приоритетный шифратор.
Активные уровни входных и выходных сигналов этого шифратора низкие.
Шифратор имеет вход разрешения EI – Enable input ( активным является также
низкий уровень). GS – сигнал, указывающий на то, что хотя бы один вход
является активным. Сигнал EO имеет активный уровень, если имеется сигнал
разрешения и ни на одном из входов запросов нет сигнала разрешения. Этот
68
сигнал предназначен для подачи на вход менее приоритетного шифратора, когда
требуется построить схему приоритнoгo шифратора с числом входов, больше 8.

EI
I7 A2
I6 A1
I5 A0
I4
I3 GS
I2 EO
I1
I0

Рис. 3.19. Условное обозначение IC 74x148


Таблица истинности микросхемы:
Tабл. 3.10
Входы Выходы
~EI ~I0 ~I1 ~I2 ~I3 ~I4 ~I5 ~I6 ~I7 ~A2 ~A1 ~A0 ~GS ~EO
1 x x x x x x x x 1 1 1 1 1
0 x x x x x x x 0 0 0 0 0 1
0 x x x x x x 0 1 0 0 1 0 1
0 x x x x x 0 1 1 0 1 0 0 1
0 x x x x 0 1 1 1 0 1 1 0 1
0 x x x 0 1 1 1 1 1 0 0 0 1
0 x x 0 1 1 1 1 1 1 0 1 0 1
0 x 0 1 1 1 1 1 1 1 1 0 0 1
0 0 1 1 1 1 1 1 1 1 1 1 0 1
0 1 1 1 1 1 1 1 1 1 1 1 1 0

Пример 3.9
Построение схемы приоритетного 16-входового шифратора на микросхемах
74x148. Активные уровни входных сигналов In0In15 шифратора низкие.
Наивысшим приоритетом обладает сигнал на входе ~In15.
Для построения схемы потребуется две микросхемы 74x148.
В общем случае для построения приоритетного шифратора с N входами
потребуется N/8 микросхем 74x148.
Схема приведена на рис.3.20.Запросы с номерами In0In7 поступают на
нижний шифратор, запросы с номерами In8 In15 на верхний шифратор.
Если ни на одном из входов верхнего шифратора нет активного уровня,
тогда сигнал EO (enable output) разрешает работу нижнего шигратора.
На выходе схемы формируется 4-разрядный адрес приоритетного запроса.
Активные уровни сигналов на выходе(адреса) высокие.
69
В любой момент времени могут быть активными выходы А2-А0 только
одной микросхемы. Поэтому для формирования сигналов А2-А0 могут быть
использованы двухвходовые элементы И-НЕ. Для получения А3 нужно
инвертировать сигнал на выходе GS верхней микросхемы. Сигнал на
выходе RGS имеет активный уровень, если присутствует сигнал хотя бы на
одном выходе GS. ∎

EI
In15 I7 A2
In14 I6 A1
In13 I5 A0
In12 I4
A3
In11 I3 GS
In10 I2 EO
In9 I1
In8 I0
A2

EI
In7 I7 A2 A1
In6 I6 A1
In5 I5 A0
In4 I4
A0
In3 I3 GS
In2 I2 EO
In1 I1
In0 I0 RGS

Рис. 3.20. Схема 16-входового приоритетного шифратора

3.4.1. Описание приоритетных шифраторов на Verilog


Пример 3.10
Описание шифратора 4-1 с активными высокими уровнями входных и
выходных сигналов.
Таблица истинности шифратора – Табл.3.9.
Описание с использованием оператора casex (Behavioral description using a
casex statement)
Оператор непрерывного присвоения assign присваивает gs значение 0,
если нет активного входа. Оператор assign нельзя использовать внутри
процедурного блока always.
din –входы I3,I2, I1,I0; aout –выходы A1,A0.

module encoder4_1(din,aout,gs);
input [3:0] din;
output [1:0] aout;

70
reg [1:0] aout;
output gs;
assign gs = (din!=0);
always @(din)
casex (din)
4’b1xxx: aout =2’b11;
4’b01xx: aout = 2’b10;
4’b001x: aout = 2’b01;
default: aout = 2’b00;
endcase
end
end
endmodule //encoder4_1

Для описания приоритетного шифратора удобно использовать оператор


casex, так как при наличие активного уровня на приоритетном входе (в
данном случае 1) значения на остальных входах не учитываются. ∎
Различие в использовании операторов выбора case, casex, casez
Оператор case производит сравнение заданного (в круглых скобках) условия с
перечисленными вариантами.
Оператор case при сравнении учитывает все разряды в заданном условии. В
том числе должны совпадать значения разрядов, обозначенных как x и z.
Oператор casex рассматривает разряды , установленные в состояние высокого
импеданса или неопределенное состояние, как безразличные (несущественные).
При этом символы неопределенности могут содержаться как в результате
вычисления выражения, так и в записи варианта.
Оператор casez трактует состояние z как безразличное и соответственно не
рассматривает его. В записи варианта в операторах casex и casez вместо z и x
можно использовать вопросительный знак (?).

Пример 3.11
Описание шифратора 8-3, подобного микросхеме 74x148 . В отличие от
данной микросхемы активные уровни всех входных и выходных сигналов
высокие.
Анализ входов начинается с младшего приоритета. Последний единичный
вход, обнаруженный при выполнении оператора for, будет иметь самый
высокий приоритет. Его номер будет присвоен переменной address.
module encoder_8to3(ei,in,address,eo,gs);
input ei;
input [7:0] in;
output reg[2:0] address;
output reg eo,gs;
integer i;
always @ (ei or in)

71
begin eo=1; gs=0; address=3'b0;
if(ei==0) eo =0;
else for(i=0;i<8;i=i+1)//check low priority first
begin if (in[i]==1)
begin gs=1;
eo=1;
address=i;
end
end
end
endmodule

Операторы циклов (Loop Statements)


В HDL Verilog существует четыре конструкции циклов: for, repeat, while и
forever. Циклы можно использовать только в процедурных конструкциях initial
и always.

1. Оператор for
for (initial_index; terminal_index; increment)
begin
statements
end

В этом цикле возможно инициализировать, проверять и увеличивать


переменную цикла явным способом.
В рассмотренном выше примере for (i=0; i<8; i=i+1)
 первое присвоение задает начальное значение переменной i=0
 следующее за этим выражение задает условие окончания цикла: цикл
прекращается, когда i=8 (terminal_index)
 последнее выражение – increment i (i=i+1).
 проверяется условие окончания цикла. Если i<8, то i-я итерация цикла
выполняется, иначе выполнение итераций прекращается.
Оператор for поддерживается синтезом, если terminal_index является
константой.
2. Оператор repeat
repeat (constant_value)
begin
statements
end
Цикл repeat выполнятся конечное число раз. Условие может быть
константой, переменной или сигналом, но обязательно должно быть целым
числом. Оператор repeat не поддерживается синтезом.
3. Оператор while
72
while (condition)
begin
statements
end
Цикл while выполняется до тех пор, пока условие истинно
4. Цикл forever – вечный цикл
forever statement
Выполняется до тех пор, пока моделирование не будет остановлено командой
$finish.

3.5. Kомпараторы
Компараторы (устройства сравнения) определяют отношения между двумя
словами. Сравнение двух двоичных слов с целью обнаружения их равенства –
это операция, широко применяемая в компьютерных системах и устройствах.
3.5.1. Сравнение слов на “равно”/”не равно”.
Пусть заданы два n-разрядных числа A = (a n-1 an-2 . . . a1 a0) и B = (bn-1 bn-2 . . . b1
b0). Схема равнозначности выполняет следующую функцию:
Y= = (an-1 = = bn-1)(an-2 = = bn-2) . . .  (a1 = =b1)(a0 ==b0).
Проверяются на равнозначность все одноименные разряды чисел.
Конъюнкция равнозначностей представляет собой требуемую функцию.
Схема на элементах XNOR приведена на рис. 3.21.
a3
b3
а2
b2
а1
b1 Y=
Y
а0
b0

Рис. 3.21. Компаратор на равно/не равно на элементах XNOR


Построение схемы сравнения на , на элементах XOR.

Y= = (a3 b3)( a2 b2)( a1 b1)( a0 b0) = (a3 b3)+( a2 b2)+( a1 b1)+( a0 b0).

73
a3
b3
а2
b2
а1
b1 Y=
Y
а0
b0
Рис. 3.22 . Компаратор на равно/не равно на элементах XOR
Описание на Verilog компаратора на ,
Потоковая форма (data flow) описания
module compare (compout, a,b);
parameter size = 32;
output compout;
input [size-1:0] a;
input [size-1:0] b;
assign compout = (a==b);
endmodule //compare
В данном примере использована декларация параметра parameter.
Параметрами в Verilog называются константы, используемые в программах
через объявленное имя. Параметром является число разрядов операндов – size.

3.5.2. Сравнение на >, < , =


Рассмотрим сравнение двух 4-разрядных чисел А= (a 3a2a1a0) и B = (b3b2b1b0)
на >, < , =.
Компаратор реализует следующие функции: YA>B, YA=B, YА<B
YA>B=(a3>b3) + (a3==b3)(a2>b2) + (a3==b3)(a2==b2)(a1>b1) +
+(a3==b3)(a2==b2)(a1==b1)(a0>b0);
YA=B = (a3 = =b3)( a2 = =b2)(a1= =b1)(a0 = =b0);
YА<B = YA>B +YA=B.= ~YA>B ~YA=B;
Определим функцию Fa>b для одного разряда по таблице Табл.3.11.
Табл. 3.11
a b Fa>b
0 0 0
0 1 0
1 0 1
1 1 0
Fa>b = a  b.
YA>B = a3b3+(a3 ==b3)a2b2+(a3 ==b3)(a2 ==b2)a1b +
+(a3 ==b3)(a2 ==b2) (a1==b1)a0b0.
Схема компаратора приведена на рис. 3.23.
74
a3
b3
а2
b2
YA=B
а1
b1

а0
b0 YA<B

YA>B

Рис. 3.23. Схема сравнения на >, <, =

3.5.3. Микросхема компаратора 74x85


Серийно выпускаются несколько микросхем компараторов.
Условное обозначение компаратора (микросхема 74x85) приведено на рис.
3.24. Функционирование микросхемы описывается таблицей истинности
(Табл.3.12).
a3 A3
a2 A2 CMP
a1 A1
a0 A0 > A>Bout
b3 B3
b2 = A=Bout
B2
b1 B1 <
b0 B0 A<Bout
A>Bin >
A=Bin =
A<Bin <

Рис. 3.24. Условное обозначение ИС 74x85


Табл. 3.12
Входы сравнения Входы расширения Выходы
A3,B3 A2,B2 A1,B1 A0,B0 A>Bin A< A=Bin A>Bout A<Bout A=Bout
75
A3>B3 x x x x x x 1 0 0
A3<B3 x x x x x x 0 1 0
A3=B3 A2>B2 x x x x x 1 0 0
A3=B3 A2<B2 x x x x x 0 1 0
A3=B3 A2=B2 A1>B1 x x x x 1 0 0
A3=B3 A2=B2 A1<B1 x x x x 0 1 0
A3=B3 A2=B2 A1=B1 A0>B0 x x x 1 0 0
A3=B3 A2=B2 A1=B1 A0<B0 x x x 0 1 0
A3=B3 A2=B2 A1=B1 A0=B0 1 0 0 1 0 0
A3=B3 A2=B2 A1=B1 A0=B0 0 1 0 0 1 0
A3=B3 A2=B2 A1=B1 A0=B0 x x 1 0 0 1
A3=B3 A2=B2 A1=B1 A0=B0 0 0 0 1 1 0
A3=B3 A2=B2 A1=B1 A0=B0 1 1 0 0 0 0

Кроме входов данных A и B имеются также входы A>B in, A=Bin, A<Bin для
каскадного соединения нескольких таких микросхем с целью создания
компаратора с числом разрядов больше четырех.
С помощью входов наращивания разрядности микросхема может быть
запрограммирована на выполнение сравнения на  и  .
Схема 12-разрядного компаратора на основе ИС 74x85 приведена на рис.3.25.
В схеме использованы 3 компаратора CMP1, CMP2 и CMP3, на которые
поступают младшая, средняя и старшая тетрады чисел A и B. Если старшaя
тетрада числа A больше (или меньше) старшей тетрады числа B, то результаты
сравнения от IC CMP1 и CMP2 не учитываются. При равенстве старших тетрад
чисел A и B на входы расширения разрядности компараторов поступают выходы
CMP2. Если результатом сравнения средних тетрад также является равенство, то
результат сравнения определяется IC CMP1.

CMP1 CMP2 CMP3


a3 a7 a7
A3 A3 A3
a2 a6 a6
A2 A2 A2
a1 a5 a5
A1 A1 A1
a0 a4 a4
A0 A0 A0
b3 > b7 > b7 > A>B
B3 B3 b6 B3
b2 = b6 = B2 = A=B
B2 B2 b5 A<B
b1 < b5 < B1 <
B1 B1 b4
b0 b4 B0
B0 B0
> > >
= = =
Vcc < < <

Рис. 3.25. Схема 12-разрядного компаратора на >,=,<


3.5.4. Пример описания компаратора на Verilog

76
В приведенном ниже описании компаратор значений рассматривает
сравниваемые операнды как числа со знаком.
gin, lin, ein – входы расширения A>Bin, A<Bin, A=Bin;
gout, lout, eout – выходы A>B, A<B, A==B.

module comparator(a,b,gin,lin,ein,gout,lout,eout);
input [3:0] a,b;
input gin,lin,ein;
output gout,lout,eout;
reg signed gout,lout,eout;
always @(a or b or gin or lin or ein)
if (a==b)
begin gout=gin;lout=lin;eout=ein;end
else if (a> b)
begin gout=1’b1;lout=1’b0;eout=1’b0; end
else if (a< b)
begin gout=1’b0;lout=1’b1;eout=1’b0; end
else
begin gout=1’bx;lout=1’bx;eout=1’bx; end
endmodule

3.6. Устройства с тремя состояниями


При подключении нескольких устройств к общей шине используются
элементы с тремя состояниями выхода (three-state output, tri-state output).
Выход называется трехстабильным, если он имеет три возможных состояния:
состояние нуля (низкий уровень), состояние единицы (высокий уровень) и
высокоимпедансное состояние Z. Этому состоянию не приписывается какое-
либо значение, выходной вывод представляет собой большое сопротивление как
по отношению к земле, так и по отношению к источнику питания. В состоянии Z
выход ведет себя так, как будто он не присоединен к шине. Устройства с
трехстабильными выходами обязательно имеют вход разрешения (three-state
enable). Когда на этот вход подан сигнал разрешения, устройство ведет себя как
обыкновенный буфер или инвертор. Когда сигнал на входе имеет неактивный
уровень, выход устройства становится высокоимпедансным.
3.6.1. Буферы с тремя состояниями
Основным устройством с тремя состояниями является буфер с тремя
состояниями.
На рис.3.26 представлен неинвертирующий буфер (повторитель) с высоким
активным уровнем сигнала разрешения.
En En=0 En=1
A Y A Y A Y

77
Рис. 3.26. Принцип работы буфера с тремя состояниями
Таблица истинности неинвертирующего буфера (Табл.3.13).
Табл. 3.13
En A Y
0 0 Hi-Z
0 1 Hi-Z
1 0 0
1 1 1

На рис.3.27 изображены различные буферы с тремя состояниями.


En En En

A Y A Y A Y

(a) (б) (в)


Рис. 3.27. Варианты буферов с тремя состояниями
( a) – неинвертирующий с низким уровнем сигнала разрешения
( b) – инвертирующий с высоким уровнем сигнала разрешения
( c) – инвертирующий с низким уровнем сигнала разрешения
Устройства с тремя состояниями позволяют нескольким источникам
совместно использовать одну “линию коллективного пользования”(шину) при
условии, что в это время на линии информация передается только одним
устройством (активным является только одно устройство (Л1 ).
На рис.3.28 приведена схема, иллюстрирующая подключение к общей шине
сигналов от четырех источников A,B,C,D.
Сигнал En управляет выдачей на шину информации от одного из четырех
источников A,B,C,D. Выходы декодера 24 обеспечивает передачу сигнала от
источников данных на общую шину Datа.
Если En=1, то все буферы остаются в состоянии Z. Логическое значение сигнала
на линии не определено.
Временные диаграммы передачи данных от четырех источников приведены на
рис.3.28.
Иногда для уменьшения потребления тока линию коллективного
использования соединяют резистором с источником питания. Тогда напряжение
на выходе в неопределенном состоянии (когда все источники отключены от
линии) приближается к напряжению питания и интерпретируется, как
логическая единица (Hi-Z).

78
A 1-разрядная шина

DC B
S0
Data
S1

En C

Рис. 3.28. Передача данных на шину от четырех источников


Обычно требуется выполнение следующего условия: переход в состояние Hi-
Z должен происходить быстрее, чем выход из него. В случае, когда одно
устройство переводится в третье состояние, а другое одновременно с этим
выводится из этого состояния, первое устройство отключается от линии
коллективного использования раньше, чем второе к ней подключается. Если
второе устройство подключается раньше, чем первое, и сигналы на выходах в
противоположных состояниях, то на линии установится неопределенный сигнал.
Такая ситуация называется конфликтом при обращении к шине.

S1,S0 3 0 1 2 3

En

Data D A B C D

Hi-Z Dead
time

Рис. 3.30. Временные диаграммы передачи данных на шину от четырех источников


Требование обеспечения передачи данных на шине без конфликтных
ситуаций предъявляется к логике управления. Она должна гарантировать
“мертвое время” (dead time) на общей линии.
Это время должно быть больше, чем разница между временами выключения
и включения устройств в худшем случае, и больше, чем максимальная разница
между приходом сигналов управления третьим состоянием (если их несколько).

79
3.6.2. Описание на Verilog однонаправленного буфера с тремя
состояниями
1. Использование процедурного присвоения

module tristate (en, a, y);


input a, en;
output y;
reg y;
always @ (a or en)
begin if (en)
y = a;
else y = 1’bz;
end
endmodule

2.Использование непрерывного присвоения

module tristate (en, a, y);


input a, en;
output y;
assign y = en?a:1’bz;
endmodule

3.6.3. Стандартные ИС буферов с тремя состояниями


ИС 74x541 содержит восемь буферов с тремя состояниями. Условное
обозначение микросхемы приведено на рис.3.31.

E1
E2
A1 Y1
A2 E1,
Y2 E2 – входы разрешения передачи
A3 информации со входов A1 … A8.
Y3
A4 Y4 разрешения нeт, то все выходы ИС находятся в состоянии Z.
Если
A5 Y5
A6 Y6
A7 Y7
A8 Y8

Рис. 3.31. Условное обозначение IC 74541


3.7. Передача сигналов на шину с помощью буферов с тремя
состояниями и мультиплексоров
В схеме на рис.3.32 передача сигналов на шину Bus осуществляется с
помощью трехстабильных буферов, управляемых сигналами sb0, sb1,sb2,sb3.

80
SRC0

sb0
SRC1

Bus
sb1
SRC2

rb3 rb2 rb1 rb0


sb2 DST3 DST2 DST1 DST0
SRC3

sb3

Рис. 3.32. Организация передачи данных на шину с помошью трехстабильных


буферов
В каждый момент времени передача осуществляется от одного из четырех
источников информации SRC0, SRC1, SRC2, SRC3 (source) к одному из четырех
приемников информации DST0, DST1, DST2, DST3 (destination).
Для небольшого числа разрядов более выгодно использовать схему, в состав
которой входит мультиплексор на передающей стороне и демультиплексор на
приемной стороне (рис.3.33).
SRC0

SRC1

MX Bus

SRC2 En1 En2


SRCSEL DMX DSTSEL
SRC3
DST3 DST2 DST1 DST0

Рис. 3.33. . Организация передачи данных на шину с помошью


мультиплесоров/демультиплексоров
Мультиплексор на передающей стороне с помощью информации на входе
SRCSEL выбирает передатчик. Демультиплексор на приемной стороне выбирает
приемника информации (входы DSTSEL).
SRCSEL – адрес источника информации. DSTSEL – адрес приемника
информации.
81
3.8. Шинный приемопередатчик (bus transceiver)
Шинный приемопередатчик содержит два трехстабильных буфера,
соединенных в противоположном направлении для каждой пары выводов.
Данные могут передаваться в обоих направлениях.
Возможны три режима работы приемопередатчика: передача от источника A
к приемнику B, передача от источника B к приемнику A и независимая
передача данных по шинам A и B.
Режимы работы приемопередатчика с парой двунаправленных шин
представлены в таблице Табл. 3.14.
Taбл. 3.14
En Dir Операция
0 0 Передача данных от источника на шине B к приемнику на
шине A
0 1 Передача данных от источника на шине А к приемнику на
шине B
1 x Независимая передача данных по шинам A и B
(приемопередатчик отключен)

Сигналы от двух устройств не должны поступать на шину одновременно (это


должно быть обеспечено при разработке). Когда приемопередатчик
заблокирован (En=1), возможна независимая передача данных по обеим шинам.

En
Dir

A B

Рис. 3.34. Схема одного бита шинного приемопередатчика

Пример 3.11
Oписание 1-битного приемопередатчика на Verilog
module transciever_1(En, Dir, A,B);
input En, Dir;
inout A, B;
assign A=~En&Dir?B:1’bz;
assign B=~En&~Dir?A:1’bz;
endmodule

82
Для декларации двунаправленных портов A и B использовано
ключевое слово inout.

3.8.1. Стандартные ИС шинных приемопередатчиков

E1
DIR

A1 B1
A2 B2
A3 B3
A4 B4
A5 B5
A6 B6
A7 B7
A8 B8
Рис.3.35. Графическое изображение IC 74x245
ИС содержит 8 двунаправленных буферов с тремя состояниями

Пример 3.12
Описание 8-битного приемопередатчика на Verilog
module transciever_8(En,Dir,A,B);
input En,Dir;
inout [7:0] A, B;
assign A =~En&~Dir?B: 8’bz;
assign B=~En&Dir?A:8’bz;
endmodule

3.9. Задачи
3.1 Построить мультиплексор 16:1, используя мультиплексоры 4:1.

3.2 Описать на Verilog 8-ми входовой 32-битный мультиплексор 8:1.

3.3 Определить, какая функция реализуется нижеприведенной схемой.


Минимизировать функцию и реализовать на элементах И, ИЛИ, НЕ.

83
0 0
0 1
0
0
1
0
1 1
0
y
1
0 0
1 1
0
1
1 0
1 1
c
b
а
Рис. 3.36.

3.4 Реализовать функцию y = ~x1x2 +x3x4x5 +~x2x3~x4 + x4~x5 на


мультиплексоре 8:1.

3.5 Используя дешифраторы 3 – 8 с инверсными входами разрешения ~E1,~E0


и инверсными выходами, построить дешифратор 5 – 32.

3.6 Построить схему сравнения двух 16-разрядных чисел, используя


компараторы 74x85.
3.8 Построить схему контроля по четности (число разрядов n=8 ).

3.9 Описать на языке Verilog приоритетный шифратор, на вход которого


поступают запросы от 16 источников. На выходе формируются адреса
двух старших приоритетных запросов A и B. Запросы сопровождаются
сигналами AVALID и BVALID. Активные уровни входных сигналов
высокие. Наивысший приоритет имеет запрос R0.
3.10 Построить мультиплексор 64:1 на основе мультиплексоров 8:1 по
двухъярусной схеме.
3.11 Описать на Verilog полный сумматор.

3.12 Какая функция реализуется схемoй, изображенной на рисунке 3.38.

84
10 1 CD
DC 0
x3 21 7 20 2
20 1
33 3 21 4
2
45 2 22 6 Y
x2 21 3
57 5
4
6 8
22 5
x1 7 6
6
8 4
7

Рис. 3.37.

3.13 Построить таблицу истинности функции, реализуемой мультиплексором,


изображенным на рис. 3.38.

1 0 MUX
1
2
3
4
5 Y
0 6
7
X3 0
X2 1
X1 2

Рис. 3.38.

3.14 Задана функция f(x1,x2,x3,x4) с помощью карты Карно.


Найти коэффициент в разложении Шеннона
x3
этой функции (кофактор) f~x2.
x3x4
x1x2 00 01 11 10
00 1 1
01 1 1 x2
11 1 1 1
x1
10 1 1

Рис. 3.39.

85

Вам также может понравиться