Торжественно заявляю: Ура! Вчера я получил первые существенные результаты: мой процессор на ПЛИС успешно выполнил программу самотестирования. Процессор полностью бинарно совместим с виртуальным процессором, который я симулировал в Logisim, вплоть до того, что использовал абсолютно тот же микрокод.
Основые параметры системы:
Ширина машинного слова: 16 бит.
Ширина адреса: 16 бит, максимально адресуемая память — 128К (65536 двухбайтовых слов). Отдельные байты не адресуются.
Ввод-вывод с отображением на адресное пространство.
ОЗУ на чипе ПЛИС — 16К (8192 двухбайтовых слова).
Ввод: PS/2 клавиатура.
Вывод: текстовый VGA-терминал, матрица 80х30 символов. Знакогенератор использует прошивку от CGA-адаптера с шрифтом 8х8 точек (эх, ностальгия!).
Потребленные ресурсы ПЛИС: 2147 логических модуля (примерно 15% от ресурсов чипа).
К чему я это всё?
Ну, во-первых, просто похвастаться и поделиться радостью!
Во-вторых, найти таких же гиканутых товарищей, кому было бы интересно на эти темы пообщаться
Готов поделиться техническими подробностями или зачерпнуть мудрости у более опытных товарищей.
P.S. Немного подробнее написал у себя в бложике: тут. Там и картинки есть
Здравствуйте, 0x7be, Вы писали:
0>Торжественно заявляю: Ура! Вчера я получил первые существенные результаты: мой процессор на ПЛИС успешно выполнил программу самотестирования. Процессор полностью бинарно совместим с виртуальным процессором, который я симулировал в Logisim, вплоть до того, что использовал абсолютно тот же микрокод.
Поздравляю)
0>К чему я это всё? 0>Ну, во-первых, просто похвастаться и поделиться радостью! 0>Во-вторых, найти таких же гиканутых товарищей, кому было бы интересно на эти темы пообщаться 0>Готов поделиться техническими подробностями или зачерпнуть мудрости у более опытных товарищей.
Нуу подозреваю, что тут скорее вопросы будут, чем советы. Всё же тема довольно специфическая) Хотя кто его знает... )))
От меня пока основные вопросы такие:
— какие языки применялись для проектирования? ) VHDL, Verilog или может вообще C++ (SystemC)? И почему именно они?
— какие инструменты применялись для разработки (редакторы, симуляторы и т.п.)? И почему именно они? )
— это всё только для самообучения и фана или есть идеи это использовать в дальнейшем для чего практического? )
Здравствуйте, alex_public, Вы писали:
_>Поздравляю)
Спасибо
_>От меня пока основные вопросы такие: _>- какие языки применялись для проектирования? ) VHDL, Verilog или может вообще C++ (SystemC)? И почему именно они?
VHDL. Где-то нашёл статейку, где автор шибко хвалил его и ругал Verilog.
По опыту написания столкнулся с его тяжеловесным синтаксисом. Есть мысль пощупать Verilog, тем более, что инструментарий позволяет смешивать в одном проекте модули на разных языках.
_>- какие инструменты применялись для разработки (редакторы, симуляторы и т.п.)? И почему именно они? )
Altera Quartus II v13.1. Использовался просто потому, что чип от этого же вендора, соответственно, инструментарий адаптирован. Я даже сомневаюсь, что чужой инструментарий подошёл бы к нему.
Само устройство взял по совокупности трех параметров: функциональных возможностей, цены и доступности в РФ.
Симулятор, если честно, так и не освоил, какой-то он замороченный. Для отладки применял кнопки/переключатели/светодиоды на самой плате, а так же зонды (встраиваемые в схему компоненты + спец. программа, которая умеет вычитывать значения с их входов). Пробовал так же использовать SignalTap (позволяет записывать сигналы в разных точках схемы), но он почему-то безбожно врал. В итоге, комбинируя простейшие средства отладки и модульный подход "снизу вверх", постепенно собрал и отладил схему.
_>- это всё только для самообучения и фана или есть идеи это использовать в дальнейшем для чего практического? )
Пока это чистый фан, продиктованный профессиональными комплексами (двадцать лет был программистом, а как оно работает на уровне схем не знал). Каких-то конкретных перспектив практического применения пока не вижу, но может что-то нарисуется в будущем. Зато теперь могу сыну толково объяснить, как компьютер работает
Присоединяюсь к поздравлениям!
0>VHDL. Где-то нашёл статейку, где автор шибко хвалил его и ругал Verilog. 0>По опыту написания столкнулся с его тяжеловесным синтаксисом. Есть мысль пощупать Verilog, тем более, что инструментарий позволяет смешивать в одном проекте модули на разных языках.
Я в универе изучал оба языка, и субъективно мне Verilog больше нравится, но в данном случае самый лучший язык — это тот, который знаешь
0>Пока это чистый фан, продиктованный профессиональными комплексами (двадцать лет был программистом, а как оно работает на уровне схем не знал). Каких-то конкретных перспектив практического применения пока не вижу, но может что-то нарисуется в будущем. Зато теперь могу сыну толково объяснить, как компьютер работает
Побольше бы программистов имело такие же "комплексы"!
У меня вот есть идея сварганить LCD Display Driver — то есть чип, который будет "рисовать" картинку в своей памяти по командам от внешнего MCU, и рулить собственно матрицей (в смысле выдавать сигналы развёртки, и "зажигать" нужные точки). Но пока руки до этого не доходят — даже ещё с чипом не определился. Но по смыслу это будет в целом аналог твоего проца — просто он будет более специализированным.
Здравствуйте, koandrew, Вы писали:
0>>По опыту написания столкнулся с его тяжеловесным синтаксисом. Есть мысль пощупать Verilog, тем более, что инструментарий позволяет смешивать в одном проекте модули на разных языках. K>Я в универе изучал оба языка, и субъективно мне Verilog больше нравится, но в данном случае самый лучший язык — это тот, который знаешь
А чем он лучше с твоей субъективной точки зрения?
Есть ли в VHDL какие-то возможности, которых нет в Verilog?
K>У меня вот есть идея сварганить LCD Display Driver — то есть чип, который будет "рисовать" картинку в своей памяти по командам от внешнего MCU, и рулить собственно матрицей (в смысле выдавать сигналы развёртки, и "зажигать" нужные точки). Но пока руки до этого не доходят — даже ещё с чипом не определился. Но по смыслу это будет в целом аналог твоего проца — просто он будет более специализированным.
Т.е. он будет исполнять что-то вроде Windows Metafile, рисуя в видеобуфере растровую графику?
UPDATE: Кстати, видел, что народ при создании спец. устройств на ПЛИСах при наличии ресурсов проступает просто — засовывает в ПЛИС софтовый процессор (например, знаменитый Z80) и окружает его предметно-специфичной системой.
Здравствуйте, alpha21264, Вы писали:
0>>P.S. Немного подробнее написал у себя в бложике: тут. Там и картинки есть A>А ты не хочешь его заопенсоурсить? Может в тебе дремлет второй (третий?) Линус Торвальдс?
Я подумываю о том, чтобы выложить его куда-нибудь, когда он достигнет некоторой зрелости. Я много примеров на opencores.org смотрел, туда можно поместить.
Хотя, они никак не хотят меня регистрирвоать Практической и научной ценности в моём проекте нет, но как некий простой пример системы, которая может быть интересна таким же начинающим людям, это сгодится.
Как-то так.
Здравствуйте, 0x7be, Вы писали:
0>А чем он лучше с твоей субъективной точки зрения? 0>Есть ли в VHDL какие-то возможности, которых нет в Verilog?
Я вот видел такую картинку:
Причём насколько я понимаю, все твои цели укладываются в пункт RTL-описание (раз ты не пользуешься всякими симуляторами и т.п.), так что тебе подходит любой из 4-ёх инструментов — можно выбирать по вкусу. )
0>UPDATE: Кстати, видел, что народ при создании спец. устройств на ПЛИСах при наличии ресурсов проступает просто — засовывает в ПЛИС софтовый процессор (например, знаменитый Z80) и окружает его предметно-специфичной системой.
Здравствуйте, alex_public, Вы писали:
_>Я вот видел такую картинку: ... _>Причём насколько я понимаю, все твои цели укладываются в пункт RTL-описание (раз ты не пользуешься всякими симуляторами и т.п.), так что тебе подходит любой из 4-ёх инструментов — можно выбирать по вкусу. )
Интересная картинка. Надо будет для пробы небольшой кусочек на verilog попытаться исполнить.
_>Ага. Кстати, ты такое http://vlsicad.eecs.umich.edu/BK/Slots/cache/www.gaisler.com/products/leon2/leon.html наверняка видел при разработке своего? ) Это вроде как один из самых продвинутый доступных нахаляву. )))
Не, как-то мимо него прошёл. Я больше искал софтовые реализации старых процессоров. В частности, нашёл Intel 8080 и изучил код.
Здравствуйте, 0x7be, Вы писали:
0>А чем он лучше с твоей субъективной точки зрения?
Меньше букав 0>Есть ли в VHDL какие-то возможности, которых нет в Verilog?
Насколько я помню, нет.
0>Т.е. он будет исполнять что-то вроде Windows Metafile, рисуя в видеобуфере растровую графику?
Типа того, только система команд будет ориентированна на композицию — то есть операции со спрайтами, альфа-блендинг, и т.п. Плюс ещё будет блок формирования управляющих сигналов для матрицы LCD.
0>UPDATE: Кстати, видел, что народ при создании спец. устройств на ПЛИСах при наличии ресурсов проступает просто — засовывает в ПЛИС софтовый процессор (например, знаменитый Z80) и окружает его предметно-специфичной системой.
В моём случае при использовании МК от него потребуется очень неслабая производительность, т.к. только для выдачи сигналов на матрицу нужно до сотни мегагерц частоты (частота развёртки зависит от разрешения панели)- и это не считая собственно графического сопроцессора. Это как раз тот случай, где использование FPGA позволит добиться лучшего результатаф.
Здравствуйте, koandrew, Вы писали:
0>>UPDATE: Кстати, видел, что народ при создании спец. устройств на ПЛИСах при наличии ресурсов проступает просто — засовывает в ПЛИС софтовый процессор (например, знаменитый Z80) и окружает его предметно-специфичной системой. K>В моём случае при использовании МК от него потребуется очень неслабая производительность, т.к. только для выдачи сигналов на матрицу нужно до сотни мегагерц частоты (частота развёртки зависит от разрешения панели)- и это не считая собственно графического сопроцессора. Это как раз тот случай, где использование FPGA позволит добиться лучшего результатаф.
А у тебя что, не будет видеопамяти? Будешь на каждом цикле обновления экрана пересчитывать картинку из вектора в растры?
Здравствуйте, 0x7be, Вы писали:
0>А у тебя что, не будет видеопамяти? Будешь на каждом цикле обновления экрана пересчитывать картинку из вектора в растры?
Пока ещё не знаю — проект ещё в стадии идеи Впрочем я знаю пример такого решения — чипы серий FT80x/FT81x от FTDI. В общем посмотрим — в крайнем случае можно реализовать память в самом FPGA, ну или распаять готовый модуль SRAM — они копейки стоят.
Здравствуйте, 0x7be, Вы писали:
0>P.S. Немного подробнее написал у себя в бложике: тут. Там и картинки есть
Почитал статью. По поводу SD-карты настоятельно рекомендую использовать протокол SPI (он проще, чем SDIO, и его по спецификации обязаны поддерживать все SD/MMC карты). Соответственно, тебе придётся реализовать SPI Master контроллер в железе — но я не думаю, что это очень сложно, и наверняка есть готовые. Сам протокол проще реализовать в софте. Описание его гуглится по словам sd card spi
Здравствуйте, koandrew, Вы писали:
K>Почитал статью. По поводу SD-карты настоятельно рекомендую использовать протокол SPI (он проще, чем SDIO, и его по спецификации обязаны поддерживать все SD/MMC карты). Соответственно, тебе придётся реализовать SPI Master контроллер в железе — но я не думаю, что это очень сложно, и наверняка есть готовые. Сам протокол проще реализовать в софте. Описание его гуглится по словам sd card spi
В ту часть мануала ещё не залезал ещё в более простых вещах есть что сделать. Как минимум нормальный скроллинг к терминалу прикрутить. Но когда дойдут руки, совет обязательно вспомню
Здравствуйте, 0x7be, Вы писали:
0>В ту часть мануала ещё не залезал ещё в более простых вещах есть что сделать.
Если контроллер найдёшь готовый, то остальное там — дело техники. Работа с SD/MicroSD очень популярна среди любителей, потому в инете полно кода под любые платформы, а уж с портированием я думаю у тебя проблем не будет
0>Как минимум нормальный скроллинг к терминалу прикрутить.
В смысле чтобы текст вверх уходил, когда кончаются строки? Если у тебя есть видеобуфер, то rep mov — наше всё Ставишь указатель источника на начало второй строки, указатель получателя — на начало первой, и копируешь ширина * (высота — 1) * байт_в_символе байт, каждый раз инкрементируя оба указателя. На x86 это три строчки на ассемблере Если твой проц не умеет делать операции типа "память-память", то тогда через аккумулятор.
Здравствуйте, 0x7be, Вы писали:
0> Но когда дойдут руки, совет обязательно вспомню
А, и ещё один heads up — карточка при чтении/записи может кушать до 300 мА тока, так что если ты питаешь плату от USB, то учти, что USB может дать максимум 500 мА (а так как карте нужно 3.3 В, то преобразователь напряжения выдаст и того меньше). Игнорирование этого факта ведёт к неадекватному поведению чипа — мне это стоило почти трёх дней чесания репы, ударов лбом от стену и стол, и многоэтажного мата в попытках понять, почему МК вдруг начал жить своей жизнью , пока я не вспомнил про эту "тонкость" (видел это в одном из видео по Ардуино), и соорудил более мощный внешний источник питания. После этого всё сразу взлетело, а я от радости заорал матом так, что ко мне соседи прибежали выяснить, не убивают ли тут кого
0>>В ту часть мануала ещё не залезал ещё в более простых вещах есть что сделать. K>Если контроллер найдёшь готовый, то остальное там — дело техники. Работа с SD/MicroSD очень популярна среди любителей, потому в инете полно кода под любые платформы, а уж с портированием я думаю у тебя проблем не будет
В смысле, код контроллера или железо? Сам-то считыватель уже интегрирован в плату, так что мне надо только код написать, чтобы его подцепить.
K>В смысле чтобы текст вверх уходил, когда кончаются строки? Если у тебя есть видеобуфер, то rep mov — наше всё Ставишь указатель источника на начало второй строки, указатель получателя — на начало первой, и копируешь ширина * (высота — 1) * байт_в_символе байт, каждый раз инкрементируя оба указателя. На x86 это три строчки на ассемблере Если твой проц не умеет делать операции типа "память-память", то тогда через аккумулятор.
У меня пока терминал — это настоящий терминал, то есть у процессора нет произволльного доступа к видеобуферу. Через системную шину можно побайтно посылать символы в ASCII-коде, а реализация контроллера сама их выводит и всё делает. Вообщем, скроллинг пока делаю аппаратно. Вообщем, ничего особенного, если бы не глюки. Для видеобуфера я использую двухпортовый вариант altsyncram (обёртка для интегрированных блоков ОЗУ на чипе). Соответственно, в режиме скроллинга пробегаюсь по буферу и переношу каждый символ на 80 позиций назад, а потом зачищаю последнюю строку.
В теории всё просто. Но вчера реализовал эту схему, она глючит. Во-первых, работает, почему-то не со значением сдвига "80", а "82". Если 80, то текст едет по диагонали. Во-вторых, при скроллинге текст в некоторых строках размазывается по горизонтали Успел вчера нагуглить на каком-то форуме утверждение, что эта реализация ОЗУ даёт задержку в такт при чтении, видимо я это не учитываю. Сегодня попробую замедлить процесс в два раза, если руки дойдут
Здравствуйте, koandrew, Вы писали:
0>> Но когда дойдут руки, совет обязательно вспомню K>А, и ещё один heads up — карточка при чтении/записи может кушать до 300 мА тока, так что если ты питаешь плату от USB, то учти, что USB может дать максимум 500 мА (а так как карте нужно 3.3 В, то преобразователь напряжения выдаст и того меньше). Игнорирование этого факта ведёт к неадекватному поведению чипа — мне это стоило почти трёх дней чесания репы, ударов лбом от стену и стол, и многоэтажного мата в попытках понять, почему МК вдруг начал жить своей жизнью , пока я не вспомнил про эту "тонкость" (видел это в одном из видео по Ардуино), и соорудил более мощный внешний источник питания. После этого всё сразу взлетело, а я от радости заорал матом так, что ко мне соседи прибежали выяснить, не убивают ли тут кого
То есть надо для надёжности БП подключать К моей платке поставляется БП, но мне пока хватало питания от УСБ.
Спасибо, буду иметь в виду.
Здравствуйте, 0x7be, Вы писали:
0>Торжественно заявляю: Ура! Вчера я получил первые существенные результаты: мой процессор на ПЛИС успешно выполнил программу самотестирования.
А какая в нем система команд? Команды и данные в одной памяти или в разных?
0>Ширина адреса: 16 бит, максимально адресуемая память — 128К (65536 двухбайтовых слов). Отдельные байты не адресуются.
Смелое решение. Я тоже как-то думал, что сейчас байты не нужны, в USB используется UTF-16 поэтому работать нужно в ней. А во многих сигнальных процессорах байтов нет уже давно.
Я отвечаю за свои слова, а не за то как вы их интерпретируете!
Q>А какая в нем система команд?
RISC-подобная система команд, в общей сложности 60 команд.
Юзеру доступно восемь регистров общего назначения (R0-R7), плюс несколько специальных: SP (stack pointer), OP (object pointer), BP (base pointer).
Вся арифметика/логика только над регистрами. Загрузка/выгрузка регистров осуществляется в следующих режимах: UPDATE: Арифметика/логика так же есть в режме "регистр и константа".
0. Инициализация регистра константой.
1. По константному адресу.
2. Косвенная адресация через регистр (любой из доступных).
4. Косвенная адресация со смещением от указателя OP или BP (смещение — либо константа, либо из регистра).
(Без)условные переходы либо константному адресу, либо через регистр.
Поддерживается работа со стеком: CALL/RET, PUSH/POP. В стек кладётся не только адрес возврата, но и адрес указателя на начало стекового фрейма. Благодаря этому можно не заботиться о выталкивании из стека лишнего при вызове RET — стек автоматически восстановится в нужное состояние.
Прерывания, обработка ошибок и т.п. пока не реализованы, работа на будущее.
Как-то так, вроде основные моменты осветил.
UPDATE: Код "Hello world":
Label Command Arg1 Arg2
TTY const 0FC00h
nop
init R0 msg
loop ldi R1 R0
cmpc R1 0
je exit
str R1 TTY
inc R0
jmp loop
exit jmp exit
msg string Hello, World!
dw 10
stringz Have a nice day.
END PROGRAM
Q>Команды и данные в одной памяти или в разных?
В одной.
0>>Ширина адреса: 16 бит, максимально адресуемая память — 128К (65536 двухбайтовых слов). Отдельные байты не адресуются. Q>Смелое решение. Я тоже как-то думал, что сейчас байты не нужны, в USB используется UTF-16 поэтому работать нужно в ней. А во многих сигнальных процессорах байтов нет уже давно.
Это решение исключительно для упрощения схемы процессора. Поскольку я ориентируюсь на систему уровня Intel 80080/Zilog Z80, в ней байтовая адресация всё ещё актуальна.
У меня в планах стоит разработать третью версию процессора, в которой я реализую ещё ряд фич, в т.ч. и байтовую адресацию.