Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

О Verilog для теста

.pdf
Скачиваний:
2
Добавлен:
03.06.2026
Размер:
330.96 Кб
Скачать

Verilog

Ъ

Typical IVT

О верилоге

Языки описания аппаратуры – Hardware Description Language (HDL) предназначены для описания аппаратных структур микросхемы с помощью конструкций, которые могут быть синтезируемыми и несинтезируемыми. Синтезируемость – свойство конструкции языка которое позволяет ей быть преобразованной в аппаратную структуру внутри микросхемы.

Уровни абстракции:

1.Поведенческий behavioral

2.Потока данных dataflow

3.Вентильный gate

4.Транзисторный switch

Синтезируемые типы данных: wire, reg

Wire – тип данных цепь, используются для описаний соединений, не хранят данные. Только один источник сигнала.

Reg нужен для описания переменных, хранящих значение между процедурным присваиванием. Также можно использовать для описания комбинационной логики.

Параметры

Используются для объявления констант и параметризации HDL-описаний parameter WIDTH = 8;

reg [WIDTH -1 : 0] a;

Операторы

Унарные, бинарные, тернарные (два подоператора для разделения 3 операндов)

Объединения c = {a, b} и повторения c = {2a, b}

Арифметические +-*

Отношения ><=

Логические !, &&, ||

Равенства/неравенства ==, !=

Побитовые операторы ~, &, |, ^

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

Операторы сдвига >>,<<

Условный оператор

Непрерывные присваивания

Присваивание скалярным и векторным цепям. Assign <присваивание>

Результатом синтеза такой конструкции является комбинационная схема – значение на выходе в любой момент времени определяется значениями на входах

Допускается применение неявного непрерывно присваивания через wire<присваивание>

Процедурное присваивание

Присваивание переменным в структурных конструкциях, которые работают только с типом reg (if-else, case). Блокирующее = выполняется в порядке их описания Неблокирующее <= выполняются параллельно

Определены две конструкции initial и always. Их может быть много, они выполняются параллельно. Initial выполняется один раз с нулевого моменте времени, используется в основном для инициализации памяти

Always повторяется циклически начиная с нулевого момента always @ (событие/фронт/т.д.)

begin

ПЛИС Стр.1

end

Конструкция ветвления case case (<>)

1:<>;

2:<>;

default: <>; //ОБЯЗАТЕЛЬНО endcase

Модуль

Основная иерархическая единица описания. Модуль взаимодействует с другими модулями через порты ввода/вывода. Внутри объявляются константы, цепи, переменные, присваивания и конструкции. В модуль могут быть включены другие модули^

my_module m1 ( .a1(a), .b1(b), .r1(r_1) );

Входы могут быть только цепью, а подключаться могут как к цепям так и переменным Выходы внутри модуля могут быть и цепью и переменной, а подключаться только к цепям

Двунаправленные порты внутри модуля могут быть только цепью и подключаться только к цепям

ПРИМЕРЫ:

Вентиль «ИЛИ»: module or_gate( input x,

input y,

output result);

assign result = x | y; endmodule

Вентиль «Исключающее ИЛИ»: module xor_gate( input x,

input y,

output result);

assign result = x ^ y; endmodule

Вентиль «НЕ»:

module not_gate( input x,

output result); assign result = ~x; endmodule

Мультиплексор 2 в 1

 

module mul2_1

(SW, LEDG);

input [9:0] SW; output [7:4] LEDG;

assign LEDG[7:4] = ( {4{~SW[8]}} & SW[3:0]) | ({4{SW[8]}} & SW[7:4]);

endmodule

Дешифратор

module decoder(SW, HEX0);

input [3:0] SW;

output reg [6:0] HEX0; // подключение 7-сегментного индикатора HEX[0]

ПЛИС Стр.2

always @ * begin

case (SW) 4'b0000: begin

HEX0 = 7'b1000000;

end

4'b0001: begin

HEX0 = 7'b1111001;

end

4'b0010: begin

HEX0 = 7'b0100100;

end

4'b0011: begin

HEX0 = 7'b0110000;

end

4'b0100: begin

HEX0 = 7'b0011001;

end

4'b0101: begin

HEX0 = 7'b0010010;

end

4'b0110: begin

HEX0 = 7'b0000010;

end

4'b0111: begin

HEX0 = 7'b1111000;

end

4'b1000: begin

HEX0 = 7'b0000000;

end

4'b1001: begin

HEX0 = 7'b0010000;

end

4'b1010: begin

HEX0 = 7'b0001000;

end

4'b1011: begin

HEX0 = 7'b0000011;

end

4'b1100: begin

HEX0 = 7'b1000110;

end

4'b1101: begin

HEX0 = 7'b0100001;

end

ПЛИС Стр.3

4'b1110: begin

HEX0 = 7'b0000110;

end

4'b1111: begin

HEX0 = 7'b0001110;

end

endcase

end

endmodule

Преобразователь двоичный десятичный module bin2dec (SW, m, HEX0, HEX1);

input [3:0] SW; output [3:0] m;

output [6:0]HEX0; output reg [6:0]HEX1;

wire z;

assign z = SW > 4'b1001;

wire [3:0] scheme_A = SW[2:0] - 3'b010;

mul2_1 mul ( .SW({z ,scheme_A,SW[3:0]}), .LEDG(m) );

decoder dec ( .SW(m), .HEX0(HEX0));

always @ * begin

if ( z==0 ) begin HEX1 = 7'b1000000;

end else begin

HEX1 = 7'b1111001;

end

end

endmodule

Преобразователь десятичный в двоичный module dec_to_bin (SW, LEDG);

input [7:0] SW; output [6:0] LEDG;

wire [6:0] from_dec; reg [6:0] to_sum;

dec_decoder dec ( .SW(SW[7:4]), .d(from_dec) );

assign LEDG = to_sum;

always @ * begin

if (SW[3:0] < 4'b1010) begin

ПЛИС Стр.4

to_sum = SW[3:0] + from_dec; end else begin

to_sum = 7'b0000000;

end

end

endmodule

RS триггер

module RS_trig(

input nR, input nS, output Q, output nQ);

assign Q = ~(nS & nQ); assign nQ = ~(nR & Q);

endmodule

Д защелка

module d_latch_bhv(

input d, input en,

output reg q);

always @(en, d) begin

if (en) q <= d; // запись else q<= q; // хранение

end

endmodule

Д триггер

module dff_bhv( input d,

input clk, input set, input rst, input en, output reg q);

always @(posedge clk or posedge set or posedge rst ) begin if (rst) q <= 1'b0;

else begin

if (set) q <= 1'b1; else begin

if (en) q <= d; else q <= q;

end

end

end endmodule

Сдвиговый регистр

module register_bhv( input [7:0] d,

input clk,

ПЛИС Стр.5

input rst, input en,

output reg [7:0] q); initial q <= 8'b0;

always @(posedge clk or posedge rst) begin if (rst) q <= 7'b0;

else begin

if (en) q <= d; else q<= q;

end

end endmodule

Сдвиговый регистр вправо (вроде)

module direct_shift_reg(ISb, EN, DIR,CLK, RST, OUT, OSb);

input ISb; input EN; input DIR; input CLK; input RST;

output reg OSb; output reg [3:0]OUT;

always @(posedge CLK) begin if (RST)begin

OSb <= 1'b0; OUT <= 4'b0;

end else begin if (EN) begin

if (DIR) begin

OUT <= {ISb, OUT[3:1]}; OSb <= OUT[0];

end else begin

OUT <= {OUT[2:0]}; OSb <= OUT[3];

end

end else begin OUT <= OUT; OSb <= 1'b0;

end

end

end

endmodule

Схема синхронизации

module sync_scheme (IN, CLK, q);

input IN; input CLK; output reg q;

reg [2:0] d_reg = 3'b0;

always @(posedge CLK) begin d_reg <= {IN, d_reg[2:1]};

ПЛИС Стр.6

q <= d_reg[1] & ~d_reg[0];

end

endmodule

Счетчик

module counter_8bit( input clk,

input en, input rst,

output reg [7:0] counter); initial counter = 8'b0;

always @(posedge clk or posedge rst) begin if (rst) counter <= 0;

else begin

if (en) counter <= counter + 1; else counter <= counter;

end

end endmodule

ПЛИС Стр.7