Просмотр полной версии : Спекки на FPGA с минимумом корпусов.
Уже вторую неделю перелопачиваю форум и прочие ресурсы. Интересно собрать воедино информацию реализации клонов Спекки на FPGA, с софтовыми процом и прочее.
Наиболее простым, по количеству деталей получается самая последняя разработка форумчанина MVV ReVerSE-U16 http://zx-pk.ru/showthread.php?t=23528 можно назвать это верхом использования современных технологий. Даже подумываю купить плату этого конструктора, но использование специализированной микросхемы USB-host мне почему-то не понравилось и соответственно часы с сетевым адаптером можно просто не припаивать. Использование HDMI вообще революционно, но (как я понял) софтово пока не удалось реализовать вывод звука через этот разъём.
В других решениях, разработанных раньше, а так же при использовании профессиональных девборд, много, как мне кажется лишнего. Прежде всего все эти разработки делаются, или из-того, что есть, или (при разработке нового) закладываются возможности реализации всего и сразу.
Мне вообще импонирует, что здесь на форуме, собрались не просто любители ретро компьютеров, а энтузиасты любящие делать что-то своими руками и головой.
Вот и я хочу так же, какой-нибудь простенький, конструктор изобрести, если не возражаете ;)
---------- Post added at 08:28 ---------- Previous post was at 06:30 ----------
Так как я "чайник" в разработке на FPGA то у меня нет привязанности к определённым фирмам, и чипам.
Рассматриваю на данный к примеру MAX 10 10M08SAE144C8GES, но вот не вижу пока их в продаже.
Очень интересны микросхемы Lattice. Жалко, что русскоязычной информации о них мало. Как вариант http://ru.aliexpress.com/item/YUKE-LCMXO2-7000HC-4TG144C-IC-CPLD-3432MC-7-24NS-144TQFP-Lattice-Semiconductor-Corporation/1712762993.html
Недостаток этих микросхем, высокая цена. Преимущество во встроенных флэш памяти и стабилизаторах питания ядра.
Anubis_OD
12.08.2015, 08:51
Платки с Макс 10 есть на алиэкспресе. Около 70$ цена.
Платки с Макс 10 есть на алиэкспресе. Около 70$ цена.
http://ru.aliexpress.com/item/1-pcs-x-EK-10M08E144ES-P-Programmable-Logic-IC-Development-Tools-Eval-Kit-MAX-10-FPGA/32402624564.html
Всё, что нашёл и то борда заточена под какой-нибудь анализатор сигналов.
Сама микросхема должна быть в пределах $15-20.
Anubis_OD
12.08.2015, 11:24
Но все таки есть?
Похоже это клон (или оригинал) фирменной Альтеровской платки
http://www.buyaltera.com/scripts/partsearch.dll?Detail&name=544-3042-ND
Она же
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=218&No=708
еще и зарабатывают китайцы..
Ну а так, чтобы была сразу заточена под Спекии - точно ничего не будет.
Спекки на FPGA с минимумом корпусов.
Ну ни как не возьму в толк, зачем вам отдельный эмулятор спекки, если их софтовых завались, деньги на ветер, или я чего не догоняю? Вот если бы не было софтовых эмуляторов, а желание поюзать спекки есть, но нет возможности реализации на родном железе, тогда понятно.
ILoveSpeccy
12.08.2015, 12:48
Спекки на FPGA с минимумом корпусов.
Ну ни как не возьму в толк, зачем вам отдельный эмулятор спекки, если их софтовых завались, деньги на ветер, или я чего не догоняю? Вот если бы не было софтовых эмуляторов, а желание поюзать спекки есть, но нет возможности реализации на родном железе, тогда понятно.
Мне нравится делать чтото своими руками. Люблю паять и программировать (хотя программист из меня ещё тот, но всё же). А по существу конечно ты прав.
У меня в планах ещё один интересный проект, но уже очень своеобразный... Не получится заменить чем либо другим. И купить где-то наверное не получится, короче только самому... Как начну делать, будет отдельная тема!
ILoveSpeccy
12.08.2015, 13:52
такая же участь ждет и всех разработчиков нового, потом самим им и долбаться с железкой, ILoveSpeccy, это тебя тоже касается :)
Так я это и так прекрасно понимаю, хотя это самое "долбаться" наверное и есть именно то, ради чего вообще это делаю.
Иногда так всё достаёт, особенно работа... Придешь домой, и вечерком часок "подолбаться" такой кайф! Серьёзно... Я как будто от внешнего мира ненадолго отключаюсь, душа требует просто.
Нравится не нравится, а современные USB флешки, клавиатуры, мышки, bluetooth адаптеры, WiFi адаптеры, принтера, web камеры, gamepad как-то нужно подключать. Можно и не использовать, подключить через uBUS адаптер PS/2 или сдвиговый регистр с механической клавиатурой к примеру.
Часы с сеткой припаять всё-же желательно, как потом в игры по сетке играть, на zx-pk.ru зайти и скачать обновления?
Звук допиливается, согласен, медленно, но я один всё и прикручиваю в основном, такая же участь ждет и всех разработчиков нового, потом самим им и долбаться с железкой, ILoveSpeccy, это тебя тоже касается :) Тут или объединятся над чем-то одним, развивать, писать софт, или сами по себе :)
USB host, на самом деле это круто, но и сам чип Vulcano мне не нравится ценой и узостью. На Sp_2010 был поставлен ARM, это уже интереснее. Лучше идти в том же направлении. На STM32 сделать USB host (часики в нём тоже есть), при чём только на один разъём, но на него уже вешать внешний разветвитель. Если нужна только "клава", то цепляем напрямик, иначе через разветвитель. Но как раз в отличии от Sp_2010 этот контроллер должен быть отдельным устройством (не разбирался как у ILoveSpeccy PIC работает).
На счёт сети не знал даже, неужели, во что-то "спековское" можно играть по сети? Даже игр на двоих мало, но тут достаточно двух геймадов.
На счёт "подолбаться с железякой" в самое яблочко, в этом наверное самый кайф.
Но все таки есть?
Похоже это клон (или оригинал) фирменной Альтеровской платки
http://www.buyaltera.com/scripts/partsearch.dll?Detail&name=544-3042-ND
Она же
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=218&No=708
еще и зарабатывают китайцы..
Ну а так, чтобы была сразу заточена под Спекии - точно ничего не будет.
Заточенная плата как раз есть и не одна, на этом форуме в разделе барахолка/новодел ;)
Вообщем MAX 10 оставим на будущее.
Попробую вот это заказать http://www.latticestore.com/products/tabid/417/categoryid/59/productid/269/default.aspx если мозгов хватит, то можно будет конструктор замутить STM32 плюс Lattice
можно будет конструктор замутить STM32 плюс Lattice
На Lattice интересно было бы увидеть проект:) Для начала.
Вот нашёл полезную информацию по кодированию звука и видео в HDMI
http://www.xilinx.com/support/documentation/application_notes/xapp460.pdf
http://hamsterworks.co.nz/mediawiki/index.php/SPDIF_out
Зарегился на сайте Lattice скачал их Diamond Software, только вот пишут, что есть хорошая прога для синтеза RTL -- Synplify Pro, где бы стянуть на неё лекарство.
С этим я знаком, там нет конкретики и примеров реализации Audio Clock Regeneration Packet и Audio Sample Packet.
Так вроде пакеты звука синхронизируются теми же строчными импульсами или я не прав?
Практический рабочий пример этого есть? Гадать не умею...
Не гадать не надо. Надо изучить спецификацию и закодить.
Кстати, а эта штука от Альтеры платная, что ли? https://www.altera.com/en_US/pdfs/literature/ug/ug_hdmi.pdf
Я сейчас не за тем компом на котором можно проверить.
Так изучаем и кодим (https://github.com/mvvproject/ReVerSE-U16/tree/master/u16_zx128k) потихоньку...
В примере нет ничего для работы со звуком.
Так это не примеры же, а мануал к IP-core generator's от Альтеры. У меня свежий Quartus, бесплатный который, на другом компе стоит и интернет там нормальный, а сейчас я на даче с ноутбуком.
Пытался перенести Спекки под Циклон2, (в качестве тренировки) есть у меня платка с EP2C5Q208C8 и HY57V28820H, но проекты под FPGA есть либо с SRAM, те что попроще, либо на более мощных чипах, в которых есть встроенная память, в достаточном количестве от 32K*8b. Не знаю пока как это победить.
Кто нибудь игрался с таким комплектом? http://www.ebay.com/itm/Xilinx-FPGA-CORE-Board-XC6SLX9-Expansion-Board-USB-Sound-Ethernet-SD-Card-VGA-/291004646022?hash=item43c13a8286 Вроде всё есть, что надо и не слишком дорого.
Вопрос к знатокам.
При наличии встроенной в FPGA памяти, при инициализации содержимое РОМа заливается в неё из конфигурационной памяти.
...
initial begin
$readmemh("./ROM/128.HEX", mymem);
end
...
Как это сделать при использовании чисто внешнего ОЗУ?
---------- Post added at 16:45 ---------- Previous post was at 16:23 ----------
Но все таки есть?
Похоже это клон (или оригинал) фирменной Альтеровской платки
http://www.buyaltera.com/scripts/partsearch.dll?Detail&name=544-3042-ND
Она же
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=218&No=708
еще и зарабатывают китайцы..
Ну а так, чтобы была сразу заточена под Спекии - точно ничего не будет.
На Марсоходе анонсирована MAX10 http://marsohod.org/index.php/plata-marsokhod3
Viktor2312
16.08.2015, 17:26
Бери Xilinx и всё у тебя будет. Забудь про Altera и уж тем более Lattice. ИМХО, Хотя знаю сейчас последует бан меня на неделю как минимум. Ну это не страшно, вразуми, что написал, и будет тебе счастье...
shurik-ua
16.08.2015, 17:47
Убийца Марсоход3
Запили им убийцу всех Марсоходов, я не знаю - Венераход-2015 )) - с блекджеком и плюшками )))
Цена: 8000.:v2_eek: руб.
+ Audio 450.00 руб.
+ Ethernet 550.00 руб.
+ Dual-core ARM Cortex-A9 processor забыли поставить?
+ 1GB DDR3 SDRAM забыли поставить?
+ Two 40-pin expansion header забыли поставить?
+ SD Card забыли поставить?
= DE0-Nano-SoC Kit/Atlas-SoC Kit (http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=941) $90 :v2_conf2:
...
Не знаю, как с этого сайта. Но вот на Али http://ru.aliexpress.com/item/Spot-DE0-NANO-SOC-Cyclone-V-SE-800MHz-ARM-Cortex-A9-Terasic-Development-Board/32416112076.html цена уже другая.
За Марсоход не агитирую, но автор хорошее дело делает. Тем более как раз больше примеров можно будет увидеть в работе.
Да куда мне одному, с компанией тягаться? Хорошее дело делают, для обучения самое-то.
...
А вообще, у парней из ООО "Инпро Плюс", город Таганрог, Россия, Марсоход - это OSHW мега-проект! http://marsohod.org
...
Хочешь я тебе такой сайт сделаю, придумай название только для ООО позабористее ;)
На Марсоходе подсказали использовать файл epcs_virtual_memory вот разбираюсь пока с нюансами. Добавил файл в проект, сформировал модуль из файла, в библиотеке добавились 4 символа.
В самом модуле надо исправить cyclone_ на cycloneii_
--synthesis read_comments_as_HDL on
--COMPONENT cycloneii_asmiblock is
--PORT (
-- signal data0out : OUT STD_LOGIC;
-- signal oe : IN STD_LOGIC;
-- signal scein : IN STD_LOGIC;
-- signal dclkin : IN STD_LOGIC;
-- signal sdoin : IN STD_LOGIC
-- );
--END COMPONENT cycloneii_asmiblock;
--synthesis read_comments_as_HDL off
В визарде надо создать 2-ух портовую ОЗУ для кэша на 256 байт.
И дальше мне уже надо пилить "mem_ctrl" чтобы он загружал данные в ОЗУ и запускал Z80.
А зачем двухпортовую озу? Разве нельзя напрямую байт за байтом копировать?
А зачем двухпортовую озу? Разве нельзя напрямую байт за байтом копировать?
Непосредственно сам модуль требует, хотя если только раз прочитать, то регистра хватило бы за глаза.
Какой модуль требует?
Выставил адрес на epcs контролере, дернул RD, защелкнул данные в регистр, выставил данные на озу, дернул WR, записал данные в ОЗУ.
Счетчик адреса можно использовать общий для epcs контролера, а после счетчика задавать смещение отдельно для ОЗУ и контролера.
Какой модуль требует?
Выставил адрес на epcs контролере, дернул RD, защелкнул данные в регистр, выставил данные на озу, дернул WR, записал данные в ОЗУ.
Счетчик адреса можно использовать общий для epcs контролера, а после счетчика задавать смещение отдельно для ОЗУ и контролера.
Не, тогда файл (модуль) epcs_virtual_memory надо переписывать. Я же по дилетантски, добавил файл в проект и правлю его только, когда совсем приспичит.
-- Cache Memory
cache : epcs_virtual_memory_dpram
PORT MAP
(
data => cache_data_in,
wren => cache_wr,
wraddress => cache_wraddress,
rdaddress => cache_rdaddress,
clock => CLK,
aclr => RST,
q => cache_data_out
);
По хорошему, вместо этого файла сделать что попроще по тому же принципу, с минимумом функционала.
Вытащил такой код, создал новый файл, попроще и без кэша.
--------
-- EPCS Memory Package
--------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY epcs_mem IS
PORT(
RST : IN std_logic;
CLK : IN std_logic;
-- ASMI interface
--exemplar translate_off
ASMI_CLK : OUT std_logic;
ASMI_CS : OUT std_logic;
ASMI_MOSI : OUT std_logic;
ASMI_MISO : IN std_logic;
--exemplar translate_on
-- Local Interface
EPCS_CS : IN std_logic;
EPCS_RD : IN std_logic;
EPCS_WR : IN std_logic;
EPCS_ERASE : IN std_logic;
EPCS_ADDR : IN std_logic_vector(23 DOWNTO 0);
EPCS_DATA_IN : IN std_logic_vector(7 DOWNTO 0);
EPCS_DATA_OUT : OUT std_logic_vector(7 DOWNTO 0);
EPCS_WAITREQ : OUT std_logic
);
END ENTITY epcs_mem;
-----
-- Architecture
-----
ARCHITECTURE behaviour OF epcs_mem IS
CONSTANT flash_sector_code_offset : INTEGER := 2;
CONSTANT flash_sector_code_size : INTEGER := 1;
CONSTANT flash_sector_data_offset : INTEGER := 3;
CONSTANT flash_sector_data_size : INTEGER := 2;
CONSTANT dp_avalon_addr_width : INTEGER := 17;
CONSTANT cp_avalon_addr_width : INTEGER := 16;
CONSTANT delay_counter_data : INTEGER := 2;
CONSTANT avalon_clk_is_too_fast : std_logic := '0';
-----
-- Components
-----
--synthesis read_comments_as_HDL on
--COMPONENT cycloneii_asmiblock is
--PORT (
-- signal data0out : OUT STD_LOGIC;
-- signal oe : IN STD_LOGIC;
-- signal scein : IN STD_LOGIC;
-- signal dclkin : IN STD_LOGIC;
-- signal sdoin : IN STD_LOGIC
-- );
--END COMPONENT cycloneii_asmiblock;
--synthesis read_comments_as_HDL off
-----
-- State Machine
-----
TYPE state_type IS
(
idle,
read, read_loop,
write, write_enable_loop, write_cmd, write_cmd_loop, write_data, write_data_loop, write_status, write_status_loop, write_check_status,
release
);
SIGNAL current_state, next_state : state_type;
-----
-- Signals
-----
-- Misc
CONSTANT zeros_3bytes : std_logic_vector(23 DOWNTO 0) := x"000000";
-- ASMI
CONSTANT read_bytes_cmd : std_logic_vector(7 DOWNTO 0) := "00000011";
CONSTANT read_status_cmd : std_logic_vector(7 DOWNTO 0) := "00000101";
CONSTANT write_bytes_cmd : std_logic_vector(7 DOWNTO 0) := "00000010";
CONSTANT write_enable_cmd : std_logic_vector(7 DOWNTO 0) := "00000110";
CONSTANT erase_sector_cmd : std_logic_vector(7 DOWNTO 0) := "11011000";
--synthesis read_comments_as_HDL on
--SIGNAL asmi_clk, asmi_cs, asmi_mosi, asmi_miso : std_logic;
--synthesis read_comments_as_HDL off
SIGNAL asmi_clk_int : std_logic;
SIGNAL asmi_cs_int : std_logic;
-- Counter
SIGNAL counter, counter_data : INTEGER RANGE 0 TO 64;
SIGNAL counter_load, counter_zero : std_logic;
-- Shift Register
SIGNAL shift_register, shift_register_data : std_logic_vector(31 DOWNTO 0);
SIGNAL shift_register_load, shift_register_run : std_logic;
-- Delay Counter
SIGNAL delay_counter : INTEGER RANGE 0 TO 15;
SIGNAL avalon_clk_divided : std_logic;
SIGNAL asmi_clk_enable : std_logic;
BEGIN
EPCS_DATA_OUT <= shift_register(7 DOWNTO 0);
-- Clock divider
PROCESS(CLK, RST, delay_counter)
BEGIN
IF RST = '1' THEN
avalon_clk_divided <= '0';
delay_counter <= 0;
ELSIF (CLK'event AND CLK = '1') THEN
IF delay_counter = 0 THEN
delay_counter <= delay_counter_data;
avalon_clk_divided <= '1';
ELSE
delay_counter <= delay_counter - 1;
avalon_clk_divided <= '0';
END IF;
END IF;
END PROCESS;
-- Select ASMI CLK
asmi_clk_int <= avalon_clk_divided WHEN avalon_clk_is_too_fast = '1' ELSE CLK;
asmi_clk_enable <= avalon_clk_divided WHEN avalon_clk_is_too_fast = '1' ELSE '1';
asmi_clk <= asmi_clk_int;
-- State Machine
PROCESS(RST, CLK)
BEGIN
IF RST = '1' THEN
current_state <= idle;
ELSIF (CLK'event AND CLK = '1') THEN
current_state <= next_state AFTER 2 ns;
END IF;
END PROCESS;
PROCESS(current_state, EPCS_CS, EPCS_WR, EPCS_RD, EPCS_ERASE, EPCS_ADDR, EPCS_DATA_IN, counter_zero, shift_register)
BEGIN
EPCS_WAITREQ <= '0';
shift_register_data <= (others => '0');
shift_register_load <= '0';
shift_register_run <= '0';
counter_data <= 0;
counter_load <= '0';
CASE current_state IS
WHEN idle =>
IF EPCS_CS = '1' THEN
IF EPCS_RD = '1' THEN
EPCS_WAITREQ <= '1';
next_state <= read;
ELSIF (EPCS_WR = '1' OR EPCS_ERASE = '1') THEN
EPCS_WAITREQ <= '1';
next_state <= write;
ELSE
next_state <= idle;
END IF;
ELSE
next_state <= idle;
END IF;
-- Read one byte from flash
WHEN read =>
EPCS_WAITREQ <= '1';
shift_register_data <= read_bytes_cmd & EPCS_ADDR;
shift_register_load <= '1';
counter_data <= 38; -- was 62 for one word
counter_load <= '1';
next_state <= read_loop;
-- Wait for data to shift in
WHEN read_loop =>
EPCS_WAITREQ <= '1';
shift_register_run <= '1';
IF counter_zero = '1' THEN
next_state <= release;
ELSE
next_state <= read_loop;
END IF;
-- Write one byte to flash
-- First set the Write Enable bit
WHEN write =>
EPCS_WAITREQ <= '1';
shift_register_data <= write_enable_cmd & zeros_3bytes;
shift_register_load <= '1';
counter_data <= 6;
counter_load <= '1';
next_state <= write_enable_loop;
-- Wait for the command be shifted out
WHEN write_enable_loop =>
EPCS_WAITREQ <= '1';
shift_register_run <= '1';
IF counter_zero = '1' THEN
next_state <= write_cmd;
ELSE
next_state <= write_enable_loop;
END IF;
WHEN write_cmd =>
EPCS_WAITREQ <= '1';
IF EPCS_ERASE = '1' THEN
shift_register_data <= erase_sector_cmd & EPCS_ADDR;
counter_data <= 30;
ELSE
shift_register_data <= write_bytes_cmd & EPCS_ADDR;
counter_data <= 29;
END IF;
shift_register_load <= '1';
counter_load <= '1';
next_state <= write_cmd_loop;
-- Wait for data to shift out
WHEN write_cmd_loop =>
EPCS_WAITREQ <= '1';
shift_register_run <= '1';
IF counter_zero = '1' THEN
IF EPCS_ERASE = '1' THEN
next_state <= write_status;
ELSE
next_state <= write_data;
END IF;
ELSE
next_state <= write_cmd_loop;
END IF;
-- Write data
WHEN write_data =>
EPCS_WAITREQ <= '1';
shift_register_data <= EPCS_DATA_IN & zeros_3bytes;
shift_register_load <= '1';
counter_data <= 6; -- was 30 for one word
counter_load <= '1';
shift_register_run <= '1';
next_state <= write_data_loop;
-- Wait for data to shift out
WHEN write_data_loop =>
EPCS_WAITREQ <= '1';
shift_register_run <= '1';
IF counter_zero = '1' THEN
next_state <= write_status;
ELSE
next_state <= write_data_loop;
END IF;
-- Check the WIP (Write In Progress) bit
WHEN write_status =>
EPCS_WAITREQ <= '1';
shift_register_data <= read_status_cmd & zeros_3bytes;
shift_register_load <= '1';
counter_data <= 14;
counter_load <= '1';
next_state <= write_status_loop;
-- Wait for status to shift in
WHEN write_status_loop =>
EPCS_WAITREQ <= '1';
shift_register_run <= '1';
IF counter_zero = '1' THEN
next_state <= write_check_status;
ELSE
next_state <= write_status_loop;
END IF;
-- Is the flash ready?
WHEN write_check_status =>
EPCS_WAITREQ <= '1';
IF shift_register(0) = '0' THEN
next_state <= release;
ELSE
next_state <= write_status;
END IF;
-- Release the waitrequest signal
WHEN release =>
EPCS_WAITREQ <= '0';
next_state <= idle;
WHEN others =>
next_state <= idle;
END CASE;
END PROCESS;
-- Shift Register
PROCESS(RST, CLK, shift_register_load, shift_register_run, asmi_clk_enable, asmi_cs_int)
BEGIN
IF RST = '1' THEN
shift_register <= (others => '0');
ELSIF (CLK'event AND CLK = '1') THEN
IF shift_register_load = '1' THEN
shift_register <= shift_register_data;
ELSIF shift_register_run = '1' THEN
IF asmi_clk_enable = '1' THEN
IF asmi_cs_int = '0' THEN
shift_register <= shift_register((shift_register'high - 1) DOWNTO 0) & asmi_miso;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
-- The data is clocked out on the falling edge.
PROCESS(RST, asmi_clk_int, shift_register_run)
BEGIN
IF RST = '1' THEN
asmi_mosi <= '0';
asmi_cs_int <= '1';
--ELSIF (CLK'event AND CLK = '0') THEN
ELSIF (asmi_clk_int'event AND asmi_clk_int = '0') THEN
--IF asmi_clk_enable = '1' THEN
asmi_mosi <= shift_register(shift_register'high);
IF shift_register_run = '1' THEN
asmi_cs_int <= '0';
ELSE
asmi_cs_int <= '1';
END IF;
--END IF;
END IF;
END PROCESS;
asmi_cs <= asmi_cs_int;
-- Counter
PROCESS(RST, CLK, counter_load, asmi_clk_enable, asmi_cs_int)
BEGIN
IF RST = '1' THEN
counter <= 0;
counter_zero <= '0';
ELSIF (CLK'event AND CLK = '1') THEN
IF counter_load = '1' THEN
counter <= counter_data;
counter_zero <= '0';
ELSE
IF asmi_clk_enable = '1' THEN
IF asmi_cs_int = '0' THEN
IF counter = 0 THEN
counter_zero <= '1';
ELSE
counter <= counter - 1;
counter_zero <= '0';
END IF;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
--synthesis read_comments_as_HDL on
--asmi_block : cycloneii_asmiblock
-- port map(
-- data0out => ASMI_MISO,
-- oe => '0',
-- scein => asmi_cs,
-- dclkin => asmi_clk,
-- sdoin => ASMI_MOSI
-- );
--synthesis read_comments_as_HDL off
END ARCHITECTURE behaviour;
Пока плохо разумею в этих языках, но вроде компилится в символ, уже хорошо.
Теперь в "speccy" надо создать некий процесс. (Контролёр памяти "mem_ctrl", решил не трогать.) Прочесть последовательно байты из флэш, отправить их в память и рестартануть Z80.
Я не профессионал в hdl,даже не любитель, а скорее дилетант, но никак не пойму зачем кеш, я этот модуль использовал для для воспроизведения звука- писал в epcs wav файл, перебирал адреса счетчиком и засылал данные в цап через регистр, все прекрасно работало.
Также пробывал использовать этот модуль как ПЗУ спека напрямую, то есть писал в epcs ром файл, и подключал этот модуль напрямую к шине данных,и адреса z80, сигналом готовности данных в модуле я вейтил Z80, получался очень тормозной спек))))
Вот я и не пойму, вроде модуль позволяет организовать произвольный доступ по любому адресу- нафига тогда кеш, если можно побайтно скопировать образ ром из epcs в ОЗУ?
Вот пример с воспроизведением WAV.
https://yadi.sk/d/qi5OKbeLiVxjV
Wav файл должен быть моно, 22кгц.
В модуле adr_count надо задать начальный адрес WAV файла в EPCS и его размер.
На Lattice интересно было бы увидеть проект:) Для начала.
Установил Lattice Diamond попробую в нём для MachXO2-7000HE собрать проект из файлов u16_speccy для ReVerSE-U16, авось что получится.
Вообщем в MachXO2-7000HE Speccy влазит, без проблем, как впрочем и в 10M08SAE144C8GES, ну память конечно навешивать надо.
Если кому интересно, то могу развести несколько вариантов плат, под эти чипы со статической или динамической памятью, выходом на VGA (если надо то HDMI), плюс Stm32f417vgt6, которая будет USB устройства обслуживать и (опционально) экранчик тип такого http://ru.aliexpress.com/item/3-2inch-320x240-Touch-LCD-Screen-Touch-SPI-ADS7843-LCD-SSD1289-TFT-PCB-adapter-Touth-panel/1557681481.html?spm=2114.03020208.3.2.L8NJuk&ws_ab_test=201407_3,201444_6,201409_4
Соответственно множество ножек как с FPGA, так и микроконтролера могут быть выведены на гребёнку.
Можно вроде голосовалки устроить, какой вариант может быть востребован. Не навязываюсь, если ни кому не интересно всё это, то больше писать не буду, только читать.
Извините что вмешиваюсь. Но что вы скажете по поводу этой платы? Как по мне, так идеально подходит для реализации ZX Spectrum. И vga есть, и памяти достаточно, и порт PS/2 для клавиатуры. Да еще и порт есть. Запросто можно к нему музыкальный сопроцессор пристыковать. http://www.aliexpress.com/item/Cycloneiv-altera-fpga-development-board-learning-board-ep4ce6e22c8n/1594506728.html?spm=2114.01020208.3.113.dffNc8&ws_ab_test=201556_1,201527_3_71_72_73_74_75,201409 _4
Отправлено из моего iPad используя Tapatalk
andykarpov
27.09.2015, 15:41
Извините что вмешиваюсь. Но что вы скажете по поводу этой платы? Как по мне, так идеально подходит для реализации ZX Spectrum. И vga есть, и памяти достаточно, и порт PS/2 для клавиатуры. Да еще и порт есть. Запросто можно к нему музыкальный сопроцессор пристыковать. http://www.aliexpress.com/item/Cycloneiv-altera-fpga-development-board-learning-board-ep4ce6e22c8n/1594506728.html?spm=2114.01020208.3.113.dffNc8&ws_ab_test=201556_1,201527_3_71_72_73_74_75,201409 _4
Данная плата известна на этом форуме как ZR-Tech WXEDA. Первооткрыватель данной платы - товарищ svofsky, за что ему низкий поклон :) Именно он и товарищ ivagor перенесли конфигурацию Вектор-06ц на данную плату.
Свободных пинов на ней очень мало, поэтому svofsky предложил доработку, как подсоединить SD-карту на пины 7-сегментного индикатора. Я развил эту тему и разработал shield-плату, которая ставится вместо этого индикатора.
Вот проекты ретро-компов, которые работают на этой плате:
https://github.com/andykarpov/bk0010-wxeda
https://github.com/andykarpov/tsconf-wxeda
https://github.com/andykarpov/speccy-wxeda
https://github.com/andykarpov/radio-86rk-wxeda
https://github.com/andykarpov/specialist-wxeda
https://code.google.com/p/vector06cc/source/browse/#svn%2Fbranches%2Fwxeda-cycloneiv
А вот проект shield-платы:
https://github.com/andykarpov/wxeda-sdcard-shield
Удачи в освоении :)
Здравствуйте andykarpov!
Помогите пожалуйста.
Пытаюсь Ваш проект (с https://github.com/andykarpov) speccy-wxeda и tsconf-wxeda запустить вот на этой плате:
https://ru.aliexpress.com/item/only-E15-SDRAM-altera-EP4CE15F17C8N-board-fpga-board-altera-board-altera-fpga-development-board-fpga-development/32800440716.html
Не получается.
С платой WXEDA хорошо совместима, FPGA одного семейства (EP4CE15F17), схемы подключения VGA, PS/2, SDRAM (W9825G6EH) одинаковы. SDCard в наличии. Переназначил пины, проверил все настройки проекта, все ОК (Q II 15.1).
Оба проекта стартуют до картинки на экране (как будто нету микросхемы ПЗУ) и все, никаких надписей нет. Появляется матрас, причем с задержкой после конфига FPGA где-то 2 сек.
Логическим анализатором проверил выводы W25Q32 (подключил проводками) в проекте speccy-wxeda - 0, никаких обращений к мс нету.
Что удивительно, Ваш же проект Радио-86РК для WXEDA прекрасно работает.
Не знаете в чем такое различие EP4CE6E22C8 и EP4CE15F17C8 что Ваши проекты на второй работают лишь частично?
(Работать с FPGA я только учусь.)
andykarpov
14.12.2017, 13:22
Что удивительно, Ваш же проект Радио-86РК для WXEDA прекрасно работает.
Не знаете в чем такое различие EP4CE6E22C8 и EP4CE15F17C8 что Ваши проекты на второй работают лишь частично?
(Работать с FPGA я только учусь.)
Радио86-РК не читает из SPI флешки ничего - поэтому и запускается.
Остальные проекты при старте читают оттуда образы ПЗУ. Хотя я уже не помню, вроде бы переделывал на загрузчик с SD-карты, нужно исследовать ветки в github :)
В SPI флешку что-то записано перед тем, как оттуда что-то читать ?
В SPI флешку что-то записано перед тем, как оттуда что-то читать ?
Все записано, с адреса #B0000, как и положено.
tsconf-wxeda запускается с CDcard, на нее тоже все записал как надо.
Нету никакого обращения к флэшке 25q32, проверял логическим анализатором.
Пробовал вместо loader.hex в FPGA запихнуть test128k.hex, никакого эффекта, матрас...
andykarpov
15.12.2017, 12:43
Из-за глюков форума мой ответ не сохранился...
В общем, попробую донести мысль еще раз:
1) Платы этой у меня уже нет, но точно в ветку master проекта tsconf-wxeda закоммичена актуальная рабочая версия, которая грузит образы ПЗУ из W25Q32.
2) Loader должен появляться в любом случае, потому что он реализован как altsyncram-компонент. Появляется при запуске платы что-то на экране, отличное от матраса ? :)
3) Если Loader таки есть - он быстро-быстро грузит ПЗУ из W25Q32 в SDRAM. Состояние загрузки также должно отображаться. И перед бутом в реальную систему Loader ждет нажатия на enter, вроде бы.
Поэтому, несмотря ни на что, есть в 25q32 что-то или нет - loader должен отработать и загрузить образы ПЗУ (либо нули) в SDRAM.
Если нет обращения к 25q32 - ищите несоответствие схемы и платы / пинов FPGA, на которые назначены сигналы DATA0 / NCSO / DCLK / ASDO.
По поводу проекта speccy-wxeda - нужно смотреть, там вроде бы загрузчик был заменен на FAT32 loader, и вполне логично, что обращения к w25q32 нет - но это было очень давно, нужно проверять :)
2) Loader должен появляться в любом случае, потому что он реализован как altsyncram-компонент. Появляется при запуске платы что-то на экране, отличное от матраса ?
Ничего кроме матраса нет и не проскакивает даже. Матрас разный, иногда бежит, по сбросу иногда одинаковый иногда разный.
С ПЛИС только учусь разбираться, много чего не знаю.
Читаю Cyclone IV Device Handbook, вот вижу что моя FPGA имеет бОльшее кол-во памяти и больше PLL. А не надо заново эти компоненты для моей ПЛИС пересоздать в Q II? Я то в проекте просто переназначил пины в Pin Planner. (тогда почему с радио86рк все нормально?...)
Если нет обращения к 25q32 - ищите несоответствие схемы и платы / пинов FPGA, на которые назначены сигналы DATA0 / NCSO / DCLK / ASDO.
Обращения точно нет. Пины перепроверил. Похоже, не работает лоадер, размещенный в ПЛИС.
andykarpov
15.12.2017, 15:51
Похоже, не работает лоадер, размещенный в ПЛИС.
Это мы сейчас говорим про проект tsconf-wxeda, ветка master, правильно?
Потому как speccy-wxeda - там нужно отдельно смотреть, кажется загрузчик с SD-карточки был корректно реализован в ветке zpu_loader, и я не уверен, какая ветка актуальная для этого проекта.
Это мы сейчас говорим про проект tsconf-wxeda, ветка master, правильно?
Все верно.
Примеры снимков экрана. Думаю что тут более серьезное что-то. Нужно разбираться...
http://s017.radikal.ru/i411/1712/d9/de6643ec4b17.jpg
http://s018.radikal.ru/i514/1712/ae/f649d6faac3f.jpg
http://s017.radikal.ru/i428/1712/74/e75ce76efcaf.jpg
Картинка сдвинута потому что кварц на моей плате 50 МГц, PLL не менял.
andykarpov
18.12.2017, 11:03
Думаю что тут более серьезное что-то
Мда. Интересненько :)
А какая стоит микросхема SDRAM на плате?
PLL - да, вероятно, нужно бы пересчитать, отталкиваясь от тактовой 50МГц.
При настройке PLL на 50 Мгц QII выдает:
clock multiplication factor - 42
clock division factor - 25
множитель 42 (2.1 ГГц) не многовато будет? В даташите написано - PLL internal VCO operating range 600 — 1300 MHz
А какая стоит микросхема SDRAM на плате?
W9825G6EH-75 (посмотрел уже, полный аналог MT48LC16M16A2TG-75, которая установлена на WXEDA).
Вот еще интересно, на tsconf экран всегда бежит с полосками, не присущими спектрум-экрану. А на speccy всегда четко стоящий матрас, явно спектрум-экран и одноцветный бордюр.
множитель 42 (2.1 ГГц) не многовато будет?
Там 84 МГц, не многовато. Пересоздайте altpll в соответствии требуемых выходных частот и вашей ПЛИС и перепроверьте правильность назначенных выводов.
omercury
20.12.2017, 12:28
запустить вот на этой плате:
https://ru.aliexpress.com/item/only-E15-SDRAM-altera-EP4CE15F17C8N-board-fpga-board-altera-board-altera-fpga-development-board-fpga-development/32800440716.html
http://zx-pk.ru/threads/27655-zx-spectrum-next-%E2%80%94-novyj-%C2%ABspektrum%C2%BB-uzhe-na-kickstarter.html?p=928437&viewfull=1#post928437
Там 84 МГц, не многовато.
Надо перекраивать корку на CL3, у мну руки пока не дошли.(((
- - - Добавлено - - -
При настройке PLL на 50 Мгц QII выдает:
clock multiplication factor - 42
clock division factor - 25
множитель 42 (2.1 ГГц) не многовато будет? В даташите написано - PLL internal VCO operating range 600 — 1300 MHz
Ничего там на самом деле не умножается.
PLL (ФАПЧ) работает по другому: есть два генератора, один опорной частоты(внешний, здесь 50МГц), второй - ГУН. После каждого стоят счётчики с программируемым коэффициентом деления. Счётчик с генератора опорной частоты называется делителем делителя, а с выхода ГУН делителем умножителя. Петля ФАПЧ поддерживает одинаковые частоты на выходах обоих делителей.
То есть, в нашем случае надо получить частоту 84МГц, для этого:
умножитель (коэффициент деления после ГУН) ставится 42 (84/42=2)
делитель (кэф после опорного) ставится 25 (50/25=2).
Частоты равны, условие выполняется.
600 - 1300МГц, это допустимые частоты для самого ГУН, его выход в любом случае в модуле PLL делится минимум на 2, чтоб получить меандр.
запустить вот на этой плате:
https://ru.aliexpress.com/item/only-E15-SDRAM-altera-EP4CE15F17C8N-board-fpga-board-altera-board-altera-fpga-development-board-fpga-development/32800440716.html
http://zx-pk.ru/threads/27655-zx-spectrum-next-%E2%80%94-novyj-%C2%ABspektrum%C2%BB-uzhe-na-kickstarter.html?p=928437&viewfull=1#post928437
Времени мало, особенно перед НГ, но потихонечку разбираюсь с ПЛИСами.
На своей плате попробовал проект https://hsel.co.uk/2016/05/10/fpga-vga-and-sdram/ (FPGA VGA AND SDRAM)
SDRAM, судя по картинке на мониторе работает на 100 МГц без ошибок.
- - - Добавлено - - -
А может сдуть MT48LC16M16A2TG с PC-модуля памяти и впаять вместо W9825G6EH, так сказать ради эксперимента?
- - - Добавлено - - -
Надо перекраивать корку на CL3, у мну руки пока не дошли.(((
Стоит ожидать, что руки все-таки дойдут?
omercury
20.12.2017, 18:00
Стоит ожидать, что руки все-таки дойдут?
ХЗ.
Если зетник не гнать выше 7МГц, то можно просто вдвое уменьшить такт корки SDRAM (до 42МГц), остальные частоты не трогать.
На этой плате на 42 работает нормально.
Делается в настройках PLL, либо просто пустить через делитель на 2.
- - - Добавлено - - -
Можно то можно, но МТ48 насколько слышал - не самых хороший вариант.
Если спидгрейд 6, то имеет смысл без переделки корки.
Если зетник не гнать выше 7МГц, то можно просто вдвое уменьшить такт корки SDRAM (до 42МГц), остальные частоты не трогать.
На этой плате на 42 работает нормально.
Делается в настройках PLL, либо просто пустить через делитель на 2.
Все получилось. Действительно, W9825G6EH-75 не работает на 84 МГц в проектах andykarpov WXEDA
omercury
21.12.2017, 23:42
Она не работает на 84МГц во всех проектах на корке Влада, потому, что корка рассчитана для CL-2, а память достаточно медленная - 7,5nS.
Говорю ж переписывать надо.
Govorkov
12.11.2021, 23:25
Переделанный проект speccy-wxeda (ANDYKARPOV) для платы EasyFPGA https://aliexpress.ru/item/32691369830.html?item_id=32691369830&sku_id=65268630249&spm=a2g2w.productlist.0.0.660b1acfPWFm3Q.
На плате всего 16Мб ОЗУ, поэтому заменил SDRAM контроллер на двенадцатибитный.
Звук оставил только BEEPER.
https://disk.yandex.ru/d/nU8mUzqE_9tQfQ
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot