Краткие теоретические сведения

2.1 Поведенческие блоки.

Постоянные назначения с помощью оператора assign полезны, но они имеют определенные недостатки. Сложный алгоритм, описанный с помощью таких операторов, очень тяжело читать и анализировать. Чтобы сделать алгоритм на языке Verilog более выразительным используют процедурные блоки always. Они используются при описании системы с помощью поведенческих блоков. Использование поведенческих блоков похоже на программирование на языке СИ. Оно позволяет выразить алгоритм так, чтобы он выглядел как последовательность действий, даже если в конечном счете в аппаратуре это будет не так.

Синтаксис для описания поведенческого модуля выглядит следующим образом:

 

always@(<аргумент>) <действие>

 

где always@() – процедурный блок;

<аргумент> – список чувствительности, список сигналов к которым 

                    чувствителен блок;

<действие> – выражение которое выполняется при изменении

                    сигналов в списке чувствительности.

 

Процедурный блок always – это такой блок, который выполняет действия, заключенные под ним один раз при изменении его аргумента. Таким образом возможно построение поведенческого модуля, который объединяет определенные действия.

Решим следующую задачу. Требуется организовать сумматор. Имеется две четырех битных шины «А» и «В». Требуется арифметически сложить шины и вывести результат на восьми битную выходную шину «Y».

 


 

module ADDER (A, B, Y);

 

output reg [7:0]Y;

input wire [3:0]A;

input wire [3:0]B;

 

always@(A or B)

begin

 

Y=A+B;

 

end

endmodule

 

2.2 Дешифратор.

Дешифратор является комбинационной схемой с несколькими входами и выходами, преобразующие код, подаваемый на входы в сигнал на одном из выходов. На выходе дешифратора появляется логическая единица, на остальных — логические нули, когда на входных шинах устанавливается двоичный код определённого числа, то есть дешифратор расшифровывает число в двоичном коде, представляя его логической единицей на определённом выходе. Число входов дешифратора равно количеству разрядов, поступающих двоичных чисел. Число выходов равно полному количеству различных двоичных чисел этой разрядности. Ниже представлен алгоритм реализующий дешифратор на два входных разряда «Х».

 

module DECODER (X,Y);

 

output reg [3:0]Y;

input wire [1:0] X;

 

always@(X)

begin

 

Y[0]=~X[0] & ~X[1];

Y[1]=~X[0] & X[1];

Y[2]= X[0] & ~X[1];

Y[3]= X[0] & X[1];

 

end

endmodule

 


 

2.3 Шифратор

Дешифратор является комбинационным устройством выполняющее логическую функцию (операцию) - преобразование позиционного n-разрядного кода в m-разрядный двоичный код. При подаче сигнала на один из n входов (обязательно на один, не более) на выходе появляется двоичный код номера активного входа. Если количество входов настолько велико, что в шифраторе используются все возможные комбинации сигналов на выходе, то такой шифратор называется полным, если не все, то неполным. Число входов и выходов в полном шифраторе связано соотношением:

 

n=2m

 

где n – число входов;

m – число выходов двоичных разрядов.

 

Ниже представлен алгоритм реализующий шифратор на четыре входа «Х».

 

 

module CODER (X,Y);

 

output reg [1:0]Y;

input wire [3:0]X;

 

always@(X)

begin

 

Y[0]=(~X[0]& ~X[1]& X[2]& ~X[3]) | (~X[0]& ~X[1]& ~X[2]& X[3]);

Y[1]=(~X[0]& X[1]& ~X[2]& ~X[3]) | (~X[0]& ~X[1]& ~X[2]& X[3]);

 

end

endmodule

 

2.4 Мультиплексор

Мультиплексор является комбинационным устройством, которое позволяет подключать несколько входов к одному выходу. Сигналы, подаваемые на адресные входы, определяют какой конкретно информационный канал подключен к выходу. Ниже представлен алгоритм реализующий мультиплексор на четыре входа «Х» с двухразрядным адресным входом «А».


 

module MULTIPLEXER (A,X,Y);

 

output reg Y;

input wire [3:0]X;

input wire [1:0]A;

 

always@(X)

begin

 

if(A==0)Y=X[0];

if(A==1)Y=X[1];

if(A==2)Y=X[2];

if(A==3)Y=X[3];

 

end

endmodule

 

2.5 Преобразователь кода в код

Преобразователь кода в код служит для преобразования одной кодовой последовательности в другую. Рассмотрим пример работы преобразователя двоичного кода в коды управления семи сегментным индикатором.

Семи сегментный индикатор является знакосинтезирующим индикатором и предназначен для индикации арабских чисел от 0 до 9. Индикатор конструктивно состоит из 7 подсвечивающийся или отражающих сегментов. Расположение и название сегментов приведены на рисунке 2.1.

 

Рис. 2.1. Расположение и название сегментов семи сегментного индикатора.

На учебном стенде используется сдвоенный светодиодный семи сегментный индикатор. В данном индикаторе светодиоды, подсвечивающие каждый свой сегмент, объединены анодами. По этому такой тип индикаторов называется индикатором с общим анодом. В таком индикаторе выведены выводы катодов светодиодов каждого сегмента. Для включения соответствующего сегмента ПЛИС должна сформировать уровень логического нуля на необходимом выводе. Для отключения сегмента – нужно сформировать уровень логической единицы. Исходя из этого преобразователь двоичного кода в код для семи сегментного индикатора должен преобразовывать входной двоичный код в такой код, чтобы на индикаторе отображалась необходимая арабская цифра. В таблице 2.1 приведена таблица истинности преобразователя.

 

Табл. 3.1 Таблица истинности для преобразователя двоичного кода в код управления семи сегментным индикатором с общим анодом

Х3 Х2 Х1 Х0 A B C

D

E

F G
0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 1 1 0 0 1 1 1 1
2 0 0 1 0 0 0 1 0 0 1 0
3 0 0 1 1 0 0 0 0 1 1 0
4 0 1 0 0 1 0 0 1 1 0 0
5 0 1 0 1 0 1 0 0 1 0 0
6 0 1 1 0 0 1 0 0 0 0 0
7 0 1 1 1 0 0 0 1 1 1 1
8 1 0 0 0 0 0 0 0 0 0 0
9 1 0 0 1 0 0 0 0 1 0 0

 

Ниже приведен алгоритм, который преобразовывает двоичный код, поступающий на шину «Х», в код для управления семи сегментным индикатором, снимаемым с шины «Y».

 

module CODER (X,Y);

 

output reg [6:0]Y;

input wire [3:0]X;

 

always@(X)

begin

 

if(X==0)Y=7'b1000000;

if(X==1)Y=7'b1111001;

if(X==2)Y=7'b0100100;

if(X==3)Y=7'b0110000;

if(X==4)Y=7'b0011001;

if(X==5)Y=7'b0010010;

if(X==6)Y=7'b0000010;

if(X==7)Y=7'b1111000;

if(X==8)Y=7'b0000000;

if(X==9)Y=7'b0010000;

 

end

endmodule

 




Задание к работе.

Произведите исследование описанных логических устройств. В качестве входных воздействий используйте движковые переключатели стенда. В качестве индикаторов выходных шин используйте светодиоды стенда. Логику работы каждого устройства опишите в виде таблицы истинности.

 

Содержание отчета

4.1 Цель работы.

4.2 Алгоритм модуля на языке Verilog для каждого устройства.

4.3 Таблицы истинности для каждого комбинационного устройства.

4.4 Вывод

 

Контрольные вопросы

5.1 Дайте определение процедурного блока always.

5.2 Для чего нужны поведенческие блоки?

5.3 Дайте определение дешифратора.

5.4 Приведите таблицу истинности дешифратора.

5.4 Дайте определение шифратора.

5.5 Приведите таблицу истинности шифратора.

5.6 Дайте определение мультиплексора.

5.7 Приведите таблицу истинности мультиплексора.

5.8 Дайте определение преобразователя кода в код.

5.9 Приведите таблицу истинности преобразователя кода в код для семи сегментного индикатора с общим анодом.

5.10 Приведите таблицу истинности преобразователя кода в код для семи сегментного индикатора с общим катодом.

5.11 Приведите алгоритм на языке Verilog реализующий работу дешифратора.

5.12 Приведите алгоритм на языке Verilog реализующий работу шифратора.

5.13 Приведите алгоритм на языке Verilog реализующий работу мультиплексора.

5.14 Приведите алгоритм на языке Verilog реализующий работу преобразователя двоичного кода в код для управления семи сегментным индикатором с общим анодом.

5.15 Как производится формирование арабских чисел на семи сегментном индикаторе?

 

 


 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: