Skip to content

djadik0/Matrix-Multiplier

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

Matrix Multiplier on SystemVerilog

Параметризуемый модуль умножения квадратных матриц на SystemVerilog, реализованный как последовательный конечный автомат с операцией multiply-accumulate для вычисления элементов результирующей матрицы.

Описание проекта

Модуль matrix_multiplier выполняет умножение двух квадратных матриц A и B размером SIZE_MATRIX x SIZE_MATRIX и формирует результирующую матрицу C.

Вычисление выполняется последовательно, поэлементно:

  • выбирается текущая ячейка C[i][j]
  • выполняется накопление суммы произведений A[i][k] * B[k][j]
  • результат сохраняется
  • автомат переходит к следующей ячейке

После завершения вычислений модуль формирует сигнал done.

Особенности реализации

  • параметризуемый размер матрицы
  • параметризуемая разрядность элементов
  • последовательное вычисление через конечный автомат
  • использование промежуточного аккумулятора
  • отдельный сигнал завершения вычисления done
  • асинхронный сброс
  • синхронная работа по фронту clk

Параметры модуля

  • SIZE_MATRIX — размер квадратной матрицы
  • WIDTH — разрядность элементов входных матриц
  • WIDTH_C — разрядность элементов выходной матрицы

По умолчанию:

parameter SIZE_MATRIX = 4;
parameter WIDTH       = 8;
parameter WIDTH_C     = 4 + WIDTH;

Интерфейс модуля

Входные сигналы

  • clk — тактовый сигнал
  • rst — асинхронный сброс, активный низким уровнем
  • start — запуск вычисления
  • A — входная матрица A
  • B — входная матрица B

Выходные сигналы

  • done — сигнал завершения вычисления
  • C — результирующая матрица

Формат данных

Входные и выходные матрицы заданы как двумерные массивы:

input  logic [WIDTH-1:0]   A [0:SIZE_MATRIX-1][0:SIZE_MATRIX-1];
input  logic [WIDTH-1:0]   B [0:SIZE_MATRIX-1][0:SIZE_MATRIX-1];
output logic [WIDTH_C-1:0] C [0:SIZE_MATRIX-1][0:SIZE_MATRIX-1];

Принцип работы

После сброса модуль переходит в начальное состояние и ожидает сигнал start.

После запуска:

  • обнуляются внутренние регистры и индексы
  • выбирается текущая ячейка результата C[i][j]
  • по индексу k выполняется накопление:
C[i][j] = Σ A[i][k] * B[k][j]
  • готовое значение сохраняется
  • автомат переходит к следующей ячейке
  • после вычисления всей матрицы формируется done

Во время вычисления итоговая матрица сначала записывается во внутренний буфер, а затем переносится на выход C.

Состояния конечного автомата

В модуле используются следующие состояния:

  • starting — ожидание сигнала start
  • mac — выполнение операций умножения и накопления
  • store_cell — сохранение результата текущей ячейки
  • next_cell — переход к следующей ячейке матрицы
  • exit — перенос результата на выход и установка done
  • STOP — завершение цикла и возврат в ожидание

Алгоритм обхода матрицы

Для вычисления результата используются три индекса:

  • i — номер строки результата
  • j — номер столбца результата
  • k — индекс суммирования

Порядок работы:

  • фиксируются i и j
  • по k вычисляется сумма произведений
  • после завершения суммирования сохраняется C[i][j]
  • затем увеличивается j
  • после завершения строки увеличивается i

Замечания по реализации

  • сигнал done формируется после завершения полного вычисления матрицы
  • выходная матрица C обновляется в конце вычисления
  • новый запуск должен выполняться из состояния ожидания
  • параметр WIDTH_C необходимо выбирать с запасом, чтобы результат умножения и последующего суммирования не переполнялся

Возможные улучшения

Дальше проект можно расширить:

  • добавить проверку на нескольких наборах матриц
  • сохранить waveform для README
  • реализовать более производительную конвейерную или систолическую архитектуру
  • добавить интерфейс valid/ready для потоковой подачи данных

Применение

Такой модуль можно использовать как учебный пример для изучения:

  • умножения матриц в RTL
  • конечных автоматов в SystemVerilog
  • последовательных вычислительных блоков
  • организации вложенных индексов в аппаратном описании
  • проектирования простых вычислительных ускорителей

Файлы

About

модуль умножения квадратных матриц на SystemVerilog

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors