Дописал загрузчик, теперь я уверен, что он из процессора точно ничего не выкидывает при трансляции проекта: Финальный отчет
Заодно отвечу на комментарий:
Сколько MIPS и на какой частоте заработает на вашей FPGA?
Проваленная временная константа — это из-за высокой заданой частоты на входе. При заданой частоте в 50МГц (стандартная для стартер кита для Spartan3E) он[транслятор ISE :)] не особо старается упаковывать проект и максимально возможную частоту работы не показывает.
Максимальная частота работы получилась 79.5Мгц для кристала Spartan3E xc3s500. Самая длинная линия на умножителе. Следом за ней идут линии на сумматоре и компараторе.
Простор для оптимизации есть — сейчас процессор такт выборки команды просто простаивает, в этот такт можно вынести какие-либо предварительные вычисления.
MIPS будет в 2 раза ниже частоты, на которой работает процессор.
Я там только АЛУ начинал строить. Забросил на моменте, когда понял, что будет куча «копипаста» вручную по одному блоку. Хотя, проблему копипаста можно решить через моды админки.
function BinarySearch(value: integer; arr: PIntegerArray; size: integer): integer;
var
mask: cardinal;
index: cardinal;
begin
mask := $80000000;
while mask > size do
mask := mask shr 1;
index := 0;
while mask > 0 do
begin
index := index or mask;
if (index >= size) or (arr[index] > value) then
index := index and not mask;
if arr[index] = value then
Exit(index);
mask := mask shr 1;
end;
Result := -1;
end;
Заодно проверил время выполнения. В несколько раз больше времени выполнения классического алгоритма. Понял, что я полный нуб и мне еще учиться и учиться. :)
function BinarySearch(value: integer; arr: PIntegerArray; size: integer): integer;
var
mask: cardinal;
index: cardinal;
begin
mask := $80000000;
while mask > size do
mask := mask shr 1;
index := 0;
while mask > 0 do
begin
index := index or mask;
if (index >= size) then
index := index and (not mask)
else if arr[index] > value then
index := index and (not mask)
else if arr[index] = value then
break;
mask := mask shr 1;
end;
if (index < size) and (arr[index] = value) then
Result := index
else
Result := -1;
end;
Решил попробовать использовать не деление массива на 2 части, а постепенный спуск по маске. Скорее всего, это работает медленнее, чем уже приведенные решения.
Написано не сходу. Первые 2-3 прогона вычислял глюки (не искало нулевой элемент). Дальше еще несколько прогонов улучшал читаемость.
Даже близко не приблизился к 10%, которые могут сходу без тестовых прогонов и отладки написать решение.
В качестве развлечения и развеивания скуки на работе отлично подошло.
Вот лично я телепатией не обладаю. И когда давным-давно регистрировался, не мог предположить, что ответ на секретный вопрос будет нужен для чего-то кроме восстановления пароля, который я забывать не собирался, а ответ на секретный вопрос считал лазейкой для взлома.
3 дня позже ввели. Предположительно, против голдселлеров, у которых была схема «купил» игру — покричал в дженерал чате — словил бан — отозвал деньги — «купил» игру — …
Я, конечно, еще только новичок. Изучал по githowto консоль. После изучения попробовал поставить пару gui-систем. Не понравились. Какой-то костыльный дизайн у них был (похоже, сначала делалась консоль, а потом пытались сделать gui).
Так и остался с консолью. Продолжаю изучать и пополнять список alias'ов в своем PortableGit.
Возможно, найду еще удобную gui, но позже, а сейчас даже желания нет… :)
Я тоже githowto проходил. Тоже самое, что в этом курсе, но «с чувством, с толком, с расстановкой». Объяснено все подробнее, проходится, конечно, уже не за 15 минут, а за несколько часов, но оно стоит этого времени.
Финальный отчет
Заодно отвечу на комментарий:
Проваленная временная константа — это из-за высокой заданой частоты на входе. При заданой частоте в 50МГц (стандартная для стартер кита для Spartan3E) он[транслятор ISE :)] не особо старается упаковывать проект и максимально возможную частоту работы не показывает.
Максимальная частота работы получилась 79.5Мгц для кристала Spartan3E xc3s500. Самая длинная линия на умножителе. Следом за ней идут линии на сумматоре и компараторе.
Простор для оптимизации есть — сейчас процессор такт выборки команды просто простаивает, в этот такт можно вынести какие-либо предварительные вычисления.
MIPS будет в 2 раза ниже частоты, на которой работает процессор.
Взгляд на проект с высоты птичьего полета:
один
два
Можно протестировать уже на вполне реальном железе, а потом отдать на перевод в кремний (и впоследствии «китаю» на производство).
Хотелось и уместиться в объем статьи, и при этом сделать что-то более-менее законченное.
Хм, как всегда хорошая мысля, приходит опосля. Надо было начать статью с рассказа о конечных автоматах и раскрутить их идею до уровня процессора.
Заодно проверил время выполнения. В несколько раз больше времени выполнения классического алгоритма. Понял, что я полный нуб и мне еще учиться и учиться. :)
Решил попробовать использовать не деление массива на 2 части, а постепенный спуск по маске. Скорее всего, это работает медленнее, чем уже приведенные решения.
Написано не сходу. Первые 2-3 прогона вычислял глюки (не искало нулевой элемент). Дальше еще несколько прогонов улучшал читаемость.
Даже близко не приблизился к 10%, которые могут сходу без тестовых прогонов и отладки написать решение.
В качестве развлечения и развеивания скуки на работе отлично подошло.
Так и остался с консолью. Продолжаю изучать и пополнять список alias'ов в своем PortableGit.
Возможно, найду еще удобную gui, но позже, а сейчас даже желания нет… :)
Сделать что-то на публику за 15 минут. Но перед этим учиться несколько лет.