О Verilog для теста
.pdfVerilog |
Ъ |
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
