пятница, 27 мая 2022 г.

CRC-15/CAN

Решил закрепить навык синтеза алгоритмов CRC с числом бит не кратным 8. Вот что получилось для CRC-15/CAN.
CRC-15/CAN
width=15 poly=0x4599 init=0x0000 refin=false refout=false xorout=0x0000 check=0x059e name="CRC-15"
Таблицы и коды при вычислении выравниваются по старшему биту.
// Табличный алгоритм CRC-15 для таблиц 16 значений
CRC16	CRC15_update(CRC16 crc, uint8_t val){
	crc<<=1;
	crc^= (val<<8);
	crc = (crc << 4) ^ CRC15_Lookup[(crc>>12) & 0xF];
	crc = (crc << 4) ^ CRC15_Lookup[(crc>>12) & 0xF];
	return (crc>>1);
}
// Табличный алгоритм CRC-15 для таблиц 256 значений
CRC16	CRC15_update(CRC16 crc, uint8_t val){
	crc<<=1;
	crc^= (val<<8);
	crc = (crc << 8) ^ CRC15_Lookup[crc>>8];
	return (crc>>1);
}

static const uint16_t CRC15_Lookup[] = {
0x0000, 0x8B32, 0x9D56, 0x1664, 
0xB19E, 0x3AAC, 0x2CC8, 0xA7FA,
0xE80E, 0x633C, 0x7558, 0xFE6A, 
0x5990, 0xD2A2, 0xC4C6, 0x4FF4,
. . .
};

понедельник, 23 мая 2022 г.

CRC-5/BITMAIN Алгоритм для расчета и проверки контрольных сумм

CRC-5 обнаружил в проекте cgminer в ужасной реализации. Вычисления производятся по битам и далеко не самым оптимальным образом. Решил разобраться, почему и что это вообще за CRC такой. Из кода выяснил, что алгоритм похоже использует полином x^5+x^2+1(0x05). В таблицах нашел алгоритм CRC-5/USB с полиномом 0x05. Это тот же полином, только не ясно, как сделать алгоритм одинаково эффективно работающий с байтами и битами. В коде встречаются варианты применения алгоритма как к битовым строкам так и байтам. Решение такое: расчитать таблицу умножения для полинома и использовать табличные подстановки. Чтобы "подобрать" алгоритм для CRC5 сначала реализовал расчет CRC-5/USB, потому что для него есть точное определение в базе и прверочные числа.
CRC-5/USB
width=5 poly=0x05 init=0x1f refin=true refout=true xorout=0x1F check=0x19 name="CRC-5/USB"
CRC-5/BITMAIN
width=5 poly=0x05 init=0x1f refin=false refout=false xorout=0x0 check=0x0F name="CRC-5/BITMAIN"
Формат записи характеристик алгоритма: разрядность, полином, маска инициализации, отражение бит на входе и выходе алгоритма, маска инверсии на выходе и контрольная сумма от строки "123456789". Данных по CRC-5/BITMAIN не было, я даже не был уверен что это возможно. Сразу не получилось подобрать алгоритм, потому что неясно было, как выполнять выравнивание данных при пяти битах. Я начал с реализации табличного алгоритма для CRC-5/USB. Сделал алгоритм с табицей 16 элементов (умножение на 4 бита).
 Таблица подстановки для CRC-5/USB
0x00, 0x16, 0x05, 0x13,
0x0A, 0x1C, 0x0F, 0x19,
0x14, 0x02, 0x11, 0x07,
0x1E, 0x08, 0x1B, 0x0D,
Структура алгоритма точно такая же, как и для CRC-8.

uint8_t    CRC5USB_update(uint8_t crc, uint8_t data) 
{
  crc = crc ^ data;
  crc = (crc>>4) CRC5USB_Lookup4[crc&0xF];
  crc = (crc>>4) CRC5USB_Lookup4[crc&0xF];
  return crc&0x1F;
}
Если таблица имеет размер 256 элементов, алгоритм еще упроститься

uint8_t    CRC5USB_update(uint8_t crc, uint8_t data) 
{
  crc = crc ^ data;
  crc = CRC5USB_Lookup[crc];
  return crc;
}
Для CRC-5/BITMAIN сгенерировал таблицу умножения 256 элементов (умножение на 8 бит). В таблице и в алгоритме число 5 бит выравниывается по старшему разряду. Алгоритм работает над байтами,

uint8_t    CRC5_update(uint8_t crc, uint8_t data) 
{
  crc = (crc<<3) ^ data;
  crc = CRC5_Lookup[crc];
  return (crc>>3);
}
Для реализации в микроконтроллере мы обычно используем маленькие табицы по 16 элементов

uint8_t    CRC5_update(uint8_t crc, uint8_t data) 
{
  crc = (crc<<3) ^ data;
  crc = (crc<<4) ^ CRC5_Lookup[crc>>4];
  crc = (crc<<4) ^ CRC5_Lookup[crc>>4];
  return (crc>>3);
}
Алгоритм CRC можно дробить на любое число бит 1...8.
// шаг алгоритма для 1..8 бит
crc = crc ^ data;
crc = (crc << bits) ^ CRC5_Lookup[crc>>(8-bits)];
Таким образом можно посчитать CRC5, если число бит в битовой строке не кратно восьми. Данные при этом должны выравниваться по старшему биту.
 Таблица подстановки для CRC5
0x00, 0x28, 0x50, 0x78, 0xA0, 0x88, 0xF0, 0xD8,
0x68, 0x40, 0x38, 0x10, 0xC8, 0xE0, 0x98, 0xB0,
0xD0, 0xF8, 0x80, 0xA8, 0x70, 0x58, 0x20, 0x08,
0xB8, 0x90, 0xE8, 0xC0, 0x18, 0x30, 0x48, 0x60,
0x88, 0xA0, 0xD8, 0xF0, 0x28, 0x00, 0x78, 0x50,
0xE0, 0xC8, 0xB0, 0x98, 0x40, 0x68, 0x10, 0x38,
0x58, 0x70, 0x08, 0x20, 0xF8, 0xD0, 0xA8, 0x80,
0x30, 0x18, 0x60, 0x48, 0x90, 0xB8, 0xC0, 0xE8,
0x38, 0x10, 0x68, 0x40, 0x98, 0xB0, 0xC8, 0xE0,
0x50, 0x78, 0x00, 0x28, 0xF0, 0xD8, 0xA0, 0x88,
0xE8, 0xC0, 0xB8, 0x90, 0x48, 0x60, 0x18, 0x30,
0x80, 0xA8, 0xD0, 0xF8, 0x20, 0x08, 0x70, 0x58,
0xB0, 0x98, 0xE0, 0xC8, 0x10, 0x38, 0x40, 0x68,
0xD8, 0xF0, 0x88, 0xA0, 0x78, 0x50, 0x28, 0x00,
0x60, 0x48, 0x30, 0x18, 0xC0, 0xE8, 0x90, 0xB8,
0x08, 0x20, 0x58, 0x70, 0xA8, 0x80, 0xF8, 0xD0,
0x70, 0x58, 0x20, 0x08, 0xD0, 0xF8, 0x80, 0xA8,
0x18, 0x30, 0x48, 0x60, 0xB8, 0x90, 0xE8, 0xC0,
0xA0, 0x88, 0xF0, 0xD8, 0x00, 0x28, 0x50, 0x78,
0xC8, 0xE0, 0x98, 0xB0, 0x68, 0x40, 0x38, 0x10,
0xF8, 0xD0, 0xA8, 0x80, 0x58, 0x70, 0x08, 0x20,
0x90, 0xB8, 0xC0, 0xE8, 0x30, 0x18, 0x60, 0x48,
0x28, 0x00, 0x78, 0x50, 0x88, 0xA0, 0xD8, 0xF0,
0x40, 0x68, 0x10, 0x38, 0xE0, 0xC8, 0xB0, 0x98,
0x48, 0x60, 0x18, 0x30, 0xE8, 0xC0, 0xB8, 0x90,
0x20, 0x08, 0x70, 0x58, 0x80, 0xA8, 0xD0, 0xF8,
0x98, 0xB0, 0xC8, 0xE0, 0x38, 0x10, 0x68, 0x40,
0xF0, 0xD8, 0xA0, 0x88, 0x50, 0x78, 0x00, 0x28,
0xC0, 0xE8, 0x90, 0xB8, 0x60, 0x48, 0x30, 0x18,
0xA8, 0x80, 0xF8, 0xD0, 0x08, 0x20, 0x58, 0x70,
0x10, 0x38, 0x40, 0x68, 0xB0, 0x98, 0xE0, 0xC8,
0x78, 0x50, 0x28, 0x00, 0xD8, 0xF0, 0x88, 0xA0,

среда, 11 мая 2022 г.

Хеш платы для Майнинга

С начала проекта мы наплодили множество версий хеш плат. Некоторые из них не нашли своего заказчика. Ищут.

Платы мы будем именовать по оригинальным названиям, имея ввиду, что наши платы являются аналогами и используют те же микросхемы ASIC. Во всех платах используется собственная оригинальная схема питания, совсем другие микросхемы и контроллеры, другая разводка платы, иная компоновка. Наши платы показывают большую надежность и устойчивость. Имеют гораздо меньшие габариты за счет эффективности водоблоков и компоновки плат.

Основные направления: 1) Совместимость. В совместимой версии платы мы оставляем то же количество чипов. 2) Производительность. Производительность оцениваем по числу гигахеш в секунду. 3) Эффективность.

S19 Hyd. Совместимые

Размер платы: 210мм х 96мм, 76 ASIC Bitmain BM1398, водяное охлаждение одностороннее. 1790 электронных компонент. 8100 контактных площадок, 4600 отверстий. Производительнсть 35-40 ТН/s

S19 Pro Hyd. Производительные

Размер платы: 210мм х 126, 114 ASIC Bitmain BM1398, водяное охлаждение двустороннее. 2290 электронных компонент. 10700 контактных площадок, 8400 отверстий. Производительнсть 50-60 ТН/s

S19 XP Hyd. Перспективные

Данные не раскрываются

L3+ Hyd. Экспериментальные

Размер платы: 150мм х 120мм, 96 ASIC Bitmain BM1485, водяное охлаждение. 1300 электронных компонент. 5660 контактных площадок, 8990 отверстий.