суббота, 15 декабря 2012 г.

AMSOIL ATF no more

Избавился от Amsoil ATF (индекс вязкости 163) и в V70. Решил рискнуть и залить что-то даже погуще, чем Mobil 3309 (вязкость 180). Есть RedLine с индексом 198, Valvoline с 212, но показалось, что слишком дофига отличается от Мобила, который, вроде как, наиболее близок к тому, что под видом вольвовского оригинала продают. Поэтому купил Idemitsu Type-TLS (вязкость 184). Наверное, знакомая контора для тов. А., который жил в городе праворуких японских б/у машин :)

V70 последний месяц каталась со стаканом SeaFoam'овского растворителя. Не знаю, то ли из-за этого, то ли Амсойл уже не тот, но слитая жижа в корыте явно расслоилась и не хотела смешиваться... Ну да ладно. Толку, кстати, с Сифоама не было абсолютно, ибо Амсойл и сам хорошо моет. Только жидковат он для Айзинов, которые в Вольво ставят. Амсойловское моторное масло щас как раз движок на XC70 от Кастрола моет, почти чёрным за месяц стало.

По примеру XC70 врезал в линию обратки филтр Magnefine, потому что родной толком не почистишь, ибо доступа к нему нет. Так, можно сжатым воздухом в сливное отверстие примерно в район сетки фильтра попшикать, там грамм сто выливается ещё. Резал гидролинию (резиновый шланг, армированный капроном) Ка-баром, прям так одним движением - вжик, и готово :)

После такой радикальной смены вязкости решил сделать адаптацию, а то XC70 без адаптации первое время тупила прилично, пока не перестроилась под новую жидкость. Значит, подключил сканер, запустил Виду, и нечаянно стёр вообще все настройки адаптации в коробке :) И когда поехал адаптировать, то пока жижа не прогрелась до +85 (условие для активации адаптации),  коробка нещадно проскальзывала при переключении передач. Т.е. едешь так, вдруг пропадает тяга, обороты движка на тыщу подскакивают, потом тупой удар в спину - едем дальше. Адаптировался часа полтора, почти всё хорошо стало, но 3-4 заметно подтупливает. Ладно, жена потом по пробкам в Кембридже доадаптирует.

среда, 12 декабря 2012 г.

KA-BAR

Не курю. Нет, денег нет. Не найдёшь. А вот проверять не стоит...

Да... Сам-то с какова раёна?

Очень большой и тяжёлый... Выглядит - просто обосраться от страха! Конечно, уже порезался :)


Жену такая вещичка пугает. Говорит, что для добра такую приспособу сделать нельзя... Оружие, мол, в доме появилось... А мне нравится! Очень приятно в руке лежит, увесисто, выпускать не хочется. Армированные гидролинии в двигателе на раз, должно быть, перережет. И не только...

понедельник, 10 декабря 2012 г.

Колюще-режущее

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

Ножик - вещь зело полезная в подсобном хозяйстве, поэтому было обидно, что у меня его так легко изъяли. Решено было заиметь такой ножик, который хрен отберёшь. Теперь я счастливый обладатель KA-BAR USMC, ставшим в 42-м официальным ножом Корпуса Морской Пехоты США. От такой вот красавец:

Пилки, фонарика и отвёртки, как в Викториноксе, нету, зато сало удобней резать.

Думаю, в предверии конца света, нужно ещё Глок-17 и мешок аммиачной селитры достать. Топор и лом уже имеются.

четверг, 29 ноября 2012 г.

День индюшатского геноцида

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

Маршрут

Ехать далеко, чутка больше 1200 км, поэтому в среду выехали пораньше, в 3 дня. Как и ожидалось, на главном Массачусетском хайвее (одноимённый тёрнпайк) встали в глухую пробку. Хотя из Массачусетса до Коннектикута ехать всего ничего, километров 150, мы их успешно ехали 3.5 часа. Причём, 2.5 часа - 60 км по этому злосчастному "скоростному" шоссе.

Далее стоял вопрос ночёвки. Проехать сразу всё, после части рабочего дня, да по темноте никакой надежды не было, поэтому решили загрузиться в какой-нибудь мотель. Тут мнения с женой разошлись: я помнил, что поездка в Нью-Йорк и обратно в один день для меня было очень тяжело - я пару часиков даже на парковке в машине кемарил, а это километров 800 всего. Поэтому я голосовал за то, чтобы остановиться в Ньюбурге, штат Нью Йорк. Это 200 миль/320 километров. Жена рассчитывала на Харрисбург в Пенсильвании, это ещё столько же (330 км) пилить. А в идеале, то на Карлайзл, до которого от Харрисбурга миль 20 (30 км) - там гостинницы дешевле.

В итоге, я, пожрамши кофеиновых таблеток, с круглыми шарами, да по пустым, тёмным дорогам, немного превышая скорость, упилил дальше Карлайзла, пока жена носом клевала. Под крики негодования был вынужден съехать с хайвея и найти какой-то клоповник за сто баксов. А я ведь был готов проехать оставшиеся 5 часов...

Клоповник был отстойный, холодный, грязный, вонючий, завтрак почти отсутствовал. Но переночевали, загрузились в тележку и погнали дальше.

Значит, юг Пенсильвании застали утром. Очень печальное зрелище, прям классический бедный Юг с развалившимися хибарами вдоль дорог.  Постоянно видели вот такой знак:

Типа, "Принуждение к соблюдению скоростного режима осуществляется самолётом". Мы так сразу представили: какая-нибудь Тойота Королла чуть-чуть скорость превысила, и тут A-10 Thunderbolt делает боевой разворот и из своей 7-ствольной 30-мм ГАУ-8 разносит Короллу вклочья.



В общем, Пенсильвания нам не понравилась. Следующие штаты Мэрилэнд и Западную Вирджинию мы как-то совсем быстро проскочили, особых примет нет. Хотя, вру: в обоих Вирджиниях ограничение 70 миль в час вместо обычных 65, поэтому чутка быстрее поехали. Ну и бензин нереально дешёвый стал: обычный чуть больше 3-х долларов за галлон (3.78 л), и премиум стоит дешевле, чем обычный в Массачусетсе.

Вирджиния на фоне Пенсильвании выглядит очень прилично. Правительство там сидит, денег много, дороги строят и ремонтируют. Горы, опять же, пошли... А после съезда с I-81 South (I - interstate, межштатная; 81 - номер, South - направление на юг) мы вообще попали на Чуйский тракт с его серпантинами, только с асфальтом. Это первый раз, когда я не пожалел, что поехали на XC70: у атмосферника на V70 с ростом высоты сильно падает тяга, плюс пузо бы всё ободрал. А XC70 повыше, турбина вдувает воздуха, сколько надо, всё нормально. В остальном же, XC70 похуже. Даже прям щас вот сделаю лирическое отступление.

Значит, наша V70 нашпигована опциями по самые помидоры. На XC70 из опций только бестолковый третий ряд сидений, бестолковый датчик дождя, и всё. Потребительские свойства хуже:

- кресла так себе (в V70 оооочень удобные). Нормально свой драгоценный зад разместить не удалось. Из V70 же выходить не хочется.

- звук паршивый. Сам мафон HU-650 лишился богатых настроек эквалайзера, которые были в старых моделях (типа HU-613 на V70). На V70 ещё и динамики прокачаны. Далее, к HU-650 китайский MP3-девайс вместо чейнджера не подключишь - там какие-то проблемы с протоколом. Сзади, под полом багажника, места под сабвуфер нет, разъём не выведен. Т.е. MP3 с нормальным качеством малой кровью не поставить, как я на V70 сделал.

- этот УАЗик по полосе переставляет просто офигеть. Увеличенный клиренс, фигли. На V70 спереди стоит такая же резина (BFGoodrich Advantage), едет, как танк даже со своей убитой подвеской.

- этот УАЗик при таком же характере движения жрёт на 30% больше бензина. Если много ездить, что я сейчас и делаю, то прям сильно уплывающие деньги видно.

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

- на водительском козырьке нет Хоумлинка - это такой девайс, который можно на гаражные ворота запрограммировать, чтобы колхозные пульты не лепить ("Нет", - подумает тут читатель - "Живёт на двух этажах, в некоторых комнатах не каждую неделю бывает, две Вольво, гараж с дистанционными воротами, и, видите ли, штатный пульт от ворот - это колхоз! Козырёк кожей не обшит! Ну, буржуй!")

Есть и пара приятных моментов:

- при выезде на хайвей лениво смотрю в зеркало: метров 20 просвета есть - ну и нормально. Тапку в пол, и шведский танк под рёв своих сотен кобыл и Ньютон-метров улетает вперёд. V70 так лихо не может.

- боковые зеркала побольше, видно хорошо.

- на V70 сгорела одна или две нити подогрева водительского сиденья, попогрейка ленивей нагревается. На XC70 всё нормально, термостерилизация работает.

- кондей хороший, температуру себе выставил и забыл.

- коробка-автомат с типтроником. Типа, есть ручной режим, которым можно, например, принудительное торможение двигателем делать.

- есть прицепное устройство. Жена даже успела купить держатель для велосипедов, но вовремя обнаружил, что размер не тот, отменили заказ. Но купим нормальный размер, а то если все едем, то приходится снимать с байка колёса (или складывать задний ряд, если один еду, что тоже неудобно).

- подвеска не пробивается. На V70 заманаешься все трещинки объезжать, а на XC70 просто прёшь и прёшь. УАЗик, что говорить?..

Лирическое отступление закончено.

Значит, на ваших этих Югах все ездят на Хёндаях, Хондах и американских машинах, как больших, так и не очень. Вольву (старую S60) видели одну. Когда она нас обогнала, мы даже с тётечкой за её рулём переглянулись. Типа: "Ох, нифига ж себе! Ещё одна Вольво!".

Для встречи Дня Тотального Истребления Индюшек (убивают где-то 30 млн. штук) был арендован дом на озере. Самого дома со стороны не сфотали чё-то, вот пачка фоток, каких есть:









Как в таких случаях и положено, ели всякую еду и пили всякое пойло. Например, шашлык с коньяком:


На самом деле, я крепкое вообще не перевариваю, и насладиться всеми оттенками вкуса французского коньяка не смог :) Пиво - наше быдляцкое всё! Придёшь так, бывает, летом из гаража, откроешь холодильник, и... Ах, да, что это я?...

Кстати, в этом доме закончился газ в гриле, поэтому мы, после неуспешных попыток официально купить дрова или хотя бы заныкаться в лесу и насобирать веток, эти самые ветки нашли на соседнем участке. Следы кострища тоже потом заметали: угли были сначала замочены, потом жестоко избиты клюшкой для гольфа, и рассеяны под пристанью крышкой от мусорного бака.

В целом, всё было хорошо, только очень мало по времени, учитывая долгую дорогу.

В воскресенье встали в 5 утра, в 6:20 выехали, в 9 вечера были дома. От границы Пенсильвании с Нью-Йорком (штат который) и до самого Бостона была почти одна сплошная пробища... Сына приболел, пребывал в живомёртвом состоянии, даже песен нам не пел :(

По пути я открыл для себя энергетик: убойная доза глюкозы, витаминов B-группы, кофеин, тиамин и прочая фигня. Для таких поездок вообще отличная штука: голова светлая, не болит, глаза видят лучше, реакция быстрее, утомления нет. Жалко, что одна банка была, хватило только на полпути... А то раньше отстойное кофе покупал, Колу, шоколадки дешёвые жрал, и всё равно не помогало... А тут и помогает, и всякой особой вредности нет, типа сахара или дешёвых жиров.

Вот фотки Вирджинщины:



Справедливости ради стоит сказать, что север Пенсильвании тоже ничего так оказался, с горами.

понедельник, 19 ноября 2012 г.

Доделал XC70

Прошёл тех.осмотр, подоливал литра полтора воды в бачок охлаждайки (при первом заполнении влезло 2.7 л концентрата и литр дистиллированной воды), машина едет и не пищит. Вечером послушал шипение ещё раз - это шипит кондей. На холодной машине он включается и работает продолжительное время, а на горячей только время от времени врубается. И шипение с вырубанием компрессора пропадает. В принципе, логично: адиабатический цикл, газ при расширении должен шипеть. Запах горючесмазочных материалов под капотом тоже прошёл: приятно пахнет фунциклирующим двигателем, т.е. горячим воздухом с нотками разогретого пластика. Врезанный в линию обратки дополнительный фильтр АКПП тоже не сопливит, хотя я его патрубки в разрезанный шланг кое-как вставил.

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

Подвеска в отличном состоянии, рулевая не раздолбанная, машина высокая, светит ближним далеко, кондей-автомат температуру и вентиляцию в салоне ваще комфортно держит. Решили дать XC70 шанс показать себя в дальняке.

воскресенье, 18 ноября 2012 г.

Покой нам только снится

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

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

Теперь сижу в раздумьях: на какой машине две тыщи км ехать...

суббота, 17 ноября 2012 г.

Вентиляция картера, день 2

Утром жена разбудила со словами: "Спи, ещё рано. Как проснёшься, у меня для тебя много новостей есть". Вот и спи теперь... Оказалось, что у сына лезет первый зуб, он переворачиваться на живот научился и сидеть минуты две. Но пост отнюдь не о радостях.

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


Коллектор лежит пузом кверху на коробке из-под трансмиссионного масла. Сверху (т.е. снизу коллектора в нормальном состоянии) видно дроссельную заслонку. Турбина по воздушному тракту вдувает какое-то количество моторного масла, поэтому заслонка немного грязная. Чистить её отдельно - это мрак, поэтому я её почистил между делом. Хорошо, что это немецкий Бош, а не итальянский Магнети Марелли, как на V70, - Бошу на грязь пофиг, он её своим мощным двигателем перемалывает.

Открылся вот такой вид на движок и систему вентиляции всего (картерных газов, отвод паров кипящей охлаждайки):


Начинаем разбирать вентиляцию и смотреть состояние патрубков. Вот этот патрубок сепарационного бачка идёт в верхнюю часть картера:


Как видно, внутри лежит здоровенный кусок копоти. Вот сам вход в картер:

А вот нижний вход в картер, который обычно и страдает:
На фотографии плохо видно, но входа нет: всё наглухо забито cкоптившимся маслом. Я прям втыкал отвёртку и выкалывал куски грязи, потом всеми подручными средставми сдирал грязь со стенок, потом дополнительно пробил вход в картер.

Состояние было ужасное. А всё почему? Тому есть две причины:

1. Людям пофиг на двигатели, они на машине ездят, пока она не сломается. Даже масло не меняют.

2. Перун ещё не уничтожил сотнями молний все производственные мощности Кастрола по всему свету. А зря, ой, зря... Вольво, собственно, рекомендует это говно лить, но за такой совет кто-то у них напрашивается на удар монтировкой по балде. По удару за каждый загубленный Кастролом двигатель. В Америке, кстати, Кастрол такое же фуфло, как и в России, и в Чехии.

Ну да ладно. Вот смонтировал 100% новую вентиляцию:

Для этого пришлось крепко раскидать проводья слева (по ходу) от двигателя. Я это сделал абсолютно зря, потому что вот эта алюминиевая трубка с кучей патрубков на концах нифига не засирается, снимать её кошмарно сложно, нужно сливать ОЖ, а обратно поставить ещё сложнее. Но, раз купил всю эту байду за много денег, то куда теперь деваться?..

Во время процесса Ричард Столлман пел викингские песни голосом Квортона:

Потом жена позвала обедать. Завтра предстоит пляска с установкой коллектора, который нужно как-то надеть на гофру, и что-то сделать с тем злосчастным винтом, ради которого, по-идее, плиту навесных агрегатов снять надо (!). Но жуто не хочется... А надо бы, иначе первый цилиндр может воздух сосать...

P.S.: так испугался, что за завтра всё обратно в кучу не соберу, что пошёл вечером и собрал :)

 Завтра жена свозит в автомагазин, куплю охлаждайки, залью, воткну аккумулятор и буду смотреть, чего забыл прикрутить :)

Автомеханики страдают так же, как и программисты.

Предлагаю законодательно  утвердить такой порядок заводской сборки машин: собрать, разобрать, собрать. Первую операцию пусть хоть робот, хоть святой дух делает, но последние две - только человек. У человека из доступных инструментов - всё, что можно купить в обычном магазине. Человеку разрешено бить монтировкой конструктору по балде. Смерть конструктора от черепно-мозговой травмы признаётся несчастным случаем на производстве в следствие злобного нарушения ТБ. Хотя, откуда там в черепе мозг?...

Нет, известно, что есть write-only языки типа Perl, на которых код можно только писать, а прочитать и понять его сложно. Ровно такая фигня - вольвовский двигатель B5254T2. Один болт, держащий впускной коллектор, прикрыт гнездом посадочного места термостата. Подлезть к нему можно, но головка из-за такого близкого соседства не может встать. Длинный накидной ключ, просунутый с рукой под коллектором с другой стороны, тоже не может головку зацепить. Открытый ключ есть, но он короткий, длины руки не хватает. Мда...

За полтора часа погонял на машине с целью прогрева масла, заехал передком на рампы, выдернул аккумулятор, долил грамм 300 (!) дистиллированной воды во все 6 банок, поставил заряжаться, поменял две реактивные тяги, прочистил два клапана переменного газораспределения (с сопутствующим раскидыванием подкапотного добра), слил масло, поменял маслянный фильтр, поменял воздушный фильтр, вытащил и почистил датчик воздушного массметра, скинул хренову тучу турбо-патрубков, отцепил топливную магистраль от рейки, выдернул рейку из коллектора, открутил пять болтов коллектора, а на шестом - оп!

Три часа с ним танцевал, уж больно не хотелось сливать охлаждайку, снимать приводной ремень и насос ГУР, чтобы подобраться к гнезду термостата только. "Повезло", что прокладку коллектора уже меняли, похоже, и болт тот злосчастный не был до упора закручен, и у коллектора этим болтом ухо с прорезью держится. Поэтому удалось коллектор покрутить-поперекашивать, и болт сдался достаточно, чтобы железку сдёрнуть удалось.

Но к этому светлому моменту я от паров бензина, слитого в корыто масла и прочей применённой химии вконец угорел, пошёл домой писать этот злобный пост ненависти и принимать лекарство.

Двигатель, кстати, конкретно засранный... Маслице своё любимое за год ближайший раза 3 ещё поменяю, на V70 тоже сначала чёрное говно через полторы тыщи км сливал.

Из положительных моментов: XC70 такая высокая, что, будучи поднятой на рампы, работать под капотом невозможно - роста не хватает. Ещё поначалу душила жаба,что впорол столько денег на полность новую вентиляцию картера (типа, а чё, можно и старую почистить), но после таких приключений с коллектором нафиг бы я туда ещё полез раньше, чем через 10 лет!

И, да, хрен я V70 продам. Егойный движок B5244S - образец, как битьё монтировкой по балде даёт положительный результат.

воскресенье, 11 ноября 2012 г.

Вторая машина

Жена, наконец-то, взяла уроки вождения и намеревается в декабре сдать на местные права. Возник вопрос с покупкой второй бибики.

За два года жизни в Штатах её отношение к нашей машине изменилось с "куда такой крокодил?" до "нда, колясочку-то в багажник положить, это её складывать надо". Т.е. машину надо большую. Большая, новая, хорошая машина (XC90) стоит много денег, которые хоть и есть, но откладываются на старостьдом.

Маленькая, новая, хорошая  машина (Scion FR-S) непрактична.


В большой, новой, нехорошей машине (Mazda 5) жене категорически не понравилось: задний обзор отстойный, материал обивки фиговый, сидушки неудобные.


Большая, хорошая, но б/у машина (XC90) стоит, как маленькая, плохая, новая (Хонда Цивик, Мазда 3, Тойота Королла), на что квакает жаба.

Поэтому взяли Volvo XC70 2.5T 2005-го года с пробегом 80 тыщ миль.


Машина на той же платформе P2, что и наша V70, которую я достаточно хорошо знаю и умею ремонтировать. На осмотр припёрся со сканером, ноутбуком, УФ-фонариком и вот таким списком:

Мало того, что в ходе осмотра были выявлены некоторые косяки, так ещё это произвело впечатление на манагера, и цену удалось сбить почти на 2 тыщи (до 12). Ремонта и запчастей так тыщи на полторы получится. Как и планировалось.

Очень впечатлила динамика. 208 лошадей и 320 Нм крутящего момента после 168 и 230 на V70 - это адски большая разница: XC70 просто рвётся вперёд, как ошпаренная, разгоняясь до сотни за 8 секунд. В кресло вдавливает ого-го!

Из намеченного фронта работа: все 4 шины новые надо, верхняя подушка двигателя и реактивная тяга коробки порванные, вентиляция картера засрана наглухо, но сальники ещё не текут, вроде. Трансмиссионная жидкость грязная, хотя её, вроде бы, 10 тыщ миль назад меняли. Наверное, старые отложения намыла. Но коробка очень плавно переключается, плюс гидроблок видно, что не ремонтированный. Дроссель наверняка грязный (машина турбовая). Сканер показал неактивную ошибку в блоке климат-контроля, это предыдущий владелец аудиовход под плейер/телефон цеплял, там надо снимать блок климата, и по правилам перед этим нужно аккумулятор отцепить, иначе комп ошибку зарегистрирует. Так что ошибка объяснима.

Ну вот. Внесли предоплату, завтра позвоню в страховую, во вторник вечером поедем забирать свою новую старую бибику.

понедельник, 5 ноября 2012 г.

Газпром - мечты сбываются

Оборудую микролабораторию потихоньку. Сегодня приехала паяльная станция (паяльник с регулируемой температурой и фен).


Ребята, мне реально беспокойно за наше будущее. Паяльная станция - это второй мой девайс, пришедший с документацией только на китайском! Первым был осциллограф.

Станция - типичный Китай, не такой прилично выглядящий, как осциллограф или блок питания. Вот, например, кривой оконечник:


Раскрутить и полностью без перекосов закрутить неполучилось. Вторая ручка, впрочем, прямая. А вот морда станции:



Угадайте с первого раза, что из A и B - паяльник, а что фен. Такая станция, кстати, продаётся под многими марками, морды незначительно графикой отличаются, но компоновка ручек одинаковая, плюс надпись 852D+ на всех присутствует.

Ну так, куча жал и насадок присутствует. Греется быстро, попробовал попаять - паяет. Посмотрим. Кстати, зацените, какое козырное место для стола у меня на чердаке:
Света днём для работы просто дофига. В случае пожара можно оперативно открыть окно. Или все 4. Дырка в стене - это система кондиционирования, что летом очень спасает, ибо воздух под крышей до +35 нагревается.

Стол достался нахаляву - соседи выставили на улицу с бумажкой: "Free" :)

Жалко, что такого оборудования в детстве не было, когда сутками сидел с 40-ваттным паяльником, скрючившись над очередным Спектрумом.

Обзор Subaru Outback 2011

Вообще, я написал это на форуме одном, но заслуживает перепоста.

"А вот ещё у соседа на Субару Аутбек 11-го года ветка в шторм упала, машину в гогно раздавило. Там мужички возле неё крутились, я тоже подошёл посмотреть на это чудо японского автопрома в разрезе, так сказать. Ребяты, она реально сделана из фольги! Я спокойно взялся пальцами за помятое крыло и смог его более-менее ровно выпрямить! Пальцами! И я всего лишь бородатый погроммист с атрофировавшимися мышцами, не какой-то там качок. А застарелую вмятину на Вольво бил молотком - хрен-то там, чугуний он и есть чугуний. Далее, на Субаре этой краска лежит тонюсеньким слоем, грунтовки под ней то ли совсем нет, то ли молекулярный слой. В местах ударов краска сшелушивается пальцем, и если её ногтём подцеплять, то можно вообще всю машину ободрать, похоже! На чугунии у Вольво грунтовка лежит в миллиметр-полтора толщиной, а поверх - толстый слой краски. Никакого сшелушивания и в помине нет, а машина выпущена в 2001-м году! Сами места ударов за неделю после шторма уже наглухо заржавели! Я машину когда брал, в паре мест камнями было побито до металла. Ну не блестел металл, ну окислился, но ржавчины не было! И вообще, самое хреновое, что в этой Вольве есть - это японская АКПП :)"

пятница, 2 ноября 2012 г.

Коробас-баробас...

Последнее время третья передача стала досаждать: при переключении на неё движок стал говорить короткое "вжжж!", т.е. гидроблок не может развить нужное давление за нужное время. Трансмиссионную жидкость (ATF) за 23 т.км менял три раза (кстати, на днях рубеж 200 т.км преодолел), помогает, но проблемы с плохим переключеним в районе третьей периодически всё равно вылазят. С последнего пробега наездил 8 т.км, жидкость розовая, только слегка потемнела за счёт материала с фрикционов.

Решил залить коробочного растворителя Seafoam, поездить, опять сделать полную замену жидкости, плюс поставить внешний магнитный фильтр на обратку. Родной сидит глубоко в коробке, картера съёмного нет, фиг достанешь или почистишь.

Вот меня эти хреновы маркетологи убивают: мол, замена ATF не предполагается на всё время жизни коробки. Ага, как умрёт из-за засранной жидкости, так и жизни конец. Человека тоже можно за всю его жизнь ни разу не накормить, только жизнь короткая очень будет.

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

Есть у нас один продукт, написанный полностью на Коммон Лиспе - конфигуратор и супервизор наших же железкок на FPGA. Не сильно большой, 10к строк движка, UI и компиляторов DSL, плюс 7к5 строк на DSL. Но из-за того, что это сплошные "кластеры метапарадигм", как выразился аноним на ЛОРе, то каждое действие - это маленькое инженерное чудо: классы, код и интерфейсы генерируются и убиваются на лету, в памяти гоняются сотни мегабайт развесистых структур данных, всё такое сложное, динамичное и многопоточное, что аж зубы скрипят.

По заверению адептов языков со статической типизацией, такая система должна всё время падать из-за того, что вместо ожидаемых коров функция получает баранов. Компилятор-то не имеет возможности отловить такие несоответствия на этапе компиляции. И потом, через много дней, когда бараны придут вместо коров, то программисту будет совсем худо, ибо он уже всё забыл, и разбираться с таким багом будет очень сложно. Фигня всё это. Расскажу я вам про типичный баг в лиспософте.

У клиента через 49.7 дней аптайма софта отвалился внутренний механизм кэширования. В ходе анализа ситуации выяснилось, что для маркировки времени обновления кэша использовались встроенные лисповые часы, обновляющиеся 1000 раз в секунду. Лисповская функция, читающая часы, возвращает bignum, но из-за реализации внутренностей кэша от этого числа сознательно брались только 32 младших бита. Через 49.7 дней происходило переполнение, и кэш маркировался всегда устаревшим. Я подчёркиваю слово "сознательно", потому что код, делающий эту операцию со временем, был спецом так написан. И на момент написания 2 года назад он был логически правильным, но потом изменились требования, и код стал неправильным, но про него никто не вспомнил. Соответственно, это тупая алгоритмическая ошибка, и этот же алгоритм, переложенный на, скажем, Хаскель, воспроизводил бы ровно ту же самую ошибку.

А бараны вместо коров в реальной жизни никогда не приходят. Вот.

воскресенье, 21 октября 2012 г.

Опять автокосяк :)

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

Я, значит, после первого косяка с новым стартером вычитал на буржуйском сайте, что замок зажигания чудным образом у кого-то глючил, симптомы примерно такие же были. Новый оригинальный замок был сразу прикуплен, благо, недорогой, и вот сегодня я его поменял. Толку ноль :)

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

В общем, после шевеления машина завелась, но надо будет, однако, разъём вытащить и контакты почистить и медной смазкой смазать, чтобы не окислялись.

четверг, 18 октября 2012 г.

Семь раз отрежь - один примерь.

Купил лабораторный блок питания Korad KA3005D. Выдаёт до 30В, 5A, защита по напряжению и току, 4 слота памяти. Тяжёлый, сделан добротно, даже пластик ровненький. Годный, современный Китай, в общем.


Теперь осталась паяльная станция, чтобы жало не перегревалось, и можно будет вплотную работать над машиной времени, чтобы заслать всё это добро лет на 15 назад, а то с одним стрелочным мультиметром лохматого советского года Спектрумы паял... Без осциллографа заваленный фронт у одной микросхемы, помню, полгода ловил, из-за которой мегабайтный SIMM не хотел работать, а 256кб - спокойненько.

Решил подцепить злосчастную антенну иммобилайзера и смотреть, что там твориться без CEM (один из компутеров в машине).

Перед подключением питания проверил мультиметром, как работает блок. А там полярность оказалась перепутана! Провода перевоткнул правильно, включаю - осциллограф на антенне ничего не видет из того, что было, когда антенна в машину воткнута была. Блок показывает ток ноль ампер. Смотрю, перепутал стороны разъёма у антенны, а у неё земля с питанием по краям сидят. Т.е. +30 и землю перепутал. Хм, гари, вроде, нет... Защита на антенне сработала, значит. Подключил правильно, начала срабатывать защита по току на блоке питания. Долго тупил, чё вообще происходит, всё на сто раз перепроверил, потом случайно глянул на мультиметр, а полярность-то у него перепутана! =) Вот что значит не использовать измерительный прибор для чего-то серьёзней, чем проверка батареек!

Антенне нифига не сделалось, но без CEM самостоятельно призывы ключа "прочти меня!" не транслирует. Припаял разъём к Ардуине, подключил USB FTDI свисток, Ардуина начала мыргать светодиодами, плюс TTY в системе появился. Буду эмулировать CEM. Только вот незадача: Ардуина моя пятивольтовая, а у сигнальной части антенны размах 28 вольт, судя по осциллографу. Надо мутить усилители, что осложняется двунаправленностью по-крайней мере одного сигнала.

воскресенье, 14 октября 2012 г.

Старый vs Новый Свет

Значит, побывали мы тут с семьёй в Европах, на язык сразу лезут сравнения, порождённые свежими впечатлениями.

Первое, что заметил: степень параноидальности у европейцев меньше. Проходить границу США->Европа куда проще, чем Европа->США. Причём, безопасней граница у США от этих заморочек не становится же, только лишние проблемы простым людям создают.

Второе: машины в Европе кроооохотные. Нам-то самим выдали достаточно большой по местным меркам VW Golf, но я и в нём постоянно задевал локтями дверь и соседнее кресло, детское автокресло кое-как встало, и его приходилось убирать, чтобы жена могла покормить ребёнка.

Меня лично больше всего огорчил турбодвигатель на 1.4 литра. Он просто не тянет. Я даже смеха ради сделал фотографию моторного отсека, потом выложу фотку: он сильно меньше вольвовского, наворотов, вроде, примерно столько же, но реально пластмассовый пыльник под двигателем рукой достать можно через дыры. А у Вольво даже аккумулятор под пол багажника запихнули, всё под капот не влезло, и выуживание упавшего ключа  превращается в упражнения с телескопическим магнитом, через ругань переходящие в поддомкрачивание машины и откручивание пыльника. Почему так много пустого места - фиг знает. Двигатель хоть и почти в два раза меньше по рабочему объёму, но габариты не на столько же?

В общем, двигатель... Из Праги в Брно во все многочисленные холмы приходилось въезжать на 4-й скорости, а обратно так вообще часто 3-ю включал (крутя мотор до 6 тыщ). Это неправильно на такую машину ставить такой слабый мотор, там нужно хотя бы 2 литра. Ну хотя бы 1.6. И расход ведь средний 7.7 литров был! Правда, когда за 45 литров 91-го выложил 1800 крон ($100), то сразу захотелось ездить медленее, да и двигатели 1.2 же ставят не зря, да ещё и дизельные вонючки :)

Шумоизоляция в Гольфе никакая, приходилось орать и переспрашивать всё время. Настройки усилителя руля не понравились, работает вообще не так, как ГУР (который работает согласно натуральным, природным, гидромеханическим законам), но можно привыкнуть, наверное. К чему привыкнуть не можно - это сгорбленная посадка даже при моих невеликих 176 см. Машина нифига не семейная, и далеко на ней тяжело ехать.


Из хороших моментов: подвеска ёмкая, радиус разворота маленький.  К плюсам машины ещё прилагаются неплохие европейские дороги. В нашем штате дороги - просто ужас, яма на кочке (куда налоги ваще идут?). Ну и ваще, от отеля в более-менее центре Праги до отеля в Брно доехали меньше, чем за 2 часа, разгоняясь местами больше 150 км/ч, так что я, наверное, чрезмерно жалуюсь на "не едет".

Перейдём к кулинарным отличиям. Не знаю, что на счёт этого думает жена с её неполноценным отношеним к еде (мясо, спирт - не), но мне кажется, что даже в Чехии уровень ресторанов выше, чем в Штатах. Вспоминаю брненский ресторан Moname, расположенный, в общем-то, на отшибе in the middle of nowhere, и жральню (по другому и не скажешь) с видом на Ниагарский водопад. В Европе вообще в мало-мальски туристических местах по вагону аутентичных ресторанчиков, а не сараи, продающих кари под открытым небом и воняющим этим кари на всю округу. Конечно, контрпримеры и там, и там бывают, но у меня общее мнение такое сложилось.

Хм, да, в Чехии дешёвые сосиски с ломтем хлеба и горчицей на бумажной тарелочке много где продают... Тоже своего рода кари.

Кстати, посидели вечером в Брне хорошо: кружек 40 на в среднем 5 выпивающих вышло =) Голова не болела, похмелья не было (а с местного сшанского пива оно начинается к концу второй бутылочки 0.33л).

Однако, самое разительное отличие, лежащее в глубине истоков, - это отсутствие, как таковой, истории в Штатах, и её наличие в Европе в особо крупных размерах. Да, прям так: остановился на первой попавшейся заправке, а вдалеке на холме, окутанном в красное золото осеннего леса и низкий туман, видно замок. И пока от этой заправки отъезжаешь и пытаешься высмотреть его название на дорожном знаке исторического места, то окажется, что таких замков тут в окрестностях ажно три. Или на велосипеде в глуши катаешься, на какие-то камни, отдалённо напоминающие фундамент, вышел, и вот нате вам: оказывается, это руины крепости, разрушенной ещё в 13-м веке... Вот эту историю ни за какие деньги не купишь. В Штатах, наверное, самое старое, что есть - это дома, в которых живут люди в окрестностях Бостона.

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

воскресенье, 30 сентября 2012 г.

Попытка угнать Вольво: epic fail.

Значит, жена укатила в Европы. Обычно я без жены очень сильно скучаю, но тут ещё лишился и мелкого сына, поэтому грусть и тоска моя помножилась в 2.71 раз (я не математик, поэтому, по-инженерному, больше склоняюсь к e вместо pi). От безысходности, было решено влезть в иммобилайзер Вольво и посмотреть, чо там, да как.

Значит, на этой картинке видно вольвовскую схему проводьёв в части, ответственной за иммобилайзер. Кроме того, видно сам модуль антенны иммобилайзера, а также проводья, которым суждено быть припаянным к модулю.


Центральный электронный блок, судя по всему, шлёт сигнал модулятору, который, собственно, модулирует этим сигналом опорную частоту, которая попадает на антенну RFID-чипа в ключе, тот чё-то там делает, и отвечает, модулируя модулированный сигнал. Приёмник антенны демодулирует дважды модулированный сигнал и шлёт ответ CEM'у.

Вот модуль с тремя проводьями, припаянными к ICK, IDS и земле:


По ICK, судя по названию, должен переть сигнал от CEM, а по IDS - демодулированный ответ от ключа. Для их подсекания нужен двухканальный осциллограф. К счастью, у меня есть ажно 4-канальный:


На предыдущей картинке, кстати, виден правый горный ботинок фирмы Keen, которым я застрял в дереве во время своих велосипедных покатушек, отодрал подошву, но смог самостоятельно подшить инструментом, купленным, в первую очередь, для ремонта кожанного вольвовского кресла. Ещё я этим же инструментом подшил резиновые китайские тапки тогда ещё беременной жены, которая поставила категорическое условие: или она рожает в этих тапках, или пусть весь мир пылает синим пламенем. И вообще, почему ещё ей мороженого с солёными огурцами никто не принёс? =)

Во время эксперимента ключ будет повёртнут стопицот раз, поэтому отключаем стартер, чтобы не посадить батарею, и топливный насос, чтобы не залить свечи:

Вот так вся эта байда выглядит:



Значит, CEM шлёт запрос к ключу, когда ключ вставляется в замок и поворачивается в позицию 2. Если ключ не вынимался, то в следующий старт движка код не считывается.

Вот осциллограф чё-то поймал:


К сожалению, полностью кодовая посылка CEM с ответом ключа в буфер моего двухсотдолларового карманного осциллографа (DSO230, 4 тысячи точек) не уместилась, поэтому с разборкой на логическом уровне я пролетел. Сеанс связи с ключём, судя по осциллограмме, не такой уж и примитивный: CEM шлёт несколько пакетов данных, ключ на них отвечает. Но если применить более мощный осциллограф, либо наваять решение на FPGA, то обойти защиту Вольво не особо сложно.

Но для этого нужно заранее знать код ключа, т.е. от того, что просто так выбить стекло, заменить модуль антенны иммобилайзера на свой, с проводьями и какой-нибудь приблудой, имитирующей ключ, толку особо не будет: нужно заранее знать, какие ключи прописаны в CEM.

Тот, кто в состоянии сломать эту систему, и так может  позволить себе покупать новую Вольво два или три раза в год. Поэтому Вольво и неугоняемые.

UPD: Залил в осциллограф логический анализатор и перехватил две сессии между CEM и ключиком. Анализатор сохраняет в памяти только переходы сигналов, поэтому вся сессия в 4% памяти укладывается. Данные сохраняются в VCD-файл, которые смотрятся GtkWave'ом:


Осталось расшифровать, прибабахать микроконтроллер и заводить без родного ключа.

вторник, 28 августа 2012 г.

FFI в Лиспворкс

В общем, потребовалось из лиспа общаться с железкой на MSP430, которая подключена к компу по USB и торчит в системе в виде ttyACM. Чтобы с оным агрегатом общаться, нужно, как минимум, установить бодрейт. В Лиспворксе есть пакет serial-port, который, к сожалению, доступен только под виндой, поэтому юниксоидам нужно делать дополнительные движения.

Сначала я решил не париться, и открыть пайп, на другом конце которого сидит cu из uucp и делает за меня всё tty-специфичное. Но на машинах, где это дело крутиться будет, uucp нет, а для его устанавки нужно делать много действий, которые включают в себя ответы на кучу фиктивных багрепортов. Ещё можно вызывать stty и устанавливать флажки им, а в софте использовать обычный open. Однако, на деле выяснилось, что стандартному open в Лиспворксе от открытия файла устройства в режиме :io плохеет. В общем, надо открывать устройство позиксовым open, крутить tty-ручки и создавать на его основе лисповый stream.

У LispWorks есть foreign language interface, с помощью которого можно описать сишечные функции, структуры, переменные, подгрузить библиотеку и прочие типичные для такой задачи действия, доступные, например, в оупенсорсных UFFI/CFFI. Соответственно, можно или написать обёртку на Си, которая открывает дескриптор, дёргает termios-вызовы и возвращает причёсанный дескриптор в лисп, или вскочить на коня, выхватить шашку и описать нужное подмножество termios.h при помощи FLI. Впрочем, при чтении документации на FLI выяснилась приятная неожиданность: в LW есть встроенный парсер сишных заголовков, который сам всё описывает. Вот мой пример с termios:

(require "foreign-parser")

(foreign-parser:process-foreign-file "/usr/include/termios.h" :dff "/path/to/project/termios.lisp" :package :unix)


Всё. Это даже круче, чем sb-grovel в SBCL! Единственное, что константы, объявленные препроцессором (через #define) автоматически не конвертятся. Ну да ладно.

А вот функция, открывающая в LW tty-девайс:

(defun open-device ()
  (let ((fd (sys::unix-open *dev* 2)))
    (fli:with-dynamic-foreign-objects ((term unix::termios))
      (unix::tcgetattr fd term)
      (unix::cfsetospeed term #o10004) ;; 460800
      (unix::tcsetattr fd 0 term)      ;; TCSANOW
      (unix::tcflush fd 2))            ;; TCOFLUSH
    (sys:attach-stream fd :direction :io :automatically-close t)))

понедельник, 20 августа 2012 г.

Emacs 24 + GnutTLS

Т.к. в 24-м Емаксе встроили родную поддержку GnuTLS, то появилась возможность крутить gnutls'ный же priority string. Например,

(setq gnutls-algorithm-priority "NORMAL:+COMP-DEFLATE")

что уменьшило трафик на wl-folder-sync-current-entity с 79901 до 25511 байт, т.е. ажно в три раза!

Теперь можно спокойно забить на отсутствие в Емаксе поддержки zlib и наличие compress=deflate у Гмейловского IMAP'а, т.к. жаться будет на уровне tls. Конечно, на серверах с поддержкой RFC4731 aka ESEARCH всё не так сногшибательно кучерявей, но у Гмейла ESEARCH нету, а у кого в наши дни нет гугловского мыла?

P.S.: gnutls-algorithm-priority в равной степени справедлив и для Gnus...
P.P.S.: с другой стороны, в 23-м Емаксе можно для gnutls-cli указать --priority="NORMAL:+COMP-DEFLATE"...

Emacs 24 и еврейский вопрос

FIX: (setq-default bidi-display-reordering nil)

Я не знаю, что эти поганцы-разработчики курили, но:

Emacs 23.4:

Function Name            Call Count Elapsed Time Average Time
----------------------------------------------------------------
window-end                24          0.0962759999  0.0040114999
line-move                 65          0.0543929999  0.0008368153
line-move-visual          61          0.0482110000  0.0007903442
posn-at-point             6           0.016949      0.0028248333
line-move-partial         61          0.00342       5.606...e-05
pos-visible-in-window-p   1           0.001529      0.001529

Emacs 24.1:

Function Name            Call Count Elapsed Time Average Time
----------------------------------------------------------------
line-move                 122         4.784470897   0.0392169745
line-move-partial         118         4.106517631   0.0348009968
pos-visible-in-window-p   72          3.9990069829  0.0555417636
line-move-visual          118         0.6843929029  0.0057999398
window-end                4           0.3870196690  0.0967549172
posn-at-point             11          0.286456435   0.0260414940

Смотреть в последнюю колонку. В среднем, всё стало работать медленней в 10-20 раз. Wanderlust'ом вообще невозможно пользоваться: скролл в Summary - это агонические конвульсии больной черепахи в терминальной стадии. Самое забавное, что главный виновник тормозов скроллирования - pos-visible-in-window-p - это сишная функция, которая со времён 23.4 не изменилась.

Или, может, это общее торможение интерпретатора байткода после внедрения lexical binding?

P.S.: Не, нифига это не байткод. Вот вырезка из perf:

23.4:

 31.81%  mark_object
  9.77%  Fbyte_code
  8.01%  Fgarbage_collect
  2.29%  oblookup
  2.22%  re_match_2_internal
  1.97%  Feval
  1.95%  readchar
  1.62%  mark_char_table
  1.01%  Ffuncall
  0.83%  Fcons
  0.77%  read1
  0.76%  re_search_2
  0.71%  unbind_to
  0.67%  funcall_lambda
  0.66%  specbind
  0.58%  produce_chars
  0.58%  buf_charpos_to_bytepos
  0.58%  decode_coding_iso_2022
  0.55%  Flength
  0.54%  assq_no_quit

Как видно, основную часть времени Емакс 23 провёл в сборщике мусора, т.е. всё остальное работало со скоростью падающего домкрата. А вот ситуация в 24:

 21.11%  mark_object
 15.01%  buf_bytepos_to_charpos
  8.32%  scan_buffer
  7.20%  re_match_2_internal
  6.09%  exec_byte_code
  5.17%  Fgarbage_collect
  4.34%  buf_charpos_to_bytepos
  1.50%  oblookup
  1.30%  eval_sub
  1.29%  compile_pattern
  1.19%  readchar
  0.87%  fast_looking_at
  0.85%  mark_char_table
  0.65%  Fcons
  0.62%  Ffuncall
  0.62%  specbind
  0.57%  re_match_2
  0.54%  re_search_2
  0.52%  read1

Сборка мусора тоже в топе присутствует, но просто дофигища времени было проведено в сишечных функциях хождения по буферу. Смотрим в чейнджлоге, чего там связанного с экраном добавили...

- Support for displaying and editing bidirectional text, including
  right-to-left scripts such as Arabic and Hebrew.

Ага, понятно ;)
 
Надеюсь, починят.

вторник, 7 августа 2012 г.

Семейная машина

Могу с уверенностью сказать, что Вольво полностью влилась в нашу семью! Все наши более-менее крупные события она тоже переживает.

Бросили на открытой парковке в -30? Селектору передач АКПП стало очень грустно. Уехали на три недели в Сибирь и оставили машину на парковке? Получите мёртвый термостат, испарившуюся охлаждайку из  расширительного бачка и почти сдохший аккумулятор. Сдал экзамен по вождению? Дай машине сразу же обнять водителя и не выпускать его из салона из-за сломанной ручки в водительской двери. С энтузиазмом предвкушаете очередную велосипедную покатушку? От радости порвали генератор. Собираетесь в Йеллоустоун на неделю, хотите арендовать другую машину в Солт-Лейки Сити и устроить 600-мильный вояж? От негодования залюфтила-завибрировала муфта переменого газораспределения. Едете на Ниагару? Стали терять обороты на холостом ходу. Жена завтра рожать собралась? От волнения прихватило стартер и он ушёл в мир иной.

Вот и опять: папе в пятницу ночью ехать в Нью-Йорк оформлять российское гражданство сыну, и у насоса ГУР открутился выпускной штуцер и распрыскал поллитра жижи по ремню и всем шкивам...

понедельник, 16 июля 2012 г.

Knowledge Brings Fear

Значит, есть такая мечта детства: самообучающийся и самодописывающийся лиспокод на ходу синтезирует схему, которая на ходу же заливается в ПЛИС. Всё это кладётся в примерно такого железного посланца мира и любви:



Лисп немного осилил, учу в меру ленивости Verilog. Букварь о 800-страницах ещё и до середины не пролистан, но вчера, на ночь глядя, кривыми интернетными тропками вспомнил, что не знаю, как работает целочисленное умножение в процессоре. Решил просветиться.

Собственно, два способа умножения знает любой школьник, а пишущий демки на ассемблере знает и третий:

  1. Дважды-два - четыре. Т.е. заучивается таблица умножения. Компьютер может позволить себе иметь таблицу для параметров не только одноразрядных, но и  чуток побольше. Сложность O(1).
  2. X*Y можно получить, если X в цикле сложить Y раз. Сложность O(N).
  3. Множитель можно разложить на двойки и единицы и использовать их для бинарного сдвига и сложения. Сложность не знаю какая.
Википедия говорит, что очень хорош собой алгоритм Карацубы, который обладает сложностью O(nlog23). Перескажу его кратко:

Нужно перемножить два двухзначных числа, допустим, 12 и 34. Для этого разбиваем числа по разрядам, получаем x1 = 1, x2 = 2, y1 = 3, y2 = 4. Находим:

    A = x1 * y1.
    B = x2 * y2.
    C = (x1 + x2) * (y1 + y2).
    K = C - A - B

Результат умножения получается так: 100 * A + 10 * K + B. Очень просто, в принципе.

Для начала я написал алгоритм на Лиспе. Т.к. дело было ночью, плюс клепание "настоящего" энтерпрайзного софта на работе от таких задач отличается достаточно сильно, то я протупил часа три. Но вот что получил для умножителя 8 на 8 бит:

multx.lisp
(defvar *table* (loop for x from 0 below 8
                      collect (loop for y from 0 below 8
                                    collect (* x y))))

(defun multiply (x y)
  (labels ((vectorize (x &optional (n 4))
             (reverse (loop for i = x then (ash i -4)
                            repeat n
                            collect (logand i #xf))))
           (table-lookup (x y)
             (nth x (nth y *table*)))
           (trivial-mult (sx sy)
             (let* ((x1 (ash sx -2))
                    (x2 (logand sx 3))
                    (y1 (ash sy -2))
                    (y2 (logand sy 3))
                    (a (table-lookup x1 y1))
                    (b (table-lookup x2 y2))
                    (c (table-lookup (+ x1 x2) (+ y1 y2)))
                    (k (- c a b)))
               (+ (ash a 4) (ash k 2) b)))
           (vector-multiply (x y)
             (loop for x1 in x
                   for i in '(12 8 4 0)
                   sum (ash (loop for y1 in y
                                  for i in '(12 8 4 0)
                                  sum (ash (trivial-mult x1 y1) i))
                            i))))
    (vector-multiply (vectorize x) (vectorize y))))

(multiply 12 34) => 408


Табличка умножения 8 на 8 нужна для выполнения внутренних умножений в самом алгоритме. На самом деле, таблица нужна 4 на 4, т.к. размер разряда я принял в 2 бита, но в ходе отладки обнаружилось, что при вычислении C происходит выход за пределы таблицы, поэтому я её малодушно сделал в два раза больше по обоим измерениям.

Следующим шагом было переписывание того же самого на Верилоге. В оном языке, как и в Лиспе, умножение присутствует из коробки, но ради обучения  сей факт проигнорировал, конечно. Значит, вот вымученный 8-битный умножитель (размер разряда у числа - 4 бита):

123
module Multiplier8x8 (x, y, q, clk);
   input          clk;
   input [7:0]    x, y;
   output [15:0]  q;

   reg [15:0]     q;
   reg [7:0]      a, b;
   reg [11:0]     c, k;
   wire [3:0]     x1, x2, y1, y2;
   wire [4:0]     cx, cy;
   
   reg [15:0]      tbl [0:1023];
   wire [4:0]      x1l, x2l, y1l, y2l;
     
   initial begin
      $readmemb("mult2.tbl", tbl);
   end

   assign {x1, x2} = x;
   assign {y1, y2} = y;
   assign cx = x1 + x2;
   assign cy = y1 + y2;
   assign x1l = x1;
   assign x2l = x2;
   assign y1l = y1;
   assign y2l = y2;

   always @ (posedge clk) begin
      a <= tbl[{x1l, y1l}];
      b <= tbl[{x2l, y2l}];
      c <= tbl[{cx, cy}];
      q <= (a << 8) + (k << 4) + b;
   end

   always @ (negedge clk) begin
      k <= c - a - b;
   end
endmodule

Для внутреннего умножения тоже используется таблица, но размером 32x32 (5 на 5 бит). Генерируется вот таким лиспокодом:

mult-gen.lisp
(with-open-file (f "~/src/verilog/mult2.tbl"
                   :direction :output
                   :if-exists :supersede
                   :element-type 'character)
  (dotimes (i 32)
    (dotimes (j 32)
      (format f "~16,'0b~%"  (* i j)))))

Сверхкраткий ракурс в Verilog.

Логика абстрагируется в модуле. У модуля есть входные и выходные параметры. У параметров есть разрядность в битах. Параметры могут быть проводами (wire) или регистрами (reg). Провода от регистров отличаются тем, что первые не хранят значение, а вторые - хранят. Соответственно, выход провода меняет значение одновременно с входом, а регистр выступает в роли защёлки-триггера (которому нужна опорная тактовая частота). Это если очень-очень просто.

assign соединяет провода. assign {x1, x2} = x; разбирает 8-битный x на 4-битные x1 и x2 (фигурные скобки - оператор конкатенации). assign cx = x1 + x2; складывает 4-битные x1 и x2, а 5-битный результат присваивает cx. assign x1l = x1; расширяет 4-битный x1 до 5-битного x1l с нулём в старшем бите.

always @ (posedge clk) срабатывает, когда сигнал опорной частоты clk изменяется с 0 на 1 (передний фронт). always @ (negedge clk) срабатывает, соответственно, наоборот: с 1 на 0 (задний фронт).

В Верилоге есть операции, которые не могут быть синтезированы в железо (например, чтение файла), но их удобно использовать для отладки и симуляции.

Значит, вычисление A, B и C прямолинейно и понятно. Единственное, что стоить отметить: т.к. аргументы у нас 4-битные, а таблица умножения построена для 5-битных множителей из-за переполнения при вычислении C, плюс она является одномерным массивом размерностью 2^(5 + 5), то x1, x2, y1 и y2 расширены до 5 бит. cx и cy (суммы x1 + x1 и y1 + y2) и так 5-битные.

Вкусность программирования под железо заключается в массивном параллелизме. Все операции в коде выполняются одновременно, кроме кода в разных блоках always. Внутри always код тоже полностью параллельный, но K не может быть вычислен одновременно с C, A и B. Поэтому K нужно вынести либо в другой такт, либо повесить его вычисление на спад clk. Таким образом, умножение двух восьмибитных чисел происходит за один такт.

На самом деле, при программировании под реальную железяку вылезет море проблем. Например, tbl смотрится одновременно с тремя наборами параметрами, и для такой возможности нужно иметь, как-минимум, 3-портовую память. Или использовать 3 одинаковые таблицы.

Тестбенч для умножителя:
123
module test;
   reg clk = 0;
   always #1 clk = ~clk;

   wire [15:0] q;
   reg [7:0]   x, y;

   initial begin
      $dumpfile("test.vcd");
      $dumpvars(0, test);

      x = 123;
      y = 255;

      # 4 $finish;
   end

   Multiplier8x8 m (x, y, q, clk);
endmodule
Ложим оба модуля в один файл, компилируем Икарусом, выполняем, прогоняем через gtkwave:

$ iverilog mult.v && ./a.out && gtkwave test.vcd



Теперь применим всю мощь массового параллелизма и сделаем на основе 8-битных умножителей один 16-битный. Для этого всего лишь нужно сделать матрицу 2 на 2:
123
module Multiplier16x16 (x, y, q, clk);
   input          clk;
   input [15:0]   x, y;
   output [31:0]  q;

   wire [31:0]     q;
   wire [15:0]     v11, v12, v21, v22;

   Multiplier8x8 m11 (x[7:0], y[7:0], v11, clk);
   Multiplier8x8 m12 (x[7:0], y[15:8], v12, clk);
   Multiplier8x8 m21 (x[15:8], y[7:0], v21, clk);
   Multiplier8x8 m22 (x[15:8], y[15:8], v22, clk);
 
   assign q = (((v22 << 8) + v21) << 8) + (v12 << 8) + v11;
endmodule

Матрица собирается тоже за один такт, если верить симуляции:
123
module test;
   reg clk = 0;
   always #1 clk = ~clk;

   wire [31:0] q;
   reg [15:0]  x, y;

   initial begin
      $dumpfile("test.vcd");
      $dumpvars(0, test);

      x = 12345;
      y = 43210;

      # 4 $finish;
   end

   Multiplier16x16 m (x, y, q, clk);
endmodule



И, чтобы совсем заставить рыдать публику, которой обсчёт матрицы 8 на 8 - это нифига не бесплатно, вот 32-битный умножитель на том же принципе, что и 16-битный:
123
module Multiplier32x32 (x, y, q, clk);
   input          clk;
   input [31:0]   x, y;
   output [63:0]  q;

   wire [63:0]     q;
   wire [31:0]     v11, v12, v21, v22;

   Multiplier16x16 m11 (x[15:0], y[15:0], v11, clk);
   Multiplier16x16 m12 (x[15:0], y[31:16], v12, clk);
   Multiplier16x16 m21 (x[31:16], y[15:0], v21, clk);
   Multiplier16x16 m22 (x[31:16], y[31:16], v22, clk);
 
   assign q = (((v12 << 16) + v11) << 0) + (((v22 << 16) + v21) << 16);
endmodule
В качестве множителей использованы микрософтовские константы BIG BOOBS и BOOBIES, которые вызвали такие волны околосексистких говен в этих ваших интернетах:
123
module test;
   reg clk = 0;
   always #1 clk = ~clk;

   wire [63:0] q;
   reg [31:0]  x, y;

   initial begin
      $dumpfile("test.vcd");
      $dumpvars(0, test);

      x = 32'hB16B00B5;
      y = 32'h0B00B1E5;
      # 4 $finish;
   end

   Multiplier32x32 m (x, y, q, clk);
endmodule


Проверяем результаты в Лиспе:
123
(format nil "~x" (* 123 255)) => "7A85"
(format nil "~x" (* 12345 43210)) => "1FCB74FA"
(format nil "~x" (* #xB16B00B5 #x0B00B1E5)) => "7A014517734C6E9"
Ура! :)

Распознание лица года три назад ещё на Лиспе написал, так что Терминатор, практически, готов! На следующих выходных поставлю на шасси от детской коляски старый вольвовский аккумулятор, стартер, вебкамеру, альтеровский девкит и палку.

Архив блога