дык, Господа....
я на своей картинке указал конкретное место на котором спотыкается, до него молотит без вопросов.
первые две мкросекунды я видел много много раз...
Вид для печати
дык, Господа....
я на своей картинке указал конкретное место на котором спотыкается, до него молотит без вопросов.
первые две мкросекунды я видел много много раз...
:v2_dizzy_facepalm:
И я на своей картинке указал конкретное место. Если поправить мое "конкретное место", то в твоем "конкретном месте" спотыкаться перестанет. Я глубоко в программу не вникал, но после коррекции она успешно поехала дальше. Там имеет место распространяющаяся неопределенность моделирования, в конце-концов она зажирает весь процесс. Точку ее зарождения я указал.
- - - Добавлено - - -
Строчку:
if (~f2 & (reset | (m1 & t3))) i <= pin_din;
Заменить на:
if (~f2 & (reset | (m1 & t3))) i <= reset ? 8'b00000000 : pin_din;
Это обнуление регистра инструкции при сбросе. Будет отличаться от оригинала. Позволит моделироваться, ухудшит синтезабельность, на поведение в реальной FPGA влияния не окажет.
а теперь, извиняюсь....
это заменить где? все мои сырцы а Вас есть, дайте пожалуста хоть +- 5 строк.
если с разверткой разберусь то попробую (в ФПГА)
Да, но не забывай, что эта шина в этот момент отрезана от входа и не накачивается:
http://savepic.ru/12433439.png
Я уже писал об этом здесь.
Угу, получается у оригинала в регистр пишется мусор. Я что-то такое про эти грабли помню, у меня тоже не моделировалось из-за этого, пришлось прицепить вход i на входные пины непосредственно, там еще из-за этого мультиплексор шины данных хорошо разгрузился, ЕМНИП и максимальная частота выросла.
Update:
Посмотрел код "отдохнувшим" взглядом и после опыта с ВМ1, упростить можно модельку ВМ80 очень серьезно. Я же старался сохранить максимальную совместимость с оригиналом для моделирования и синтезируемое ядро в одном проекте. А надо разделить на два, как с ВМ1 сделано. Тогда чисто синтезируемая ветка на wishbone с одним тактовым сигналом просто катастрофически упрощается, регистры элементарно в блок памяти засовываются, частота растет. А то 670LE и 240FF как-то толсто для 8-битника.
да, Господа, еще раз снимаю щляпу.
в железе молотит нормально. и разумеется в отличии от "аналогов" все осцилограммы действительно как в учебнике.
фотку не привожу т.к. ПЗУ не залил, т.е. процик вертит мусором по экрану.
упростить синтезируемую модель - это очень хорошо, щас всяких FPGA как грязи, может народ подтянется.
- - - Добавлено - - -
ладно, покажу "как есть", чтоб меня свитсуном не считали...
Скрытый текст
надо разобраться как бинарники подгружать, покаместь единственный выход только как в знакогенераторе, но это такой гемор....
- - - Добавлено - - -
а еслиб вы знали сколько ISE ворнингов насыпает :v2_dizzy_facepalm:
тут "и мои и ваши", все сырцы у вас есть, так что разберетесь где чьи:
Скрытый текст
WARNING:Xst:1710 - FF/Latch <t382> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <intr> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <t976> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <inta> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <hold> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <t887> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <t980> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2677 - Node <control_word_0> of sequential type is unconnected in block <control_word>.
WARNING:Xst:2677 - Node <control_word_1> of sequential type is unconnected in block <control_word>.
WARNING:Xst:2677 - Node <control_word_2> of sequential type is unconnected in block <control_word>.
WARNING:Xst:2677 - Node <control_word_3> of sequential type is unconnected in block <control_word>.
WARNING:Xst:2677 - Node <control_word_5> of sequential type is unconnected in block <control_word>.
WARNING:Xst:2677 - Node <control_word_6> of sequential type is unconnected in block <control_word>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <mstart> is unconnected in block <cpu>.
WARNING:Xst:1710 - FF/Latch <t383> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1710 - FF/Latch <minta> (without init value) has a constant value of 0 in block <cpu>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2677 - Node <inte> of sequential type is unconnected in block <cpu>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <t3144> is unconnected in block <cpu>.
WARNING:Xst:2677 - Node <control_word_0> of sequential type is unconnected in block <vk28>.
WARNING:Xst:2677 - Node <control_word_1> of sequential type is unconnected in block <vk28>.
INFO:Xst:3226 - The RAM <ram/Mram_ram> will be implemented as a BLOCK RAM, absorbing the following register(s):WARNING:Xst:2677 - Node <control_word_2> of sequential type is unconnected in block <vk28>.
WARNING:Xst:2677 - Node <control_word_3> of sequential type is unconnected in block <vk28>.
WARNING:Xst:2677 - Node <control_word_5> of sequential type is unconnected in block <vk28>.
WARNING:Xst:1710 - FF/Latch <cpu/t976> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <cpu/intr> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <cpu/t382> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <cpu/hold> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <cpu/inta> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <cpu/t980> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <cpu/t887> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <cpu/inte> is unconnected in block <kefircheg>.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <cpu/mstart> is unconnected in block <kefircheg>.
WARNING:Xst:1710 - FF/Latch <cpu/t383> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <cpu/minta> (without init value) has a constant value of 0 in block <kefircheg>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1898 - Due to constant pushing, FF/Latch <cpu/t3144> is unconnected in block <kefircheg>.
WARNING:Xst:2677 - Node <control_word/control_word_6> of sequential type is unconnected in block <kefircheg>.
WARNING:Xst:2040 - Unit kefircheg: 8 multi-source signals are replaced by logic (pull-up yes): data_bus<0>, data_bus<1>, data_bus<2>, data_bus<3>, data_bus<4>, data_bus<5>, data_bus<6>, data_bus<7>.
WARNING:Xst:1710 - FF/Latch <counter_3> (without init value) has a constant value of 0 in block <board>. This FF/Latch will be trimmed during the optimization process.
[свернуть]
Квартус тоже насыпает, но они все касаются I/O основной платы (напоминает что 3.3V совместимость, требует задания токов и прочего, все это не нужно для тестового проекта на DE0), к IP-ядру вроде претензий у него нет. Если ISE чего в самом vm80a.v не нравится - то выкладывайте, посмотрим в чем проблема.
Вот погодите, закончу я перевод в логическую схему, проведу свертывание схемы, вот тогда и посмотрим, насколько похудеет и т.д.
- - - Добавлено - - -
Не, я еще раз говорю: внутренняя шина имеет емкость. В начале цикла по F1 в нее закачивается лог.1 на каждую линию. Затем по необходимости эти лог.1 зануляются и получаются данные. По сбросу накачка запрещена, что дает стабильный лог.0. В купе с блокировкой внешних сигналов это дает принудительное выполнение NOP для автомата и некоторые модификации (предустановки) некоторых регистров (например регистр адреса). Отсюда и требование - не менее 3х тактов вроде, чтобы попасть на чтение опкода. Поведение емкостной шины у нас не симулируется. Поэтому, можно применить принудительное зануление внутренней шины без ущерба качеству симуляции.
А это почему? Разве при сбросе активируются какие-то агенты шины производящие обнуление? Если нет, а сброс долгий (сотни миллисекунд для микросхемы - долго), то состояние шины будет определяться утечками. А эта штука зависит от технологии, производителя и партии, простым смертным предсказать никак нельзя, имхо.
Vslav, вот именно утекают в схемы приемники. Т.е. весь заряд какой бы он ни был теряется.
А это откуда следует? Заряд может прекрасно и натекать, зависит от паразитных параметров конкретной схемы.
Представь что под затвор одного из транзисторов накачки попало чуток грязи. Немного, транзистор закрывается, но не так чтобы очень хорошо, килоом 10 в закрытом состоянии дает. И все работает нормально, 10К закрытого состояния для работы достаточно. А вот затворы приемников чудесно отпечатались, там десятки мегаом входного сопротивления. И получаем в состоянии сброса, когда все выключено, банальный делитель из паразитных резисторов.
- - - Добавлено - - -
В подтверждение своего тезиса о натекании заряда приведу хороший пример - 565РУ5. Грубо говоря - это массив маленьких изолированных конденсаторов. Если ее оставить без регенерации, то спустя какое-то время все ячейки придут к определенным состояниям. К РАЗНЫМ - будут и нули и единицы. Потому что в какой-то ячейке утечка на землю, а в какую-то натекает с питания.
Может быть. У меня сейчас изготовлена плата универсального тестера РУ-шек, я проверю при случае.
А разве процессор не исполняет циклически RST 7 (подтянутая к единице шина)? И не заполняет видеопамять адресами возврата? Я не большой знаток спектрума, могу и ошибаться.
Какой именно Спектрум имеется в виду? Если наши, с шахматкой и прозрачной регенерацией, то это не тот случай. Если оригинал, то я не в курсе, ULA там регенерирует или сам Z80.
Имеется в виду шахматка. Область графического экрана регенерируется прозрачно почти везде :) Формально это состояние после выключения питания, а не регенерации; но, насколько я помню по Радио-86РК, они совпадают.
Надо у технологов спрашивать, как и зачем это сделано. На вопрос "как?" может ответить и реверс РУшек.
да, к стати, синтезатор ISE почти в конце выдал такую строчку: Maximum Frequency: 70.285MHz
т.е. как я понимаю, данную модель разогнать до 50 МГц - легко ;)
А ежели с комбинаторикой разобраться (что возможно будет после завершения преобразования транзисторной схемы в логическую и ее анализа) то и все 200 на каком-нибудь старшем Cyclone IV/V или Arria2 GX.
70 МГц это скорость "всего проекта", в т.ч. с моими кусками - памятью и видеовыводом.
на данный момент процик стучит на 25 МГц т.е. тактовая 100 поделена на 4... экзорциста еще не гонял.
хочу разогнать до 50...100 МГц.
вопрос: насколько критична фазировка f1 и f2 ? можно делать "по простому" или нужно делить на 9 как в оригинальной 8224 (гф24)?
Можно сделать произвольную тактовую последовательность по таким правилам:
- любое количество тактов активной F1 (F2 неактивна), но не менее одного такта
- любое количество тактов неактивных F1 и F2, допускается нулевое
- любое количество тактов активной F2 (F1 неактивна), но не менее одного такта
- любое количество тактов неактивных F1 и F2, допускается нулевое
То есть - можно просто чередовать фазы F1/F2, без пустых пропусков.
Оригинальному процессору пропуск после Ф2 тоже не нужен? Не поможет ли более длинный Ф2 по сравнению с Ф1 получить большую частоту на FPGA?
На оригинале меандр на F2 обусловлен чисто удобством сопряжения с внешними устройствами, потому как именно по F2 обычно и организована синхронизация обмена. Но ключевая фаза у него F1, и в ДЩ тоже от нее пляска идет. В ПЛИС же скорости достаточно, чтобы не выдерживать соотношения между F1 и F2, поэтому можно просто чередовать.
охренеть :v2_confu:
Скрытый текст
25 МГц, экзорцист в ПЗУ 0000-1fff, видео e800-efff двухпортовая без арбитража, RAM - f000-f7ff, ПЗУ - f800-ffff "монитор-ф" ЮТ-88.
клок - 1(f1),2(f2),1(-)
Не все экзорцисты одинаково полезны. Правильный есть в этом треде (пару десятков страниц назад), но даже он требует допиливания под вашу систему. А судя по одинаковым значениям у вас скорее всего ОЗУ стека повело конкретно (т.е. нужно допиливание под вашу карту памяти).
так я Ваш (от специалиста) и перепиливал.
ячейки с f000 до f0ff (потолок стека)
за-то быстро :v2_clap2:
Там еще ОЗУ кроме стека используется. Т.е., в Спеце я их перенес в экран (последний столбец) для визуализации процесса.
я читал.
у Вас заняты 256 байт с bf00 по bfff, у меня эти ячейки находятся с f000 по f0ff (я уже писАл).
впрочем наверное уберу кадровое гашение и перенесу их в видео ОЗУ для наглядности.
- - - Добавлено - - -
а зачем некоторые строки преобразованы в байты?
Скрытый текст
Код:...
0049 0000 C3 13 00 begin: jmp start
0050 0003
0051 0003 ; machine state before test (needs to be at predictably constant address)
0052 0003 000000000000 msbt: .db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
0053 0011 00 00 spbt: .db 00h,00h
0054 0013 ;msbt .equ 0F000h
0055 0013 ;spbt .equ 0F010h
.....
0215 012E ; aluop a,<b,c,d,e,h,l,(hl),a> (753,664 cycles)
0216 012E ;alu8r: db 0ffh ; flag mask
0217 012E ; tstr 080h,0c53eh,0573ah,04c4dh,msbt,0e309h,0a666h,0d0h,03bh,0adbbh
0218 012E ; tstr 03fh,0,0,0,0,0,0,0,-1,0 ; (16,384 cycles)
0219 012E ; tstr 0,0ffh,0,0,0,-1,-1,0d7h,0,0 ; (46 cycles)
0220 012E ; db 0cfh, 076h, 02ch, 086h ; expected crc
0221 012E ; tmsg 'aluop <b,c,d,e,h,l,m,a>'
0222 012E FF800000003E alu8r: .db 0FFH,080H,000H,000H,000H,03EH,0C5H,03AH,057H,04DH,04CH,003H,001H,009H,0E3H,066H
0223 013E A6D03BBBAD3F .db 0A6H,0D0H,03BH,0BBH,0ADH,03FH,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H
0224 014E 000000000000 .db 000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,0FFH,000H,000H
0225 015E 0000000000FF .db 000H,000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH,0D7H,000H,000H,000H,0CFH,076H,02CH
0226 016E 86 .db 086H
0227 016F 616C756F7020 .text "aluop <b,c,d,e,h,l,m,a>."
0228 0187 000000000000 .db 0,0,0,0,0,0,0
....
[свернуть]
К сожалению пока вялотекуще. Но я пытаюсь выделять больше квантов времени.
Картинка для привлечения внимания :)
http://s019.radikal.ru/i633/1711/51/57bba88b155ct.jpg
Закинул ядро vm80a на GitHub
На opencores.org более закрытое сообщество, для скачивания требуется регистрация,
проект вышел бы более закрытым, поэтому выбрал github, хотя git мне неудобнее
чем svn
Из нового
- упорядочил директории под требования открытого проекта
- прикрутил UART и адаптировал на него Exerciser
- начал адаптацию на плату DE1 (в планах еще пара плат)