FPGA

Мечты материализуются! FPGA демоплата Hardware

 Итак, обо всем в хронологическом порядке. Previously and now.

11.09.20


AC608 TEST @ Kingdom

Hooraii! Заказал fpga AC608 ALTERA CYCLONE IV на 22300 блоков

25.09.20


AC608 TEST @ Kingdom

45x45mm

14.10.20

Вобчем назрел вопрос по этой плате, документация скрыта на форуме китайского хардвар девелопера, регистрация только через китайскую аську qq/wechat. Придется учитт кетайскъй языг

30.10.20

Мне помог человек с Электроизмерителя, он заказывает у китайца товары и имеет вичат акк более полугода - имеет право регать новый акк украинца.

Теперь я в вичате wxid_i9694q91v93y22


31.10.20


AC608 TEST @ Kingdom

Лажа с привязкой телефона, на форуме писать не могу, но в личку мона постучаца

9.11.20

Китайцы юзают свои номера без первых двух цифр (+86)

24.11.20

Запостил

http://www.corecourse.cn/forum.php?mod=viewthread&tid=28468&extra=page%3D1

Фокус еще в том что они разрешают постить только с полуночи до 7 утра

 Гугл переводчик рулит

 Иначе фиг его нает что на этих кнопках написано

 Все, попал в китайскую секту


AC608 TEST @ Kingdom

Это именно о чем вы подумали)) Осталось это дело взять и заказать на фабрике по минималке


AC608 TEST @ Kingdom

Подарок от Админа))

19.12.20

10 плат 100*74 на jlcpcb стоят 5$+14$ шиппинг в Украину = 530 грн

31.12.20

Платы для FPGA заказаны!

3.01.21

Взяли в производство

7.01.21


AC608 TEST @ Kingdom

Отправили!

17.01.21

Успешно вкатился в NIOS!

Это виртуальный процессор на площади кристалла FPGA Altera - можно делать свои собственные команды и лепить из базовых блоков, как лего.

Осилил хардварную часть - осталось освоить кодинг в Eclipse

22.01.21

Распаковка - приехали материнки для FPGA - 10 шт и фирменный брелочек! На одном фото есть коробка с ворохом радиодеталей

На плате есть разъемы подписанные lvds, camera - китайцы спроектировали на этой плате видеопроцессор с дисплеем и камерой. Я хочу изучить их проект и переделать один чип под свою видеокарту для тачскрина!

28.01.21

Отличные новости: на заводе Электроизмеритель, где я работаю, вчера на совещании дали добро на проект миди контроллера-сэмплера синтезаторного типа, на базе fpga. Есть средства завода и грант на лабораторию звука. Остальные проекты завода музыки не касаются, поэтому про них ни слова

02.02.21

Открыл гитхаб с FPGA проектом

github.com/KINGDOMWARE

***

И наконец, я спаял ЭТО ^_^~

Сейчас вы увидите как выглядит настоящий FPGA проект, проект PCB материнской платы, запуск и тест демоплаты, тест звука, тест смены питча

2 ▲
23 February 2021 13:33
Kingdom
11 comments

AC608 - BOARD распаковка плат! Hardware

Распаковка - приехали материнки для FPGA на базе CYCLONE IV 22300 LE - 10 шт и фирменный брелочек! На одном фото есть коробка с ворохом радиодеталей.

На плате есть разъемы подписанные lvds, camera - китайцы спроектировали на этой плате видеопроцессор с дисплеем и камерой. Я хочу изучить их проект и переделать один чип под свою видеокарту для тачскрина синтезатора!



AC608 - BOARD @ Kingdom

AC608 - BOARD @ Kingdom

AC608 - BOARD @ Kingdom

AC608 - BOARD @ Kingdom

AC608 - BOARD @ Kingdom

AC608 - BOARD @ Kingdom

2 ▲
22 January 2021 21:27
Kingdom
11 comments

Синтезатор - это просто ^ ^ Hardware

Всем привет!

Хочу поделиться радостной вестью: я на пороге создания своего собственного железного синтезатора.

Да-да, вы не ослышались.

Как же у меня случился столь стремительный научно-технический прорыв и ментальный штурм?

Отвечу простой аббревиатурой, которая попалась мне на глаза буквально месяц назад и в течение месяца в редкие  часы свободного времени мне удалось сделать полностью адекватный, скомпилированный без ошибок проект ЖЕЛЕЗНОГО СИНТЕЗАТОРА С MIDI ВХОДОМ!

Это чудо называется F.P.G.A.

Я воспользовался одной из самых дешевых разновидностей этой технологии под названием C.P.L.D.

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

Итак, цены с алиэкспресса:

Intel MAX II EPM240 голый чип – 30 грн/1$ оптом за штуку

И да, в один этот чип мне удалось впихнуть  простейший осциллятор с выбором волны и миди входом. Я просто в шоке)

Но 30 грн этого мало. Нужна плата, программатор, внешний генератор колебаний на 50МГц. В итоге у китайцев есть готовое решение для  ламеров – стартерпак-комплект за 230 грн (7$)

aliexpress.ru/item/40002045447…

Кроме того нужны 2 флэш памяти – на одной нужно записать таблицу музыкальных частот, чтобы синтезатор мог читать нужное значение для нужной ноты и генерировать волну на этой частоте, а на второй нужно записать наборчик волн в виде таблиц значений волный за один период, WAVETABLE. Осциллятор генерирует не саму волну, а адрес ячейки таблицы в нужный момент времени и волна уже превращается цифроаналоговым преобразователем (на группе резисторов и операционный усилитель) в аналог с выхода этой флэшки. Флэшки эти не NAND типа (те которые знает обычный юзверь), у которых ограниченный срок службы в 1500 циклов перезаписи, а EEPROM – ее можно перезаписывать примерно 100000 раз, такой себе биос! Но объем ее намного меньше, в виду дорогой технологии. Стоит одна флэшка 1,5-2 бакса, купить 16 мбит можно например здесь: www.kosmodrom.com.ua/el.php?na…, и для ее прошивки нужен специальный программатор, который достаточно дорог (от 50$), но если вы талантливый погромизд и у вас есть ардуина за 6-12$, вы можете сами сделать себе программатор))

Цифроаналоговый преобразователь делается из копеечных резисторов и микросхемки простейшего операционного усилителя звука LM358N, к нему можно сразу подключать наушники, схемы гуглите в интернети. Работает ЦАП так: на вход по 8 дорожкам подается 8 битное число и оно превращается в аналоговое пропорциональное напряжение почти мгновенно!

Итак, давайте же разберемся, как же нам сгенерировать звук.

Задача состоит в том, чтобы устройство выдавало 8 битное число, которое периодически нарастает от 0 до 255 с нужной скоростью и в конце сбрасывается в ноль. Выглядит это так 


01 - SAW @ Kingdom

V = 255, при этом на графике разумеется будет 2 в 8-й степени = 256 ступенек, потому что все цифровые счетчики умеют прибавлять  минимум по единичке. В реале у вас получится пилообразная волна с 256 ступеньками, хотя они достаточно маленькие и на слух 8 битные ступеньки практически не слышны. Внимание, не путать 8 битный звук с 8 битными приставками! Хочу развеять один миф. 8 битная приставка NINTENDO на самом деле генерирует 4-хбитный звук и 4-х битный цвет, это 16 ступенек, которые ухо четко различает как чиптюн, а 8 битными приставки назвали потому что 8 бит в них … это размер шины ДАННЫХ, А НЕ ЗВУКА!

Хорошо, скажете вы, а как же нам сделать другие волны, не пилу? А нам нужно это нарастающее число использовать, как адрес таблички, в которой записаны совсем другие значения напряжения волны! Какие угодно – синус, прямоугольник, тысячи разновидностей волн, которые даже можете нарисовать руками)) Для этого нам и нужна флэшка, в которую мы запишем табличку из 256 значений графика волны за один период, на вход флэшки подаем номер ячейки таблички, на выходе – вуаля – уже совсем другая нужная волна, в цифровом разумеется виде


02 - WAVE @ Kingdom

Окей, со ступеньками и формой волны разобрались, а как же нам быть с частотой? Как заставить это устройство считать с нужной скоростью, чтобы получить нужную нам музыкальную частоту генерации пилы?

Давайте разберемся, какое устройство нужно, чтобы генерировать нарастающее число. Нам для этого нужен обыкновенный счетчик.  Это такая электронная штука, которая хранит число и циклически с каждым шагом увеличивает его на единичку до заданного максимального значения. Для того чтобы счетчик считал, к нему подключают ножку генератора импульсов, такие генераторы выдают простые квадратные щелчки, стоят копейки и используются для процессоров и разных устройств, чтобы они считали шаги и выполняли команды по очереди. Счетчик получает один импульс от генератора и увеличивает свое число на 1. Все просто. Скорость счета равна скорости импульсов. В моем проекте я использую генератор на 50МГц. Это 50 миллионов счетов за одну секунду. Тогда какая же будет частота нашей нарастающей пилы, если мы со скоростью 50млн в секунду будем увеличивать на единичку 256 раз, от нуля до 255? Правильно, в 256 раз медленнее, то есть 50 000 000/256 = 195312,5 Гц. Нуу, скажете вы, это же очень быстро, музыка не играет на такой частоте, как же нам замедлить счет еще больше и как нам считать с разными скоростями используя всего один генератор импульсов?

Первый секрет. Это увеличить максимальное число счетчика, очень сильно, значит счетчик будет считать до него гораздо дольше, а значит частота пилы будет гораздо меньше, а чтобы превратить это огромное число назад в диапазон 0-255, мы просто поделим его ровно настолько, насколько умножали. Хорошо, если мы будем делить частоту 50 МГц таким способом на целые числа, у нас получатся частоты, которые кратны 50 МГц, но они будут сильно отличаться от музыкальных частот, которые нам нужны, вот табличка для равномерно темперированного строя


03 - TUNE @ Kingdom

Кроме того, счетчик использует двоичный код, а значит считает до числа кратного степени двойки.

Например если мы использует 24 бита

Nmax = 2^24-1 = 16777215

А для 32-х бит 

Nmax = 2^32-1 = 4294967295

Если мы будем считать от 0 до 4294967295 со скоростью 50 000 000 Гц, мы получим пилу с частотой 50000000/ 4294967296 = 0,0116415321826934814453125 Гц.

Это просто невероятно медленно. Окей, как же тогда нам получить нужную частоту? А давайте прибавлять не единичку, а некое целое число! Это и есть второй секрет: так мы ускоряем счет, но уже не так радикально, как замедление увеличением битности. Чтобы узнать какое это число, нам нужно искомую частоту разделить на этих самых пресловутых 0,0116415321826934814453125 Гц. 

Для 1 Гц это число равно ПРИБЛИЖЕННО 

1Гц / 0,0116415321826934814453125 Гц = 85,89934592.

То есть нам нужен счетчик, который в каждом шаге прибавляет не 1, а 85,89934592 или округлим до 86.  Давайте умножим 

86 на 50 000 000 = 4300000000

Получается погрешность 

4300000000/4294967296-1 = 1,0011717677-1=0,0011717677 или примерно 0,12%!

Неплохо, да? Мы получили волну 1Гц с погрешностью 0,12%!

Победа))

Осталось рассчитать эти прибавки счетчика для КАЖДОЙ музыкальной частоты из таблицы и записать эти прибавки в нашу первую флэшку. Когда нам нужно сыграть на нужной ноте, мы подаем номер ноты на вход флэшки, читаем нужное нам ЗАРАНЕЕ ПРОСЧИТАННОЕ 32-х битное число, и счетчик постоянно складывает вместе с этой прибавкой.

А чтобы на выходе у нас было 8 бит, мы просто берем из этого числа старшие 8 бит, таким образом делим огромное число на 2^24.

Есть еще один нюанс, чисто аппаратный. Флэшка может за один раз выдать только 8 бит из памяти, а нам нужно 32. Значит нужно собрать  читалку , которая читает 4 байта (1 байт = 8 бит) подряд и подает готовое 32х битное число на счетчик.

Итак, структурная схема осциллятора с читалкой получилась такая 


Synth PM @ Kingdom

Пройдемся по обозначениям:

OSC – генератор импульсов, я вначале использовал встроенный в MAX II генератор 5,56 МГц, потом узнал, что на китайской плате стоит внешний на 50 МГц, провод ON включает генератор, если подать «1».

Counter328 – 32-х битный счетчик адреса волны с 8 битным выходом адреса на вторую флэшку волны, 32-хбитным входом прибавки Def, 8-хбитным входом фазы(это даст возможность сделать FM синтез)

Countread – читалка прибавок частот  с первой флэшки

Толстые линии – это жгуты/шины проводов.

А вот чтобы сделать все эти счетчики и схему, мне пришлось изучить настоящий язык эльфов VERILOG и программу для разработки QUARTUS!

Код счетчика:

module counter328(

    clk,

clr,

def,

phase,

clk2,

    adr

);


input clk;

input clr;

input [31:0]def;

input [7:0]phase;

output clk2;

output [7:0]adr;


reg [31:0]cnt = 0;


assign adr[7:0] = cnt[31:24]+phase[7:0];


assign clk2 = cnt[31];


always @(posedge clk or posedge clr) begin

    if (clr)

        cnt <= 0;

    else

        cnt <= cnt + def;

end


endmodule

Код читалки:

module countread(

    clk,

clr,

in,

adr,

    out

);


input clk;

input clr;

input [7:0]in;

output [1:0]adr;

output [31:0]out;

reg [31:0]out;

reg [31:0]buffer;


reg [2:0]cnt = 0;


assign adr[1] = cnt[2];

assign adr[0] = cnt[1];


always @(posedge clk or posedge clr) begin

    if (clr)

        cnt <= 0;

    else begin

        case(cnt)

  0:begin

  out <= buffer;

  end

  1:begin

  buffer[7:0] <= in[7:0];

  end

  3:begin

  buffer[15:8] <= in[7:0];

  end

  5:begin

  buffer[23:16] <= in[7:0];

  end

  7:begin

  buffer[31:24] <= in[7:0];

  end

  endcase

  cnt <= cnt + 1;

end   

end


endmodule

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

Вот его контакты

https://vk.com/bolshakov_av

https://vk.com/fpga_synth

https://habr.com/ru/users/UA3MQJ/

Отдельно хочу поблагодарить его за интеллектуальную помощь.


Финальная версия синтезатора которую я хочу прошить в чип, выглядит в проекте вот так


Synth MIDI PM @ Kingdom

 

Скачать и посмотреть в Full HD можно здесь

И да. Тема очень сложная и я не буду вас учить микроэлектронике! Учитесь сами)

6 ▲
19 March 2020 13:29
Kingdom
26 comments