Задание следующее:
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 рассчитаны неправильно.")
Эвелина
Самгупс
Очень хороший исполнитель , рекомендую. Не подведёт . Работы качественные . Оценка 5+++++...
Андрей
Московский Авиационный Институт
Очень быстро и качественно, человек очень хорошо знает материал, обращайтесь, не пожалеете
Павел
ГУМРФ
Все хорошо,все устроило,общается с закащиком, спрашивает что конкретно нужно.
Евгений
Нгту
Очень грамотный специалист, действительно мастер своего дела! Рекомендую!!!!!!!!! без наре...