PDA

Просмотр полной версии : Special9K - FPGA Специалист



RW9UAO
31.10.2024, 10:59
Special9K - это аппаратный эмулятор (практически настоящий компьютер!) для недорогой китайской FPGA-платы Sipeed Tang Nano 9K, которая стоит менее 2000 руб. (https://aliexpress.ru/item/1005003810516969.html?sku_id=12000027243899141)

https://github.com/RW9UAO/special9K/raw/main/photo_2024-10-31_10-46-13.jpg

В настоящий момент Special9K поддерживает:

- Компьютер Специалист по стандартной схеме с 48 кб ОЗУ (используется реверснутое ядро КР580ВМ80А от Vslav (https://github.com/1801BM1/vm80a))
- Расширение для 8 цветов (МК 1990 №8)
- SD-карта по схеме HWM_PVV (SDOS (https://zx-pk.ru/threads/29892-sd-karta-i-sdos-dlya-8i-bitnykh-pk.html)) - #D000
- Таймер К580ВИ53 по схеме SP580 - #E000

Управление осуществляется с помощью PS/2-клавиатуры.

Подключение клавиатуры:
ps2_kb_clk (D+) - 25 pin
ps2_kb_dat (D-) - 26 pin

ВНИМАНИЕ!!! Не забудьте согласовать сигналы по напряжению! Я использую USB-клавиатуру в режиме PS/2. На линии данных USB установлены 2 резистора по 10 кOм pull-up и level shifter 5B - 3.3В.

Используются следующие комбинации клавиш:
<Alt> + <Shift> = РУС/ЛАТ
<Ctrl> + <Alt> + <Del> = RESET

Программы загружаются c microSD-карты. Для этого отформатируйте карту в FAT16 (!) и скопируйте на неё файлы в формате RKS. Программы для Специалиста можно скачать, например с сайта fifan'а (https://специалист-пк.рф/index7.html). Далее вставляете эту карту в Tang Nano 9K, запускаете Специалист, и после появления на экране надписи "PROGRAM?" жмёте <F1> и далее <Enter>. После этого вы оказываетесь в Мониторе, где можете запустить SDOS командой GD000. С помощью команды DIR выведете содержимое вашей microSD карты. Запуск программы осуществляется путём набора её имени с последующим нажатием на Enter. Подробнее про SDOS вы можете прочитать с соответствующей теме на форуме.

Известные проблемы:
- часть кнопок работает не так, как хотелось бы
- нет поддержки реального магнитофона

Исходные тексты доступны на GitHub (https://github.com/RW9UAO/special9K).

Доступны готовые сборки:

special9k_1280x720_50Hz.fs (https://github.com/RW9UAO/special9K/raw/refs/heads/main/special9k_1280x720_50Hz.fs) - базовая версия, широкий экран, масштаб 2:2 (большой бордюр)
special9k_1280x720W_50Hz.fs (https://github.com/RW9UAO/special9K/raw/refs/heads/main/special9k_1280x720W_50Hz.fs) - расширенное изображение, широкий экран, масштаб 3:2 (большой бордюр)
special9k_800x600_60Hz.fs (https://raw.githubusercontent.com/RW9UAO/special9K/refs/heads/main/special9k_800x600_60Hz.fs) - лучшее заполнение, но нестандартные 60Hz, экран 4:3 (маленький бордюр)

Пожелания принимаются, но не обещаю, что воплощу. На вопросы отвечу обязательно.

Демонстрация работы Special9K:


https://plvideo.ru/watch?v=jskJZ899R0pC


https://plvideo.ru/watch?v=oR8Xwlf6oq39

CityAceE
02.12.2024, 19:50
После того, как послушал на Emu80, решил проверить а как оно будет звучать на FPGA версии Специалиста. И при том, что в этом варианте компьютера звук магнитофон не микшируется с общим звуком, есть некий звон.

https://plvideo.ru/watch?v=9YVSeFshcAbH

ivagor
02.12.2024, 20:23
Не знаю, как сделан звук в конкретной FPGA реализации, не могу прокомментировать.

- - - Добавлено - - -

1. Это не магнитофон, можно выключить в Emu80 соответствующую настройку и послушать.
2. Записал звук и построил спектр. Это алиасинг, пищит в районе 8200. Очень похоже, что в данной FPGА реализации нет ФНЧ, устраняющего алиасинг, как и в некоторых эмуляторах. Или он есть, но не совсем правильный. Хотя бывает и хуже.

- - - Добавлено - - -

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

CityAceE
02.12.2024, 21:32
И что самое удивительное, реальный компьютер молчит. Программа загружается без ошибок, но после запуска ведёт себя, как будто бы нажали на СБРОС. Но у меня стандартная схема НП, то есть через ВВ55. Так что скорее всего в этом и есть причина.

ivagor
02.12.2024, 21:40
Но у меня стандартная схема НП, то есть через ВВ55. Так что скорее всего в этом и есть причина.
100%

CityAceE
03.12.2024, 11:07
Записал звук и построил спектр. Это алиасинг, пищит в районе 8200. Очень похоже, что в данной FPGА реализации нет ФНЧ, устраняющего алиасинг, как и в некоторых эмуляторах. Или он есть, но не совсем правильный. Хотя бывает и хуже.
Побуду передаточным звеном, хотя Сергей присутствует на форуме:



Нету там никаких фильтров. Код выложен, посмотрели бы :) Пойду гуглить разницу между алиасингом и ФНЧ. До кучи надо добавить FIFO между выходом звука и HDMI-входом звука, ибо разные частотные домены. Звук я планировал выводить также и на лапку, да через дельта-сигма и RC-фильтр.

RW9UAO
03.12.2024, 12:16
2. Записал звук и построил спектр. Это алиасинг, пищит в районе 8200.

нету ни фильтров, ни чего-то другого. ненастоящий я сварщик.
ФНЧ на какую частоту резать?

микс такой :
assign soundL = { vi53_out[0], beep, 14'b0 };
assign soundR = { vi53_out[0], beep, 14'b0 };
делать с & как в железном? ВИ53 по reset молчит, заглушен.

ivagor
03.12.2024, 12:38
Код выложен, посмотрели бы
Где можно посмотреть?

CityAceE
03.12.2024, 12:53
Где можно посмотреть?
Вот тема со ссылкой на GitHub: https://zx-pk.ru/threads/35973-special9k-fpga-spetsialist.html

ivagor
03.12.2024, 15:03
Для повышения качества околошимных штук надо менять подход к звуковой подсистеме. Придется не ограничиваться одиночными beep, а сохранять историю, в идеале с частотой проца. Сохраняем последние 128 (или больше) значений (степень двойки удобна для кольцевого буфера). Дальше надо считать фильтр, но для начала можно попробовать простейший вариант - beep для отправки в аудиокодек считаем как сумму последних 96 значений (соответственно меняем масштабирование при передаче в soundL и soundR).
Насчет частоты дискретизации аудиокодека признаюсь не понял, в audio_clock_regeneration_packet.sv
parameter int AUDIO_RATE = 48e3
но по оцифровке больше похоже на 44100.
И если правильно понял, сейчас собрано с z80. Я считал ноты по таймингам 8080, для z80 лучше использовать отдельную версию.

- - - Добавлено - - -


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

CityAceE
03.12.2024, 15:08
Предположительно меня может сбивать то, что CityAceE еще раз оцифровывал звук и возможно с частотой 44100.
Я просто на камеру телефона снимал по умолчанию - прямо так и выложил. У меня есть HDMI-капчер, но он наотрез отказывается воспринимать звук FPGA Специалиста. Поэтому я не могу выкладывать более качественные ролики, ну разве что без звука. Однако при этом звук из монитора через тот же HDMI идёт. Может это всё отголоски одной и той же проблемы?

Перенёс оффтопик в профильную тему.

RW9UAO
03.12.2024, 15:38
дискретизация звука - 48 кГц, процессор - ВМ80 от 1801BM1@gmail.com
прикрутил LPF от OCM, с кнопочкой вкл\bypass
чёт на мой ухо - одинаково
не увидел там частоту среза, и клок подал 27м вместо 21м

ivagor
03.12.2024, 16:04
процессор - ВМ80
Стормозил, не заметил что T80 в режиме z80 закомментирован.

RW9UAO
03.12.2024, 16:06
простите великодушно, буфер истории я собрал (не понял про кольцевой, сделал обычный):

reg [127:0]soundbuff;
reg [15:0]soundsum;
always @( posedge cpu_clk )begin
soundbuff <= {soundbuff[126:0], beep};
end
зачем собирать 128, если надо сумму с накоплением 96 значений.

ivagor
03.12.2024, 17:06
Кольцевой чтобы удобно было адресовать по модулю 128.
..., 126, 127, 0, 1, ...

- - - Добавлено - - -

Записываем текущее значение, перемещаем указатель на 1.

ivagor
04.12.2024, 10:28
Вариант со сложением последних 96 отсчетов временный, особо тестировать его нет смысла. Он подавляет лишние повторения спектра, что хорошо, но все же неравномерность АЧХ в полосе пропускания неприемлемая, слишком подавляет высокие частоты, что не очень хорошо.
Если пока нет других вариантов, то можно попробовать вот такой КИХ(FIR)-фильтр, он более-менее ровно пропускает до 18 кГц (при частоте следования отсчетов 2 МГц). 512 коэффициентов, округлил и масштабировал до знакового байта (int8). В полосе пропускания усиливает в 6000 раз. Раз его выход знаковый, то можно и исходные значения сделать знаковыми: -1 и 1 вместо 0 и 1. Если источников звука несколько, то лучше сохранять в линии задержки сумму и обрабатывать фильтром.

CityAceE
04.04.2025, 09:40
Кто хочет присоединиться к обсуждению проекта реализации платы FPGA-Специалиста, добро пожаловать в Телеграм-группу (https://t.me/fahivets85).

https://pic.maxiol.com/thumbs2/1743748544.780858384.photo20250318194657.jpg (https://pic.maxiol.com/?v=1743748544.780858384.photo20250318194657.jpg&dp=2) https://pic.maxiol.com/thumbs2/1743748528.780858384.photo20250318194727.jpg (https://pic.maxiol.com/?v=1743748528.780858384.photo20250318194727.jpg&dp=2)

Проект реализует RW9UAO как развитие собственного проекта (https://zx-pk.ru/threads/35973-special9k-fpga-spetsialist.html) по моим хотелкам (https://docs.google.com/document/d/1NPMRWMKKEvDmDscstz4TCaCwGnBxE-iC9ChFgSU9NKk/edit?usp=sharing).

CityAceE
30.04.2025, 18:49
Теперь у нас есть UART + XMODEM по штатному USB-кабелю!


https://rutube.ru/video/766da4ce4a39b7e3e5e628f570513672/