Menu
CoddyTech

Параметры

Часть раздела Основы путешествия по Verilog на Coddy. Урок 11 из 90.

Вы можете создавать множество копий одного и того же модуля и использовать их в разных местах. Это называется **множественными экземплярами**. Вместо того чтобы снова и снова писать один и тот же код, вы пишете его один раз и повторно используете столько раз, сколько нужно. Каждый экземпляр — это отдельная копия этого аппаратного блока на микросхеме.

Но что, если вам нужно, чтобы каждая копия была другой? Например, один 8-битный счётчик, один 16-битный счётчик и один 32-битный счётчик. Без параметров вам пришлось бы написать три отдельных модуля.

Параметры решают эту проблему.

Параметр — это постоянное значение, которое можно задать при создании экземпляра. Оно позволяет настраивать каждую копию модуля по-разному.

Объявление параметров

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

Переопределение параметров

При использовании модуля можно изменить значение параметра:

// Ширина по умолчанию (8 бит)
counter u1 (.clk(clk), .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];
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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog