Параметры
Часть раздела Основы путешествия по Verilog на Coddy — урок 11 из 90.
Вы можете создавать множество копий одного и того же модуля и использовать их в разных местах — это называется **несколькими экземплярами** (multiple instances). Вместо того чтобы писать один и тот же код снова и снова, вы пишете его один раз и используете повторно столько раз, сколько нужно. Каждый экземпляр представляет собой отдельную копию этого оборудования на кристалле.
Но что, если вам нужно, чтобы каждая копия была разной? Например, один 8-битный counter, один 16-битный counter и один 32-битный counter. Без параметров вам пришлось бы написать три отдельных модуля.
Параметры (parameter) решают эту проблему.
Параметр — это постоянное значение (parameter), которое вы можете задать при создании экземпляра. Он позволяет по-разному настраивать каждую копию модуля.
Объявление параметров
module counter #(
parameter WIDTH = 8
)(
input clk,
output reg [WIDTH-1:0] count
);
always @(posedge clk) count <= count + 1;
endmodule#(parameter WIDTH = 8) определяет parameter с именем WIDTH со значением по умолчанию 8.
При объявлении параметров мы используем символ # сразу после имени модуля и перед списком портов. Символ # указывает Verilog, что далее следует список параметров, настраивающих модуль. Если в вашем модуле нет параметров, вы просто пропускаете #.
Использование параметров
Параметры можно использовать везде, где требуется константа:
reg [WIDTH-1:0] data; // Размер вектора
count <= count + 1; // Работает с любой шириной
assign out = data[WIDTH-1]; // Позиция MSBПереопределение параметров
Когда вы используете `module`, вы можете изменить значение `parameter`:
// Ширина по умолчанию (8 бит)
counter u1 (.clk(clk), .reset(reset), .count(count1));
// Переопределение на 16 бит
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));Multiple Parameters
Вы можете использовать несколько параметров:
module fifo #(
parameter DEPTH = 16,
parameter WIDTH = 8
)(
input clk, wr_en, rd_en,
input [WIDTH-1:0] data_in,
output [WIDTH-1:0] data_out
);
reg [WIDTH-1:0] memory [0:DEPTH-1];
endmoduleLocalparam
Элемент localparam работает аналогично, но не может быть переопределён извне:
module example;
localparam STATE_IDLE = 2'b00;
localparam STATE_RUN = 2'b01;
localparam STATE_STOP = 2'b10;
// These values are fixed inside this module
endmoduleИспользуйте localparam для констант, которые не должны меняться.
Задание
Добавьте параметр с именем WIDTH со значением по умолчанию 4.
Что нужно сделать:
- Добавьте параметр с именем
WIDTH - Установите его значение по умолчанию равным
4 - Параметр помещается внутрь
#( )после имени модуля
Попробуйте сами
module counter #(
// Добавьте параметр WIDTH здесь со значением по умолчанию 4
)(
input clk,
input reset,
output reg [WIDTH-1:0] count
);
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial