Комбинационная логика и ее описание на языке Verilog

Содержание

Слайд 2

Микросхемы малой степени интеграции

Микросхемы малой степени интеграции

Слайд 3

Управление сложностью в микроэлектронике

Управление сложностью в микроэлектронике

Слайд 4

HDL HDL – Hardware Description Language a b c assign c = a & b;

HDL

HDL – Hardware Description Language

a

b

c

assign c = a & b;

Слайд 5

HDL. Маршрут проектирования

HDL. Маршрут проектирования

Слайд 6

HDL. Выбор Verilog VHDL

HDL. Выбор
Verilog VHDL

Слайд 7

Verilog HDL. История Verilog был разработан компанией Gateway Design Automation в

Verilog HDL. История

Verilog был разработан компанией Gateway Design Automation в 1984

году как фирменный язык для симуляции логических схем.
В 1989 году Gateway приобрела компания Cadence, и Verilog стал открытым стандартом в 1990 году под управлением сообщества Open Verilog International.
Слайд 8

Verilog HDL. История Язык стал стандартом IEEE в 1995 году. В

Verilog HDL. История

Язык стал стандартом IEEE в 1995 году.
В 2005

году язык был расширен для упорядочивания и лучшей поддержки моделирования и верификации систем.
Эти расширения были объединены в единый стандарт, который сейчас называется SystemVerilog(стандарт IEEE 1800-2009).
Слайд 9

Комбинационная логика

Комбинационная логика

Слайд 10

Комбинационная логика

Комбинационная логика

Слайд 11

Verilog HDL module endmodule

Verilog HDL
module
endmodule

Слайд 12

Verilog HDL module top endmodule top

Verilog HDL
module top
endmodule

top

Слайд 13

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
endmodule

top

a

b

clk

q

Слайд 14

Verilog HDL top a b clk q module top ( input

Verilog HDL

top

a

b

clk

q
module top (
input clk,
input a,
input b,
output q
);
wire c;
endmodule

c

Слайд 15

Verilog HDL top a b clk q module top ( input

Verilog HDL

top

a

b

clk

q
module top (
input a,
input b,
input clk,
output q
);
wire c;
assign c = a;
endmodule

c

Слайд 16

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire c;
assign c = a & b;
endmodule

top

a

b

clk

q

c

Слайд 17

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire c;
// Это комментарий, он ничего не

изменяет
assign c = a & b;
endmodule

top

a

b

clk

q

c

Слайд 18

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
inout q // двунаправленный сигнал, используется для внешних контактов

микросхем
);
wire c;
// Это комментарий, он ничего не изменяет
assign c = a & b;
endmodule
Слайд 19

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire [3:0] c; // 4-х проводная шина
wire

[3:0] d;
assign c = d;
endmodule
Слайд 20

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire [3:0] c, d; // объявление нескольких

проводов одинаковой разрядности
assign c = d;
endmodule
Слайд 21

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire [3:0] c;
wire [8:0] d;
assign q

= d[3]; // можно присвоить нужный бит.
endmodule
Слайд 22

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire [3:0] c;
wire [8:0] d;
assign c

= d[7:4]; // можно назначить нужные биты другому проводу.
endmodule
Слайд 23

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire [3:0] c;
wire [8:0] d;
assign q

= d[c]; // можно назначить номер бита определяемой шиной.
endmodule
Слайд 24

Verilog HDL module top ( input clk, input a, input b,

Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
wire [3:0] c;
wire [7:0] d [0:24];

// массив из двадцатипяти 8-битных шин
assign c = d[14][7:4]; // подключение 4 бит из 14 шины массива шин.
endmodule
Слайд 25

Verilog HDL module top ( input clk, input [8:0] a, //

Verilog HDL
module top (
input clk,
input [8:0] a, // входные и выходные порты модуля могут

быть многоразрядными шинами.
input b,
output [3:0] q
);
assign q = a[7:4];
endmodule
Слайд 26

Формат описания чисел Verilog HDL wire [10:0] a = 7; //32-х

Формат описания чисел Verilog HDL

wire [10:0] a = 7; //32-х битное

десятичное число, которое будет “обрезано” до 11 бит wire [10:0] b = 11’d7; //11-ти битное десятичное число wire [3:0] c  = 4'b0101; //4-х битное двоичное число wire [3:0] d  = 8’h7B;   //8-ми битное шестнадцатеричное число 7B wire [47:0] e = 48’hEFCA7ED98F;  //48-ми битное шестнадцатеричное число
Слайд 27

Основные операции Verilog HDL

Основные операции Verilog HDL

Слайд 28

Основные операции Verilog HDL

Основные операции Verilog HDL

Слайд 29

Основные операции Verilog HDL

Основные операции Verilog HDL

Слайд 30

Манипуляции с битами Verilog HDL module top ( input clk, input

Манипуляции с битами Verilog HDL
module top (
input clk,
input a,
input b,
output q
);
endmodule

top

a

b

clk

q

Слайд 31

Манипуляции с битами Verilog HDL top a b clk q module

Манипуляции с битами Verilog HDL

top

a

b

clk

q
module top (
input clk,
input a,
input b,
output q
);
wire [1:0] c; //

Многобитный сигнал (шина)
assign c = {a,b}; // Конкатенация
endmodule

c

2

Слайд 32

Манипуляции с битами Verilog HDL top a b clk q module

Манипуляции с битами Verilog HDL

top

a

b

clk

q
module top (
input clk,
input a,
input b,
output q
);
wire [1:0] c; //

Многобитный сигнал (шина)
assign c = {a,b}; // Конкатенация
assign q = c[0]; // Обращение к биту
endmodule

c

2

Слайд 33

Манипуляции с битами Verilog HDL top a b clk q module

Манипуляции с битами Verilog HDL

top

a

b

clk

q
module top (
input clk,
input a,
input b,
output q
);
wire [1:0] c; //

Многобитный сигнал (шина)
assign c = {a,b}; // Конкатенация
assign q = c;
endmodule

c

2

2

Слайд 34

Verilog HDL. Сложение и вычитание module simple_add_sub ( input [7:0] operandA,

Verilog HDL. Сложение и вычитание

module simple_add_sub (          input [7:0] operandA, operandB

//два входных 8-ми битных операнда          output [8:0] out_sum, out_dif // Выходы для арифметических операций имеют дополнительный 9-й бит переполнения
); //Максимальное 8-ми битное безнаковое число 255. При сложении 255 + 255 получится 510 которое можно представить минимум 9-ю битами. assign out_sum = operandA + operandB; assign out_dif = operandA - operandB; //Если сделать выход сумматора 8-ми битным то случится переполнение и результат сложения 255 + 3 будет равен 2.
endmodule
Слайд 35

Verilog HDL. Логические и арифметические сдвиги module simple_add_sub ( input [7:0]

Verilog HDL. Логические и арифметические сдвиги

module simple_add_sub (          input [7:0] operandA,

operandB //два входных 8-ми битных операнда          output [7:0] out_shl, out_shr, out_sar //Выходы для операций сдвига
);
//логический сдвиг влево на значение в operandB. assign out_shl = operandA << operandB; // пример: на сколько сдвигать определяется 3-мя битами второго операнда. Например operandA = 8’b1010_1110 operandB = 8’b0000_0011 тогда out_shl = 8’b0001_0101 assign out_shr = operandA >> operandB[2:0];
//арифметический сдвиг вправо (сохранение знака числа) Например operandA = 8’b1111_1100 тогда out_shl = 8’b1111_1111 assign out_sar = operandA >>> 3;
endmodule
Слайд 36

Verilog HDL. Битовые логические операции module simple_add_sub ( input [7:0] operandA,

Verilog HDL. Битовые логические операции

module simple_add_sub (          input [7:0] operandA, operandB

//два входных 8-ми битных операнда          output [7:0] out_bit_and , out_bit_or, out_bit_or, out_bit_not
);
assign out_bit_and = operandA & operandB; //8’b0011_1101 & 8’b1010_0110 = 8’b0010_0100 assign out_bit_or  = operandA | operandB; //8’b0011_1101 | 8’b1010_0110 = 8’b1011_1111
assign out_bit_or  = operandA ^ operandB; //8’b0011_1101 ^ 8’b1010_0110 = 8’b1001_1011 assign out_bit_not = ~operandA; // ~8’b0011_1101 = 8’b1100_0010
endmodule
Слайд 37

Verilog HDL. Булевые логические операции module simple_add_sub ( input [7:0] operandA,

Verilog HDL. Булевые логические операции

module simple_add_sub (          input [7:0] operandA, operandB

//два входных 8-ми битных операнда          output out_bool_and , out_bool_or  , out_bool_not
);
assign out_bool_and = operandA && operandB; //8’b0011_1101 & 8’b1010_0110 = 1’b1 assign out_bool_or  = operandA || operandB; //8’b0011_1101 | 8’b1010_0110 = 1’b1 assign out_bool_not = !operandA; // !8’b0011_1101 = 1’b0
endmodule
Слайд 38

Verilog HDL. Операции свертки module simple_add_sub ( input [7:0] operandA, output

Verilog HDL. Операции свертки

module simple_add_sub (          input [7:0] operandA,          output out_reduction_and,

out_reduction_or, out_redution_xor
);
//Операции выполняются между битами внутри одной шины assign out_reduction_and = &operandA; //&8’b0011_1101 = 1’b0 assign out_reduction_or = |operandA; //|8’b0011_1101 = 1’b1 assign out_redution_xor = ^operandA; // ^8’b0011_1101 = 1’b1
endmodule
Слайд 39

Мультиплексор Verilog HDL module mul ( input D0, input D1, input

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

module mul (
input D0,
input D1,
input S,
output Y
);
assign Y = S ? D1

: D0;
endmodule
Слайд 40

Verilog HDL. Операции сравнения module simple_add_sub ( input [7:0] operandA, operandB

Verilog HDL. Операции сравнения

module simple_add_sub (          input [7:0] operandA, operandB          output

out_eq, out_ne, out_gt, out_lt, out_ge, out_le
);
assign out_eq = operandA == operandB; assign out_ne = operandA != operandB; assign out_ge = operandA >= operandB; assign out_le = operandA <= operandB; assign out_gt = operandA > operandB; assign out_lt = operandA < operandB;
endmodule
Слайд 41

Verilog HDL. Тип reg module top ( input clk, input [8:0]

Verilog HDL. Тип reg
module top (
input clk,
input [8:0] a,
input b,
output [3:0] q
);
// reg используют при

поведенческом (behavioral) описании схемы. Если регистру постоянно присваивается значение комбинаторной (логической) функции, то он ведет себя точно как провод (wire).  Если же регистру присваивается значение в синхронной логике, например по фронту сигнала тактовой частоты, то ему, в конечном счете, будет соответствовать физический D-триггер или группа D-триггеров. D-триггер – это логический элемент способный запоминать один бит информации.
reg [3:0] c;
endmodule
Слайд 42

Verilog HDL. Тип reg module top ( input clk, input [8:0]

Verilog HDL. Тип reg
module top (
input clk,
input [8:0] a,
input b,
output reg [3:0] q //

выходные сигналы и шины можно объявлять как reg
);
endmodule
Слайд 43

Verilog HDL. Блок always module top ( input clk, input [8:0]

Verilog HDL. Блок always
module top (
input clk,
input [8:0] a,
input b,
output reg [3:0] q
);
//Присвоение

в блоке always возможно только для сигналов типа reg!!!!
always @(*) begin
q = !a[7:4];
end
endmodule
Слайд 44

Verilog HDL. Блок always //Связанные между собой выражения превратятся в общую

Verilog HDL. Блок always
//Связанные между собой выражения превратятся в общую цепь

комбинационной логики
wire [3:0] a, b, c, d, e; reg [3:0] f, g, h, j; always@(*) begin f = a + b; g = f & c; h = g | d; j = h - e; end
Слайд 45

Verilog HDL. Блок always //Связанные между собой выражения превратятся в общую

Verilog HDL. Блок always
//Связанные между собой выражения превратятся в общую цепь

комбинационной логики
wire [3:0] a, b, c, d, e; reg [3:0] f, g, h, j; always@(*) begin j = (((a + b) & c) | d) - e;
end
Слайд 46

Verilog HDL. If-else //можно описывать мультиплексоры с помощью if-else а не

Verilog HDL. If-else
//можно описывать мультиплексоры с помощью if-else а не тернарного

оператора
reg [3:0] c; always @(a or b or d) begin    if (d) begin      c = a & b;    end else begin      c = a + b;    end end
Слайд 47

Verilog HDL. Case //многовходовые мультиплексоры и дешифраторы можно описывать через case

Verilog HDL. Case
//многовходовые мультиплексоры и дешифраторы можно описывать через case
reg

[3:0] c; wire [1:0] option; wire [7:0] a, b, c, d; reg [7:0] e; always @(a or b or c or d or option) begin case (option)  0: e = a;   1: e = b;   2: e = c;   3: e = d; endcase end
Слайд 48

Иерархия модулей Verilog HDL module inv ( input a output y

Иерархия модулей Verilog HDL

module inv (
input a
output y
);
assign y = ~a;
endmodule

module and_3

(
input a, b, c,
output y
);
assign y = a & b & c;
endmodule
Слайд 49

Иерархия модулей Verilog HDL module top ( input a, b, c,

Иерархия модулей Verilog HDL

module top (
input a, b, c,
output y
);
wire n1;
and_3 andgate

(
.a(a), .b(b),
.c(c), .y(n1)
);
inv inverter (
.a(n1), .y(y)
);
endmodule

Имя подключаемого модуля (and_3, inv)
Название примитива. Например, нам может понадобиться 3 копии модуля and_3. Тогда мы сможем подключить 3 экземпляра модуля and_3, используя различные наименования для прототипов (andgate_1, andgate_2 …)
Символ точка, перед наименованием порта отсылает к реальному порту подключаемого модуля. В скобках обозначается , куда будут подключаться сигналы в top-модуле

Слайд 50

Упражнение с логическими элементами Altera Cyclone IV EP4CE6 FPGA Вывод результатов

Упражнение с логическими элементами

Altera Cyclone IV EP4CE6 FPGA

Вывод результатов логических операций

над входными воздействиями с кнопок на светодиоды.
Слайд 51

Упражнение с логическими элементами module top ( … input [3:0] key_sw,

Упражнение с логическими элементами

module top
(

    input  [3:0] key_sw,
    output [3:0] led,

);

    // Exercise 1: Change the code below.
    // Assign to led [2] the result of AND operation
    assign led [2] = 1'b0;
endmodule

module top
(

    input  [3:0] key_sw,
    output [3:0] led,

);
…     // Exercise 2: Change the code below.
    // Assign to led [3] the result of XOR operation
    // without using "^" operation.
    // Use only operations "&", "|", "~" and parenthesis
    assign led [3] = 1'b0;
endmodule

Слайд 52

Упражнение с логическими элементами Присвойте led[2] результат операции И (AND). Присвойте

Упражнение с логическими элементами
Присвойте led[2] результат операции И (AND).
Присвойте led[3] результат

операции исключающего ИЛИ (XOR) без использования ее оператора.
Слайд 53

Упражнение с логическими элементами

Упражнение с логическими элементами

Слайд 54

Семисегметный индикатор

Семисегметный индикатор

Слайд 55

Семисегметный индикатор

Семисегметный индикатор

Слайд 56

Семисегметный индикатор

Семисегметный индикатор

Слайд 57

Упражнение с выводом буквы на семисегментный индикатор module top ( …

Упражнение с выводом буквы на семисегментный индикатор
module top
(

    input  [3:0] key_sw,
    output [3:0] led,     output [7:0] abcdefgh,
    output [3:0] digit,

);
…     // Exercise 1: Display the first letters
    // of your first name and last name instead.     assign abcdefgh =
    assign digit    =  endmodule
module top
(


);
…     // Exercise 2: Display letters of a 4-character word
    // using this code to display letter of ChIP as an example     reg [7:0] letter;
    always @*
      case (key_sw)
4'b0111: letter = C;

     endcase
assign abcdefgh = letter;
endmodule
Слайд 58

Упражнение с выводом буквы на семисегментный индикатор Выведите первые буквы своего

Упражнение с выводом буквы на семисегментный индикатор
Выведите первые буквы своего имени

и фамилии на семисегментный индикатор.
Выведите слово CHIP на семисегментный индикатор.
Слайд 59

Упражнение с выводом буквы на семисегментный индикатор

Упражнение с выводом буквы на семисегментный индикатор