Parameters
Часть раздела Основы путешествия по Verilog на Coddy. Урок 11 из 90.
Вы можете создать много копий одного и того же module и использовать их в разных местах. Это называется **множественными экземплярами**. Вместо того чтобы снова и снова писать один и тот же код, вы пишете его один раз и повторно используете столько раз, сколько нужно. Каждый экземпляр — это отдельная копия этого аппаратного блока на микросхеме.
Но что, если вам нужно, чтобы каждая копия была разной? Например, один 8-битный счётчик, один 16-битный счётчик и один 32-битный счётчик. Без параметров вам пришлось бы написать три отдельных модуля.
Параметры решают эту проблему.
parameter — это постоянное значение, которое можно задать при создании экземпляра. Это позволяет по-разному настроить каждую копию модуля.
Объявление параметров
module counter #(
parameter WIDTH = 8
)(
input clk,
output reg [WIDTH-1:0] count
);
always @(posedge clk) count <= count + 1;
endmoduleКонструкция #(parameter WIDTH = 8) определяет параметр с именем WIDTH и значением по умолчанию 8.
При объявлении параметров мы используем символ # сразу после имени модуля и перед списком портов. Символ # сообщает Verilog, что далее следует список параметров, которые настраивают модуль. Если у вашего модуля нет параметров, вы просто полностью пропускаете #.
Использование параметров
Параметры можно использовать везде, где требуется константа:
reg [WIDTH-1:0] data; // Размер вектора
count <= count + 1; // Работает с любой шириной
assign out = data[WIDTH-1]; // Позиция MSBПереопределение параметров
При использовании модуля можно изменить значение parameter:
// Ширина по умолчанию (8 бит)
counter u1 (.clk(clk), .reset(reset), .count(count1));
// Переопределение на 16 бит
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));Несколько параметров
Можно использовать несколько параметров:
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 похож на parameter, но не может быть переопределён извне:
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 для констант, которые не должны изменяться.
Задание
Добавьте parameter с именем WIDTH со значением default 4.
Что нужно сделать:
- Добавьте parameter с именем
WIDTH - Установите его значение default равным
4 - parameter находится inside
#( )после имени module
Попробуйте сами
module counter #(
// Добавьте параметр WIDTH здесь со значением по умолчанию 4
)(
input clk,
input reset,
output reg [WIDTH-1:0] count
);
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogАппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicПотренируйтесь самостоятельно: Онлайн-компилятор Verilog