Menu
Coddy logo textTech

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];
endmodule

Localparam

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

challenge icon

Задание

Добавьте parameter с именем WIDTH со значением default 4.

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

  1. Добавьте parameter с именем WIDTH
  2. Установите его значение default равным 4
  3. parameter находится inside #( ) после имени module

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

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

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

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

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

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