Re: Копаю PAL/FPGA. В целом, не только для Агата
В шите даташном на MAX7000 рисунки 11 и 15, на 3000 аналогично.
Персональный компьютер "Агат" - технические беседы (является частью agatcomp.su / agatcomp.ru) Как зарегистрироваться?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
ПЭВМ "Агат" 7-9: Форум → Прочее техническое → Копаю PAL/FPGA. В целом, не только для Агата
Чтобы отправить ответ, вы должны войти или зарегистрироваться
В шите даташном на MAX7000 рисунки 11 и 15, на 3000 аналогично.
Хочу выбрать доступные-дешевые матрицы под пару проектов - один помельче, другой - посложнее.
Составил сравнение по ключевым признакам: количество логических элементов и минимальная стоимость в России (без учёта мутного, в данном случае, алиэкспресса):
Семейство микра объём цена питание ядра питание IO
max7000 epm7032 32le 170р 2.5 3.3 5.0 2.5 3.3 5.0
max3000 epm3064 64le 200р 2.5 3.3 2.5 3.3 допускает входное 5.0
maxII epm240 240le 220р 1.8 2.5 3.3 2.5 3.3 иногда допускает входное 5.0
maxV 5m240 240le >500р 1.8 2.5 3.3 иногда допускает входное 5.0
max10 10m02 2000le 376р 1.2 2.5 3.3 3.9 и ниже
cycloneII ep2c5 5000le 1000р 1.2 3.3 и ниже
cycloneIV ep4ce6 6000le 500р 1.0 1.2 3.3 и ниже
Похоже, для мелких задач явно выигрывает maxII.
А вот для средних почему-то четвёртый циклон (хотя другие поколения циклонов не смотрел - просто случайно этот попался).
Прикольно, работает :)) Всю жизнь мечтал о такой микрухе. Только не всегда знал, что они существуют.
Ощущения от verilog: в общем-то от обычного программирования отличается не очень сильно.
Напоминает разработку многопоточной проги. Т.е. всегда держишь в уме, что все переменные могут быть изменены из другого треда и "локальной" является только переменная, которую меняешь в блоке always. Немного непривычно, что reg должны меняться в пределах одного always, т.е. если обычно думаешь о ШАГАХ программы и к ним привязываешь переменные, то здесь думаешь о ПЕРЕМЕННЫХ и вокруг них создаешь шаги.
В книжках часто пытаются сравнивать wire и reg c переменной, но мне проще видеть в wire чистый алиас. В обычных языках программирования алиасов нет, есть указатели. Но, например, в pascale было такое интересное ключевое слово - absolute, означает размещение двух переменных на одну область. Что-то сходное есть в C под названием union. В паскале то же самое называется "запись с вариантами".
wire больше всего похож на absolute - это используется, когда, например, нужно получить 16 бит, а дальше обрабатывать их как два по 8 бит:
wd: word;
bt: array[0..1] of byte absolute wd;
Тут wd и bt - одни и те же 16 бит, связанные точно так же как wire. Просто с разными именами.
Но wire, к тому же - это динамический алиас:
assign wire = sw ? wire1 : wire2;
Вроде как алиас, но который может переключаться между разными "коллегами".
Ещё подобная сущность есть в UNIX-вых файловых системах, называется hard link:
один файл имеющий несколько разных имён.
Ну а reg - конечно, это переменная. Хотя иногда становится очень похожей на wire.
В одной статье хорошо было сказано, что проще рассматривать wire и reg не как разные
типы данных, а как вид областей модификации переменных (точную фразу не помню, но смысл примерно такой).
Остальное, в общем-то, похоже на обычные языки, кроме того, что .... всё время остаётся ощущение, что пишешь на ассемблере. Слишком много "связей", действующих одновременно.
Когда на языке высокого уровня пишешь c=a+1 ты знаешь, что это - оператор модификации c.
Когда на ассемлере пишешь adc #4 то всегда помнишь, что и эта команда зависит от трёх аргументов и на выходе модифицируется несколько регистров - флаги, регистр результата. От этих флагов могут зависеть последующие команды.
Вот и на Verilog то же самое - любое движение разбегается как круги по воде.
Это кто там, Макс2?
Кстати, жирные CPLD сейчас внутри содержат FPGA со встроенной конфигурационной памятью. Насколько я знаю, это Макс5 и выше.
тут epm3064
maxII (epm240, например) вроде тоже fpga со встроенной пзу.
Во всяком случае макроячейки у epm240 мельче чем у epm3064.
Насколько я понял, cpld - это много галок с кучей входов и одним выходом. А fpga - это очень много очень упрощенных галок (фактически, там не матрица логики в каждой, а ПЗУ с триггером).
Но прелесть в том, что конфигурации грузятся в любую из них, я уже пробовал некоторые конфиги таскать между maxII и max3000 - норм работают, без переделок.
Но прелесть в том, что конфигурации грузятся в любую из них, я уже пробовал некоторые конфиги таскать между maxII и max3000 - норм работают, без переделок.
Без перекомпиляции?
> Без перекомпиляции?
С компиляцией, конечно. И с перестановкой пинов, если быть предельно точным.
Кстати, с компиляцией не могу понять: чем выше версия квартуса тем он тормознее на компиляции.
И, что меня особо удивляет - скорость компиляции почти не зависит от размера исходника.
Хоть он пустой из пары assign, что штук 5 always, куча assign - всё равно полминуты на полную сборку (P-IV , 3 GHz, гипертрейд ).
На i3 быстрее, конечно, но не так чтобы моментально - где-то 10 секунд против 30.
Хочу выбрать доступные-дешевые матрицы под пару проектов - один помельче, другой - посложнее.
НАСТОЯТЕЛЬНО рекомендую MAX7000S, и то она в единице выдает всего 4 Вольта, а все остальные еще меньше...
Но еще раз повторюсь: в CPLD ОЧЕНЬ мало количество внутренних связей (в 7000/3000 всего то 36).
По верилогу. Попробуй взглянуть на это по-другому: когда ты рисуешь схему устройства - ты ведь не описываешь программу последовательного выполнения, ты графически описываешь составляющие проекта, работающие непрерывно, параллельно и автономно от других составляющих. Вот верилог (как и любой другой HDL) делает это также, только в текстовом виде. Поменяй мЫшление. ;)
По wire и reg. Тут тоже все просто: wire - это всего лишь проводник, сигнал, функция комбинаторики. Нет квантованости (непрерывен), нет хранения. reg - функция триггера, квантован по клоку, есть хранение, синхронизм. Еще раз посоветую - постарайся освоить именно синхронизм дизайна.
По кактусу. 9.1sp2 - лёгкий, шустрый, с симулятором. А еще SSD в качестве системного очень ускоряет систему, а если еще и кактус стоит на SSD, то тем более.
> НАСТОЯТЕЛЬНО рекомендую MAX7000S, и то она в единице выдает всего 4 Вольта, а все остальные еще меньше...
Я в них пользы не вижу. Стоят они дороже, LE мало. Единственное преимущество - 5 вольт питание.
Та же maxII (epm240) за те же деньги имеет больше LE. В чём преимущество 7000ки ?
Буфер с преобразованием уровней воткнуть не сложно. Причем его втыкать надо будет только между 5в частью: возможно, вокруг матрицы будут и другие 3.3 в-элементы, какой нибудь pl2303, например.
> reg - функция триггера, квантован по клоку,
wire b;
wire c;
reg a;
always @*
case (a)
1: a <= b;
0: a <= 0;
endcase
и a перестаёт быть регистром. Хотя и очень похожа.
> Попробуй взглянуть на это по-другому: когда ты рисуешь схему устройства - ты ведь не описываешь программу последовательного выполнения
Неа. Если я рисую схему устройства, которое хоть как-то тактируется, я - опять таки - думаю и о шагах тоже.
Даже ставя какую-нибудь тм2 я же всё равно уточняю - синхронные у неё входы или нет и какий у них уровень активный - т.е. я уже думаю о тактах-шагах. Без времени, наверное, можно было проектировать аналоговые схемы, которые описывались в каком-то пространстве, вроде частота/фаза или активная/реактивная составляющая сигнала.
> reg - функция триггера, квантован по клоку,
wire b; wire c; reg a; always @* case (a) 1: a <= b; 0: a <= 0; endcase
и a перестаёт быть регистром. Хотя и очень похожа.
Лично для меня это бессмысленный код... Напуркуа здесь "c"? Начальное состояние неизвестно... При отрицательном фронте "b" (но это не клоковый список чувствительности!!!): "a" защелкивается в 0 и навсегда остается 0...
Фу-у-у-уф... Давай без обид, еще раз, и натурально по шагам:
Шаг 1. Покажи схему того, что ты задумал.
Я не задумывал устройство, я демонстрирую тот факт, что reg - это не всегда регистр.
Это может быть, например, выход коммутатора.
Хочешь конкретный пример ?
Вот реальный кусок конфига, который используется в экспериментах.
Здесь data_bus - inout - выводится на пины микрухи.
А read_dev, read_rom, read_extra_rom - разрешения на выдачу данных (int_reg* - внутренние регистры) на шину.
Если разрешений нет, шина остаётся в z-состоянии.
data_bus_r , хотя и объявлен как reg, фактически не является регистром, он синтезируется в выходные линии коммутатора.
reg [7:4] data_bus_r;
assign data_bus = data_bus_r;
always @*
case ({read_dev, read_rom, read_extra_rom, addr_bus[1], addr_bus[0]})
5'b10000: data_bus_r <= 4'h9;
5'b10001: data_bus_r <= int_reg1;
5'b01000: data_bus_r <= 4'h6;
5'b01001: data_bus_r <= int_reg2;
5'b00100: data_bus_r <= 4'h0;
5'b00101: data_bus_r <= int_reg3;
5'b00110: data_bus_r <= int_reg1 & int_reg3;
5'b00111: data_bus_r <= int_reg2 * int_reg3;
default: data_bus_r <= 4'bz;
endcase
А-а-а-а-а!!!!!!!!!!!!!
Ты лепишь регистр, но по клоку в него не пишешь!!!!!!!!!!!!!! А пишешь по уровню... И еще удивляешься, что регистр вырождается в мультиплексор.
Я тебе кучу ссылок предоставил, где на это обращают внимание. И это беда не компилятора, а дизайнера!
А-а-а-а-а!!!!!!!!!!!!! Услышь меня!!!!
Я не пойму, что ты хочешь добиться ? И почему столько эмоций (судя по количеству знаков пунктуации) ?
Ты начал с этого:
> reg - функция триггера, квантован по клоку, есть хранение, синхронизм
Я говорю, что reg не всегда будет именно регистром.
И показал пример.
Ты согласен и знаешь, что именно и почему получается.
Т.е. ты согласен что reg - не всегда регистр.
Проблема -то в чём ?
Я так хотел его создать, могу объяснить почему.
Я так хотел его создать, могу объяснить почему.
Объясни, пожалуйста.
У меня период тактирования, самый короткий - 70 нс.
Время, в течение которого мне нужно ответить на входное воздействие - меньше 500 нс.
Некоторые входные сигналы могут иметь пики короче периода тактирования, нужно такие пики определить и удалить - т.е. для оценки входного сигнала уходит 1-2 периода тактирования - до 140нс.
Выходные сигналы проходят шинные буфера - не знаю сколько там потеряется, ну пусть 50 нс на два буфера.
Т.е. на обработку входных данных у меня остаётся где-то 300 нс - это 4-5 тактов.
Я пока не знаю, сколько тактов мне будет нужно, возможно, 2-3 хватит.
С другой стороны - всё это делается под maxII, а пока исследуется под max3000 - в любом случае максимальная задерка на распространение сигнала не превышает 10 нс. Значения на шинах до окончания 500нс интервала никого не интересуют.
Т.е. что бы я не изобразил на комбинаторной логике, это будет расчитано и установиться в стабильное состояние почти на порядок быстрее, чем если я начну протаскивать эти же данные через синхронный конвеер. Поэтому всё, что не требует явных пауз, я стараюсь реализовать комбинаторной логикой.
Вот хоть стреляй, но я все равно не вижу в твоем объяснении необходимость лепить регистр data_bus_r... Раз у тебя data_bus уже объявлен как inout, так и присваивай ему напрямую. Зачем ты впариваешь регистр?
Т.е. что бы я не изобразил на комбинаторной логике, это будет расчитано и установиться в стабильное состояние почти на порядок быстрее, чем если я начну протаскивать эти же данные через синхронный конвеер.
В том-то и дело, что именно синхронная логика легко поддается временному анализу, в отличие от комбинационной.
> Вот хоть стреляй, но я все равно не вижу в твоем объяснении необходимость лепить регистр data_bus_r.
Потому что чтобы комбинировать wire можно только через assign.
Т.е. я могу написать что-то вроде :
assign data_bus = rom_sel ? int_reg1 : dev_sel ? int_reg2 : 4'bz;
Я так делал, это работает.
Но когда такой assign вытягивается в кучу возможных комбинаций он плохо читается.
Поэтому я перешел на case.
По используемым ячейкам тоже самое.
Я пробовал как case так и сasex , так как заранее известно, что только один из *_sel-сигналом может стать высоким в один момент.
В итоге синтеза это всё даёт примерно одну схему. Но визуально case легче читается и модифицируется.
Если можешь предложить более красивое решение - пиши.
-=-
>> Т.е. что бы я не изобразил на комбинаторной логике, это будет расчитано и установиться в стабильное состояние почти на порядок быстрее, чем если я начну протаскивать эти же данные через синхронный конвеер.
> В том-то и дело, что именно синхронная логика легко поддается временному анализу, в отличие от комбинационной.
Твоё высказывание, вроде как, не противоречит моему ?
Со своим я согласен, с твоим - тоже. Разве я спорю с тем, что синхронную проще анализировать?
Конечно проще!
Но у нас тут сайт как бы посвящён вовсе не упрощению жизни ?
Игорь, вот, как -то писал, что любит на реальном Агате набирать тексты для сайта.
Я тоже же не за еду делаю свои разработки, чтобы быстро и просто закончить их и забыть.
Мне нравится копаться в деталях.
Я понимаю, что можно воткнуть в схему синхрогенератор на несколько десятков МГц и сделать полностью синхронную
обработку. Но какую проблему в этой конкретной задаче я решу таким образом ? Анализ времени здесь и так не представляет никакой сложности, хоть с синхронной хоть с асинхронной конфигурацией, а вот дополнительное потребление энергии, лишнюю деталь и повышенное ЭМИ я получу при этом.
Если можешь предложить более красивое решение - пиши.
Ну попробуй case без always, тогда data_bus (объявленной как inout wire) можно напрямую внутри case присваивать. Получается?
Анализ времени здесь и так не представляет никакой сложности, хоть с синхронной хоть с асинхронной конфигурацией,
Это совсем не так просто, как кажется...
а вот дополнительное потребление энергии, лишнюю деталь и повышенное ЭМИ я получу при этом.
Ну вот щас прям ваще мегааргумент. ;)
case без always попробую, конечно, спасибо!
А про остальное: я вот думал - как бы так ответить, чтобы не вызвать ещё одного витка обсуждения ?
Если бы с тобой сели где нибудь, не берегу реки, на закате, вечером, с каким нибудь чаем или там, пивом - кто что любит - мы бы наверняка обо всём договорились. Ну за час, два, может даже за четыре. Но обязательно бы поняли друг друга. А так - ну не получается.
Если бы я писал что-то вроде "помогите, не работает" - ну там понятно было бы. Но на этом форуме так пишут, наверное, только в теме "ремонт".
Я же просто рассказываю о том, что делаю, причем, по возможности, не вдаваясь в подробности.
Пишу потому, что сам люблю читать на этом форуме рассказы о чужих разработках.
Но это же не курсовая или диссертация, чтобы её защищать, тем более по переписке.
Написал отцу письмо:
"Школьникам пытаются начать преподаватьVerilog.
Хотя надо было бы сделать это лет 10-20 назад.
https://habr.com/ru/post/404387/
Мне вообще не понятно, почему нам его не преподавали на РФФ ?"
А он мне отвечает:
"Либо о нем не знали, вроде меня. Либо давали ЛЯПАС, разработанный группой А.Д.Закревского."
Полез копаться, что такое ЛЯПАС. Выкопал статью о его авторе:
https://ru.wikipedia.org/wiki/%D0%97%D0 … 0%B8%D1%87
Нам этот язык не давали, хотя курс дискретной математики у нас был и очень развёрнутый.
Включая всевозможные методы оптимизации логических схем и много другого интересного.
Я был готов к этому курсу, ещё со школы зачитывался интересной книжкой:
Отряшенков "Юный кибернетик".
https://sheba.spb.ru/za/informatika-unkib-1978.htm
(недавно кинул эту ссылку нашему сисадмину, он потом с восторгом говорит: "Ну я теперь хоть знаю, откуда слово "Андроид" возникло :)")
А тут копаюсь, и нахожу ещё одно интересное:
Г. П. Агибалов
К возрождению русского языка программирования
http://www.mathnet.ru/php/archive.phtml … n_lang=rus
Вау ! Агибалов - это препод, который нам дискретку читал :))
Почему он ничего не говорил о ЛЯПАС или почему я этого не запомнил ? :)
Лаб по нему у нас точно не было :((
Хотя мы застали по разным предметам много разной аппаратуры: сидели и за многотерминальными вычислительными компами и ещё всякого много было.
что такое ЛЯПАС
Никогда не слышал о таком. Но в английских википедиях пишут что это расширение языка APL.
А APL это жуткая заумь с использованием спец символов вместо кодовых слов.
Например типичный пример, как выглядит расчет одного хода в игре "Жизнь" Конвея на APL:
life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}
Что интересно, один из ранних домашних компьютеров VideoBrain Family Computer выпускался с поддержкой диалекта APL вместо тогда уже ставшего стандартом бейсика. https://en.wikipedia.org/wiki/VideoBrai … y_Computer
Чтобы отправить ответ, вы должны войти или зарегистрироваться
ПЭВМ "Агат" 7-9: Форум → Прочее техническое → Копаю PAL/FPGA. В целом, не только для Агата
Форум работает на PunBB, при поддержке Informer Technologies, Inc