April 26th, 2019

Мучаем 5576ХС4Т - часть 'h2B - ускоряем Adler32

Часть 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 - ускоренные перемножители
Часть 'h35 - умножители совсем просто
Часть 'h36 - уравновешенный четверичный умножитель


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

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

И до сих пор "мне везло" - схема, которая работала на симуляторе (не выдавала Critical Warning) - работала и в железе. Конечно, над "железом" я пока не шибко издевался - охлаждение хорошее, температура практически комнатная, напряжение ядра стабильное - чего бы ему и не работать как следует??

Но всё-таки это неправильно - если в документе ГПКФ.431262.003Д4 (Микросхемы интегральные 5576ХС3Т, 5576ХС4Т. Инструкция по программированию) написано, что по основным характеристикам разработанные микросхемы соответствуют EPF10K200SRC240-3, то её и надо было задать, и разрабатывать модули так, чтобы и в этом случае никаких warning'ов не появлялось!

Вот тогда у нас появится хороший "задел" - взяв любую наперёд заданную микросхему 5576ХС4Т (без отбраковки), подвергнув её дозе облучения (разрешённой по ТУ), запустив в предельно допустимых режимах, мы по-прежнему получим стабильную работу изделия!

Самый простой способ добиться устойчивой работы - снизить тактовую частоту с 80 МГц до 50 МГц - тогда все рассмотренные нами модули заработают "как есть". При использовании отладочной платы от LDM-systems, мы можем взять тактовую частоту от контроллера Ethernet - по умолчанию он выдаёт нам 4 МГц, но сконфигурировав контроллер по SPI, мы можем повысить эту частоту до 33,3 МГц, и комфортно работать уже на них.

Но можно и "ускорить" несколько модулей, которые не хотят работать - это вполне реализуемо.

Начнём с Adler32, который единственный из всех рассмотренных нами "не захотел работать" (выдал предупреждение) на кристалле EPF10K200SRC240-2!


Когда мы попытались синтезировать его для "медленного" кристалла EPF10K200SRC240-3, мы получили следующий ужас:

Collapse )