Menu
Coddy logo textTech

Параметры

Часть раздела Основы путешествия по 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];
endmodule

Localparam

Элемент 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 для констант, которые не должны меняться.

challenge icon

Задание

Добавьте параметр с именем WIDTH со значением по умолчанию 4.

Что нужно сделать:

  1. Добавьте параметр с именем WIDTH
  2. Установите его значение по умолчанию равным 4
  3. Параметр помещается внутрь #( ) после имени модуля

Попробуйте сами

module counter #(
  // Добавьте параметр WIDTH здесь со значением по умолчанию 4
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы