Задание следующее:
1. Запустить baseline-проект на FPGA - ВЫПОЛНЕНО
2. Разработка исполняемой модели и микроархитектуры блока нейропроцессора.
Исполняемая модель должна быть написана на Python, содержать исключительно операции, реализуемые непосредственно в аппаратуре, и без использования сторонних библиотек.
Микроархитектурная диаграмма - структура блока в терминах облаков комбинационной логики и регистров + таблица с пояснением, какие именно вычисления производятся на каждом такте синхросигнала. - ВЫПОЛНЕНО (код представлен ниже)
3. Разработка RTL-модели блока нейропроцессора, написание симуляционного теста, отладка в симуляторе - НЕОБХОДИМО ВЫПОЛНИТЬ
4. Натурное тестирование блока нейропроцессора на FPGA - - НЕОБХОДИМО ВЫПОЛНИТЬ
В пунктах 2-3 необходимо написать код (сначала на питоне, пункт 2), а потом перевести это на Verilog (пункт 3). Там код должен делать следующее:
Блок SoftMax (нормализация входного вектора) с программируемой размерностью данных
Описание: Рассчитать выходные значения слоя SoftMax по заданным входным значениям и указанному размеру n данных
Входные данные: n 32-битных значений, одно 8-битное значение размерности n данных
Выходные данные: n 8-битных значений с фиксированной точкой
Необходимое ПО:
Рабочая плата: Digilent Nexys4-DDR (Artix-7 FPGA): https://store.digilentinc.com/nexys-4-ddr-artix-7-fpga-trainer-board-recommended-for-ece-curriculum/ (если что, есть на руках)
САПР для симуляции и имплементации: Vivado Design Suite 2019.1 (WebPack, бесплатная версия) - если что, установлен на мой ПК
Для взаимодействия с платой: нужен дистрибутив WinPython с установленным пакетом pyserial - если что, установлен на мой ПК
Код из 2-го пункта на Python:
import random
import math
def softmax(input_values):
# Преобразование входных значений в экспоненциальные значения
exp_values = []
for value in input_values:
exp_values.append(my_exp(value))
# Рассчет суммы экспоненциальных значений
sum_exp_values = sum(exp_values)
# Рассчет выходных значений SoftMax
softmax_values = []
for value in exp_values:
softmax_values.append(round(value / sum_exp_values * 255, 5))
return softmax_values
def my_exp(x):
result = 1.0
factorial = 1.0
for i in range(1, 50):
factorial *= i
result += x**i / factorial
return result
# Входные данные
n = 5
input_values = []
for _ in (range(n)):
x = int(random.uniform(-10.0, 10.0))
input_values.append(x)
# input_values = [1.5, 2.3, 0.8, 1.2, 2.1]
# Рассчет выходных значений SoftMax
output_values = softmax(input_values)
print("Входные значения:", input_values)
print("Размерность данных:", n)
print("Выходные значения SoftMax:", output_values)
# ТЕСТ
# Функция для проверки правильности подсчета SoftMax
def test_softmax():
# Входные данные
n = 5
input_values = []
for _ in range(n):
x = random.uniform(-10.0, 10.0)
input_values.append(x)
# Вычисление ожидаемых значений SoftMax с помощью библиотеки math
expected_values = []
for value in input_values:
expected_values.append(round(math.exp(value) / sum(math.exp(x) for x in input_values) * 255, 5))
# Вычисление выходных значений SoftMax с помощью функции softmax
output_values = softmax(input_values)
# Проверка правильности значений
for i in range(n):
if output_values[i] != expected_values[i]:
return False
return True
# Выполнение теста и вывод результата
if test_softmax():
print("Тест пройден: выходные значения SoftMax рассчитаны правильно.")
else:
print("Тест не пройден: выходные значения SoftMax рассчитаны неправильно.")
Андрей
ВГУ
ОТличный специалист. Работа была сделана на совесть, приятно что досрочно. Ответственный с...
Алексей
АмГУ
Работа выполнена досрочно, на отлично... Но преподавателем были изменены исходные данные, ...
Анна
МИЭТ
Работы выполнены на высшем уровне. Все требования и замечания к заказу учтены. Работы были...
Сергей
НИЯУ МИФИ
Исполнитель выполнил работу досрочно, было не много замечаний, но преподаватель зачёл рабо...