?

Log in

No account? Create an account

Мучаем 5576ХС4Т - часть 'h34 - ускоренные перемножители
nabbla1
Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)
Часть 'h33 - ускоряем ВСЁ
Часть 'h34 - ускоренные перемножители

В части 'h31 мы разобрались, что делать, если обычная запись
assign C = A + B;


вызывает critical warning - timing requirements not met, при использовании довольно "длинных" (32 бит) чисел на медленных (speed grade "-3") кристаллах, если при всём при том мы надеемся работать на относительно высоких частотах.

А именно, мы предложили применить Carry Select Adder (сумматор с выбором переноса) - довольно уродское решение, но единственное из всех "ускоренных схем", которое действительно даёт выигрыш на ПЛИС.

Когда мы попытались реализовать умножитель, основанный на данном сумматоре (часть 'h33), обнаружилось, что даже 32-битный аккумулятор не получается, и нам приходится уменьшить его ширину до 28 бит. Кроме того, пришлось сделать вход сброса асинхронным, что немножко нервирует. И можно было забыть о входе синхронной загрузки, который позволил бы превратить умножитель в умножитель-накопитель (MAC, Multiply-ACcumulate).

Совсем всё плохо стало при реализации "генератора множества Мандельброта", где два умножителя-накопителя должны стоять "рядышком", а вслед за ними стоят два сумматора, вычисляющие X+Y и X-Y (см. часть 'h30). как оказалось, когда в ограниченном объёме (чтобы не удлинять пути) нужно разместить 8 сумматоров по 16 бит каждый, компоновщик (Place&Route) начинает сходить с ума - иногда ему вообще не удаётся разместить схему (no fit), и даже если удаётся - её временнЫе характеристики оказываются ужасными...

На самом деле, "ускоренные" (способные работать на высокой тактовой частоте) перемножители реализуются гораздо проще - практически "бесплатно", т.е за повышенную тактовую частоту нам не нужно расплачиваться ни увеличенным количеством ЛЭ, ни увеличенным количеством тактов! (разве что совсем чуть-чуть)



Просто не нужно зацикливаться на осуществлении сложения ЗА ОДИН ТАКТ - и внезапно всё получится.
Read more...Collapse )

Подобным образом можно реализовать и знаковые умножители.

Напомним, что на современных ПЛИС (в том числе отечественных, серии 5578ТС) есть аппаратные перемножители 18х18, осуществляющие операцию всего за один такт. Описываемый здесь материал предназначен для тех, кому нужно реализовать хоть сколько-нибудь быстрое умножение на более старых ПЛИС. Впрочем, кое-какие "хитрости", описанные здесь, пригодятся и для новых ПЛИС. Например, как "бесплатно" сделать округление "до ближайшего целого", или и вовсе "округление банкира". Слишком уж многие просто отрубают младшие биты, и сразу же на этом теряют точность вдвое!

Мучаем 5576ХС4Т - часть 'h33 - ускоряем ВСЁ
nabbla1
Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)
Часть 'h33 - ускоряем ВСЁ

Конкретнее - схему из части 'h25, которая каждую секунду передаёт на компьютер показания четырёх каналов АЦП, причём в понятной человеку форме, что потребовало умножения на константы, чтобы из "попугаев" получить вольты, а затем преобразовать двоичный код в строку с десятичной записью числа (включая запятую там, где мы скажем), запихать в нужное место в памяти и, наконец, передать по UART.

Когда я попытался синтезировать эту схему для кристалла EPF10K200SRC240-3 (аналогом которого является наша 5576ХС4Т), оказалось, что тайминги не соблюдаются практически по всей схеме! Где-то сами модули слишком медленные, где-то они по отдельности показывают приличную скорость, но из-за наличия комбинаторных выходов, соединение их между собой приводит к появлению слишком длинных путей.



Пришлось основательно покопаться в этих модулях, благодаря чему схема теперь может "честно" работать на самом медленном кристалле на частоте 80 МГц, правда, заставить перемножитель с 32-битным аккумулятором выдерживать эти тайминги так и не удалось, пришлось снизить ширину аккумулятора до 28 бит, что внесло дополнительную ошибку со ср. кв. значением 1/100 цены младшего разряда :)

Read more...Collapse )

Вот потому-то и надо было поскорее с этим вопросом разобраться, чтобы и всю последующую работу не пришлось бы также кропотливо переделывать! Увы, когда нас в институте учили верилогу, там была ПЛИС Xilinx Spartan3e, с какими-то безумными скоростями, но с генератором тактовой частоты всего на 50 МГц. С ней можно было всё что угодно делать, огроменные комбинаторные цепи накручивать - ей всё было пофиг.

Теперь приходится переучиваться :)

Оочень длинные инструкции с перекрытием
nabbla1
Всё продолжают роиться безумные идеи по поводу своего собственного процессора, исполненного на ПЛИС 5576ХС4Т, но занимающего весьма небольшой кусок от тех 9984 ЛЭ, что там есть, и способного перемножать кватернионы, нормировать их, находить матрицу, обратную к симметричной матрице 6х6, решать систему линейных уравнений, а ещё хоть иногда, хоть паршивенько, выполнять немножко тригонометрии и квадратных корней.

Тем более, как сегодня узнал, NIOS II альтеровский на flex10k и соотв. на 5576ХС4Т поставить нельзя категорически, он под более новые кристаллы.

В прошлый раз (см . Quat Core идёт на взлёт) мне хотелось сделать команды настолько примитивными, насколько возможно, чтобы не заморачиваться с декодированием. Просто у нас есть отдельные узлы - память (у ПЛИС можно дать один адрес на запись и другой адрес на чтение - "двухпортовая" но не ТРУЪ двухпортовая), АЛУ, сколько-то немножко регистров, счётчик инструкций - и мы хотим каждого индивидуально "озадачить".

Всё бы хорошо - уж точно не нужно процессору хитрых "планировщиков", пытающихся держать все узлы загруженными (иногда прибегая к out-of-order инструкциям и hyperthreading'у, когда процессор-то один, но он решил сразу взяться за два потока - одному заняться нечем - так из другого чего-нибудь возьмём!) не нужно вшитого микрокода - мы сами на микрокоде его программируем!

Но вот незадача - инструкции получаются до безобразия толстыми.
Read more...Collapse )

Интересно: а такой вариант где-нибудь реализован?

UPD. Пора все бредовые идеи собирать в каталог, чтобы не забыть. Ещё одна - про оператор "плюс-минус".

Мучаем 5576ХС4Т - часть 'h32 - ускоренные счётчики (делаем часы)
nabbla1
Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)

                    //Говнокод #411 - как узнать дату завтрашнего дня
                    public Calendar getTomorrow() {
                       Thread.sleep(1000*60*60*24);
                       return Calendar.getInstance();
                    }


Когда работаешь с медленным кристаллом ("-3"), мучением становятся даже счётчики сколько-нибудь большой разрядности. Хочешь получить импульсы с частотой 1 кГц из тактовой частоты 80 МГц (деление в 80 000 раз) - выбираешь библиотечный счётчик lpm_counter, задаёшь в Wizard'e все необходимые значения: ширина 17 бит, счёт "вверх" (up), по модулю (modulus) 80 000, дополнительный выход cout, затем жмёшь next-next-next-finish и надеешься: уж наверное авторы софта позаботились о том, чтобы максимально эффективно задействовать возможности ПЛИС.

Не тут-то было: полученный драндулет может работать максимум на 73 МГц, и это всего-то при ширине в 17 бит! Страшно подумать, что будет, если мы попытаемся сделать часы (миллисекунды для развёртки, затем секунды - десятки секунд - минуты - десятки минут - часы - десятки часов), это потребует счётчика с общей шириной 17 + 10 + 4 + 3 + 4 + 3 + 4 + 2 = 47 бит.

Смеху ради нарисуем это безобразие:

(делать часы на "счётчиках пульсаций" не предлагать - мы хотим именно СИНХРОННУЮ работу всей схемы, чтобы мы могли, к примеру, ставить метки времени куда-нибудь в телеметрию, зная, что не запишем уже обновившиеся минуты (00) и ещё не успевшие обновиться часы, после чего получим ошибку на целый час. Возмущаться, что этим должен заниматься RTC с микроамперным потреблением, работающий от MEMS-резонатора на 32768 Гц, тоже не надо - часы здесь лишь для примера - мы хотим понять КАК СОБИРАТЬ ШИРОКИЕ СИНХРОННЫЕ СЧЁТЧИКИ на медленных кристаллах)

Результат немножко ожидаем: задержка распространения на кристалле "-3" составляет 27,1 нс (36,9 МГц), более чем вдвое медленнее, чем надо! На кристалле "-2" задержка: 18,2 нс (54,95 МГц), а на кристаллах "-1", как ни странно, схема по-прежнему способна работать: получается задержка 11,9 нс (84,03 МГц) - по бровке, но жить можно.

Причина медленной работы (неспособности корректно работать на большой тактовой частоте) всё та же самая, мы должны прибавлять единичку к предыдущему числу, для чего используются всё те же самые цепи переноса. Когда у нас были все единицы, а должны получиться все нули, мы обязаны дождаться, пока перенос распространится по всем разрядам.

Когда мы объединяем несколько счётчиков - мы только усугбляем ситуацию! Теперь уже сигнал разрешения работы следующего (более старшего) счётчика будет сформирован лишь после того, как установится правильное значение на выходе cout предыдущего.

И ещё больше ситуацию усугбляет счёт не до степеней двойки, а до произвольных значений (до 80 000, до 1000, до 10 и так далее) - это значит, что вместо более-менее шустрых цепей переноса мы применяем дополнительный компаратор, что иногда требует каскадирования большого числа логических элементов (скажем, 5 штук для 17-битного счётчика).

Но в отличие от сумматоров, здесь у нас есть очень простое решение, позволяющее наращивать разрядность практически неограниченно!

Read more...Collapse )

В следующей части мы поставим в наш "генератор множества Мандельброта" быстрые счётчики и сумматоры и попытаемся всё-таки заставить его работать на ПЛИС...

Мучаем 5576ХС4Т - часть 'h31 - ускоренные сумматоры
nabbla1
Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)

Все рассмотренные в предыдущих главах сумматоры с шириной аккумулятора 32 бита (и перемножители на их основе) синтезируются без проблем для кристаллов EPF10K200SRC240-1 и EPF10K200SRC240-2 (более "шустрые" чипы), но в случае EPF10K200SRC240-3 мы нарываемся на Critical warning: слишком велико время распространения сигнала, вместо требуемой частоты в 80 МГц мы можем получить разве что 57 МГц. А именно этому кристаллу (согласно "инструкции по программированию") соответствует Воронежский 5576ХС4Т и 5576ХС4Т1...

И увы, "вычислитель множества Мандельброта" хорошо заработал на симуляторе, на "быстром" кристалле, но основательно заглючил на реальной ПЛИС - она действительно не самая шустрая, и соответствует в лучшем случае "-2", а может и действительно "-3".

Не уверен, что нам действительно стоит гонять её на частоте в 80 МГц, в своих изделиях мы использовали 50 МГц, но именно такой генератор стоит в макетке, да и в целом получить запас по частоте - всегда неплохо! Так что посмотрим: можно ли осуществить 32-битное суммирование быстрее, чем это синтезируется "по умолчанию", когда используешь знак "+" или модуль lpm_add_sub.

Read more...Collapse )

В следующей части покажем, как сделать синхронные счётчики большой ширины (22 бита и выше), которые также смогут надёжно работать на медленных кристаллах. Со счётчиками всё куда проще :)

Мучаем 5576ХС4Т - часть 'h30 - вычислитель множества Мандельброта
nabbla1
Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)

С днём радио всех причастных!

По такому поводу самое время отойти от скучного верилога и нарисовать схему электрическую принципиальную :)

Вот он, вычислитель множества Мандельброта! Голубым обозначен провод тактовой частоты clk (чтобы не сильно отвлекал от всего остального), светло-зелёным - цепи сброса.


Сейчас тут много "отладочных" выходов, чтобы понять, как оно функционирует, а вообще внешние соединения весьма скромны - два входа (тактовая частота clk и импульс запуска start) и два выхода: ByteCE (сюда поступает единичка, когда у нас готов очередной пиксель) и Q (это и есть очередной пиксель, то есть, сколько понадобилось итераций, чтобы последовательность "убежала").

Read more...Collapse )

В следующей части мы соединим этот вычислитель с формирователем потока Zlib и передатчиком картинки PNG.

Мучаем 5576ХС4Т - часть 'h2F - знаковые умножители, тысячи их!
nabbla1
Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)

В частях 'h23 - 'h24 мы довольно подробно рассмотрели умножение беззнаковых целых чисел: как более компактные версии с аккумулятором ограниченной длины (например, 23 бита для умножения 16-битных чисел), так и наиболее честную с 32-битным аккумулятором и округлением банкира. Кстати, даже при использовании аппаратного перемножителя 18×18 бит, которые присутствуют в более новых ПЛИС, часть этого материала будет полезна, поскольку эти перемножители дают 36-битный результат, а округлить его - уже забота разработчика!

Сейчас рассмотрим умножение чисел со знаком - в нём есть свои "подводные камни", по счастью, не очень большие.



Read more...Collapse )

В следующей части мы целиком соберём "вычислитель" для множества Мандельброта.

Завершение лыжного сезона
nabbla1
30-го марта мы с estrella_de_sur завершили лыжный сезон, прокатившись по Копнинскому лесу от станции Семхоз.

Это был "исследовательский поход" - ни разу там не катались, хотели посмотреть, насколько там хорошо, можно ли выйти прямо в Сергиев Посад, не снимая лыж, или пройти к лыжным трассам в Абрамцево, Радонеж, Морозки и пр.

Вышли к большому кольцу московской железной дороги (Александров - Дмитров), а ещё встретили одиноко стоящие столбы ЛЭП, видимо, для подготовки персонала.

По пути к лыжне нас встретил такой вот персонаж:


Read more...Collapse )

Контактная сеть для самых маленьких
nabbla1
Сегодня прокатился в сторону метро Бульвар Рокоссовского, сдавал убитые свинцовые аккумуляторы (там за них немножко денег платят), и по пути встретил вот такую "ветку":


Вот так вот, за забором, отрезок железной дороги со стрелочным переводом, карликовым светофором и ОЧЕНЬ НИЗКО натянутой контактной сетью :)


Оказывается, это московский учебный центр профессиональных квалификаций от РЖД.

А ещё тут пасха была недавно, и в честь этого у Ростокинского акведука установили светящуюся штуку (см. под катом)
Read more...Collapse )

Мучаем 5576ХС4Т - часть 'h2E - делим отрезок на равные части
nabbla1
Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)

Мы хотим построить на ПЛИС множество Мандельброта - мне кажется, это хорошая тренировка как работы с большими (1920х1080) изображениями, так и выполнения арифметических операций на ПЛИС, включая работу с комплексными числами, хотя "в явном виде" вводить их здесь необязательно.

И действительную, и мнимую часть комплексного числа мы представим 16-битными знаковыми числами с фиксированной точкой с 2 битами перед запятой. Иногда такой формат называют Q2.14 (Q намекает, что мы работаем с рациональными числами, 2 бита перед запятой, 14 бит - после неё). В таком формате можно представить числа в диапазоне от -2 до 2-2-14. Для построения множества Мандельброта этого диапазона вполне достаточно - если число выходит за его границы - назад оно вернуться уже не сможет (последовательность получается расходящейся), и множеству Мандельброта данная точка не принадлежит.

Мы хотим, чтобы по оси Y помещались значения от -1 до +1, а по оси X - от -2 до ≈1,56 (для соблюдения пропорций).

И первой же задачей становится вычисление выражений
y0 = (j-540.0) / 540.0;
x0 = -2.0 + i / 540.0;


то есть, пересчитать координаты очередного пикселя (i, j) в комплексное число z0=x0 + iy0, которое этому пикселю соответствует.

Оказывается, что если мы идём от пикселя к пикселю слева направо, сверху вниз, то на каждом шаге нам достаточно двух сложений и проверки знака.


Read more...Collapse )

Смотрите в следующей части - "аппаратная" реализация выражения Z = Z2 + Z0, с проверкой на переполнение.

Poll #2092411 Целочисленная арифметика

Вычисления в целых числах:

Форева!
2(66.7%)
Красиво, но морально устарело - ставь float и не парься!
0(0.0%)
Не испытываю никаких эмоций по их поводу
1(33.3%)
Уродство, человек становится придатком компьютера, отдавая годы жизни, чтобы выжать из этой железяки последние соки!
0(0.0%)