51

Re: Копаю PAL/FPGA. В целом, не только для Агата

В шите даташном на MAX7000 рисунки 11 и 15, на 3000 аналогично.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

52 Отредактировано Voldemar0 (04-12-2019 20:03)

Re: Копаю PAL/FPGA. В целом, не только для Агата

Хочу выбрать доступные-дешевые матрицы под пару проектов - один помельче, другой - посложнее.

Составил сравнение по ключевым признакам: количество логических элементов и минимальная стоимость в России (без учёта мутного, в данном случае, алиэкспресса):

Семейство    микра    объём    цена    питание ядра    питание 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.
А вот для средних почему-то четвёртый циклон (хотя другие поколения циклонов не смотрел - просто случайно этот попался).

53 Отредактировано Voldemar0 (04-12-2019 19:53)

Re: Копаю PAL/FPGA. В целом, не только для Агата

Прикольно, работает :)) Всю жизнь мечтал о такой микрухе. Только не всегда знал, что они существуют.

Ощущения от 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 то же самое - любое движение разбегается как круги по воде.

Post's attachments

DSC00251.jpg, 48.82 kb, 564 x 360
DSC00251.jpg 48.82 kb, 3 downloads since 2019-12-04 

54 Отредактировано AlexBel (04-12-2019 19:46)

Re: Копаю PAL/FPGA. В целом, не только для Агата

Это кто там, Макс2?

Кстати, жирные CPLD сейчас внутри содержат FPGA со встроенной конфигурационной памятью. Насколько я знаю, это Макс5 и выше.

55

Re: Копаю PAL/FPGA. В целом, не только для Агата

тут epm3064

maxII (epm240, например) вроде тоже fpga со встроенной пзу.

Во всяком случае макроячейки у epm240 мельче чем у epm3064.
Насколько я понял, cpld - это много галок с кучей входов и одним выходом. А fpga - это очень много очень упрощенных галок (фактически, там не матрица логики в каждой, а ПЗУ с триггером).

Но прелесть в том, что конфигурации грузятся в любую из них, я уже пробовал некоторые конфиги таскать между maxII и max3000 - норм работают, без переделок.

56

Re: Копаю PAL/FPGA. В целом, не только для Агата

Voldemar0 пишет:

Но прелесть в том, что конфигурации грузятся в любую из них, я уже пробовал некоторые конфиги таскать между maxII и max3000 - норм работают, без переделок.

Без перекомпиляции?

57

Re: Копаю PAL/FPGA. В целом, не только для Агата

> Без перекомпиляции?

С компиляцией, конечно. И с перестановкой пинов, если быть предельно точным.

Кстати, с компиляцией не могу понять: чем выше версия квартуса тем он тормознее на компиляции.
И, что меня особо удивляет - скорость компиляции почти не зависит от размера исходника.
Хоть он пустой из пары assign, что штук 5 always, куча assign - всё равно полминуты на полную сборку (P-IV , 3 GHz, гипертрейд ).
На i3 быстрее, конечно, но не так чтобы моментально - где-то 10 секунд против 30.

58

Re: Копаю PAL/FPGA. В целом, не только для Агата

Voldemar0 пишет:

Хочу выбрать доступные-дешевые матрицы под пару проектов - один помельче, другой - посложнее.

НАСТОЯТЕЛЬНО рекомендую MAX7000S, и то она в единице выдает всего 4 Вольта, а все остальные еще меньше...
Но еще раз повторюсь: в CPLD ОЧЕНЬ мало количество внутренних связей (в 7000/3000 всего то 36).

По верилогу. Попробуй взглянуть на это по-другому: когда ты рисуешь схему устройства - ты ведь не описываешь программу последовательного выполнения, ты графически описываешь составляющие проекта, работающие непрерывно, параллельно и автономно от других составляющих. Вот верилог (как и любой другой HDL) делает это также, только в текстовом виде. Поменяй мЫшление. ;)

По wire и reg. Тут тоже все просто: wire - это всего лишь проводник, сигнал, функция комбинаторики. Нет квантованости (непрерывен), нет хранения. reg - функция триггера, квантован по клоку, есть хранение, синхронизм. Еще раз посоветую - постарайся освоить именно синхронизм дизайна.

По кактусу. 9.1sp2 - лёгкий, шустрый, с симулятором. А еще SSD в качестве системного очень ускоряет систему, а если еще и кактус стоит на SSD, то тем более.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

59 Отредактировано Voldemar0 (05-12-2019 14:40)

Re: Копаю PAL/FPGA. В целом, не только для Агата

> НАСТОЯТЕЛЬНО рекомендую 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 я же всё равно уточняю - синхронные у неё входы или нет и какий у них уровень активный - т.е. я уже думаю о тактах-шагах. Без времени, наверное, можно было проектировать аналоговые схемы, которые описывались в каком-то пространстве, вроде частота/фаза или активная/реактивная составляющая сигнала.

60 Отредактировано LeoN (05-12-2019 15:59)

Re: Копаю PAL/FPGA. В целом, не только для Агата

Voldemar0 пишет:

>  reg - функция триггера, квантован по клоку,

wire b;
wire c;
reg a;
always @* 
  case (a)
    1: a <= b;
    0: a <= 0;
  endcase

и a перестаёт быть регистром. Хотя и очень похожа.

Лично для меня это бессмысленный код... Напуркуа здесь "c"? Начальное состояние неизвестно... При отрицательном фронте "b" (но это не клоковый список чувствительности!!!): "a" защелкивается в 0 и навсегда остается 0...

Фу-у-у-уф... Давай без обид, еще раз, и натурально по шагам:
Шаг 1. Покажи схему того, что ты задумал.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

61 Отредактировано Voldemar0 (05-12-2019 18:19)

Re: Копаю PAL/FPGA. В целом, не только для Агата

Я не задумывал устройство, я демонстрирую тот факт, что 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                                                                                                         

62

Re: Копаю PAL/FPGA. В целом, не только для Агата

А-а-а-а-а!!!!!!!!!!!!!
Ты лепишь регистр, но по клоку в него не пишешь!!!!!!!!!!!!!! А пишешь по уровню... И еще удивляешься, что регистр вырождается в мультиплексор.
Я тебе кучу ссылок предоставил, где на это обращают внимание. И это беда не компилятора, а дизайнера!
А-а-а-а-а!!!!!!!!!!!!! Услышь меня!!!!

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

63 Отредактировано Voldemar0 (05-12-2019 19:51)

Re: Копаю PAL/FPGA. В целом, не только для Агата

Я не пойму, что ты хочешь добиться ? И почему столько эмоций (судя по количеству знаков пунктуации) ?

Ты начал с этого:
> reg - функция триггера, квантован по клоку, есть хранение, синхронизм

Я говорю, что reg не всегда будет именно регистром.
И показал пример.
Ты согласен и знаешь, что именно и почему получается.
Т.е. ты согласен что reg - не всегда регистр.

Проблема -то в чём ?

Я так хотел его создать, могу объяснить почему.

64

Re: Копаю PAL/FPGA. В целом, не только для Агата

Voldemar0 пишет:

Я так хотел его создать, могу объяснить почему.

Объясни, пожалуйста.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

65

Re: Копаю PAL/FPGA. В целом, не только для Агата

У меня период тактирования, самый короткий - 70 нс.

Время, в течение которого мне нужно ответить на входное воздействие - меньше 500 нс.

Некоторые входные сигналы могут иметь пики короче периода тактирования, нужно такие пики определить и удалить - т.е. для оценки входного сигнала уходит 1-2 периода тактирования - до 140нс.
Выходные сигналы проходят шинные буфера - не знаю сколько там потеряется, ну пусть 50 нс на два буфера.

Т.е. на обработку входных данных у меня остаётся где-то 300 нс - это 4-5 тактов.
Я пока не знаю, сколько тактов мне будет нужно, возможно, 2-3 хватит.

С другой стороны - всё это делается под maxII, а пока исследуется под max3000 - в любом случае максимальная задерка на распространение сигнала не превышает 10 нс. Значения на шинах до окончания 500нс интервала никого не интересуют.

Т.е. что бы я не изобразил на комбинаторной логике, это будет расчитано и установиться в стабильное состояние почти на порядок быстрее, чем если я начну протаскивать эти же данные через синхронный конвеер. Поэтому всё, что не требует явных пауз, я стараюсь реализовать комбинаторной логикой.

66 Отредактировано LeoN (06-12-2019 08:38)

Re: Копаю PAL/FPGA. В целом, не только для Агата

Вот хоть стреляй, но я все равно не вижу в твоем объяснении необходимость лепить регистр data_bus_r... Раз у тебя data_bus уже объявлен как inout, так и присваивай ему напрямую. Зачем ты впариваешь регистр?

Voldemar0 пишет:

Т.е. что бы я не изобразил на комбинаторной логике, это будет расчитано и установиться в стабильное состояние почти на порядок быстрее, чем если я начну протаскивать эти же данные через синхронный конвеер.

В том-то и дело, что именно синхронная логика легко поддается временному анализу, в отличие от комбинационной.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

67 Отредактировано Voldemar0 (06-12-2019 09:52)

Re: Копаю PAL/FPGA. В целом, не только для Агата

> Вот хоть стреляй, но я все равно не вижу в твоем объяснении необходимость лепить регистр data_bus_r.

Потому что чтобы комбинировать wire можно только через assign.
Т.е. я могу написать что-то вроде :

assign data_bus = rom_sel ? int_reg1 : dev_sel ? int_reg2 : 4'bz;

Я так делал, это работает.
Но когда такой assign вытягивается в кучу возможных комбинаций он плохо читается.
Поэтому я перешел на case.
По используемым ячейкам тоже самое.
Я пробовал как case так и сasex , так как заранее известно, что только один из *_sel-сигналом может стать высоким в один момент.
В итоге синтеза это всё даёт примерно одну схему. Но визуально case легче читается и модифицируется.

Если можешь предложить более красивое решение - пиши.

-=-

>>   Т.е. что бы я не изобразил на комбинаторной логике, это будет расчитано и установиться в стабильное состояние почти на порядок быстрее, чем если я начну протаскивать эти же данные через синхронный конвеер.

> В том-то и дело, что именно синхронная логика легко поддается временному анализу, в отличие от комбинационной.

Твоё высказывание, вроде как, не противоречит моему ?
Со своим я согласен, с твоим - тоже. Разве я спорю с тем, что синхронную проще анализировать?
Конечно проще!

Но у нас тут сайт как бы посвящён вовсе не упрощению жизни ?
Игорь, вот, как -то писал, что любит на реальном  Агате набирать тексты для сайта.
Я тоже же не за еду делаю свои разработки, чтобы быстро и просто закончить их и забыть.
Мне нравится копаться в деталях.

Я понимаю, что можно воткнуть в схему синхрогенератор на несколько десятков МГц и сделать полностью синхронную
обработку. Но какую проблему в этой конкретной задаче я решу таким образом ? Анализ времени здесь и так не представляет никакой сложности, хоть с синхронной хоть с асинхронной конфигурацией, а вот дополнительное потребление энергии, лишнюю деталь и повышенное ЭМИ я получу при этом.

68

Re: Копаю PAL/FPGA. В целом, не только для Агата

Voldemar0 пишет:

Если можешь предложить более красивое решение - пиши.

Ну попробуй case без always, тогда data_bus (объявленной как inout wire) можно напрямую внутри case присваивать. Получается?

Voldemar0 пишет:

Анализ времени здесь и так не представляет никакой сложности, хоть с синхронной хоть с асинхронной конфигурацией,

Это совсем не так просто, как кажется...

Voldemar0 пишет:

а вот дополнительное потребление энергии, лишнюю деталь и повышенное ЭМИ я получу при этом.

Ну вот щас прям ваще мегааргумент. ;)

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

69

Re: Копаю PAL/FPGA. В целом, не только для Агата

case без always попробую, конечно, спасибо!

А про остальное: я вот думал - как бы так ответить, чтобы не вызвать ещё одного витка обсуждения ?

Если бы с тобой сели где нибудь, не берегу реки, на закате, вечером, с каким нибудь чаем или там, пивом - кто что любит - мы бы наверняка обо всём договорились. Ну за час, два, может даже за четыре. Но обязательно бы поняли друг друга. А так - ну не получается.

Если бы я писал что-то вроде "помогите, не работает" - ну там понятно было бы. Но на этом форуме так пишут, наверное, только в теме "ремонт".
Я же просто рассказываю о том, что делаю, причем, по возможности, не вдаваясь в подробности.
Пишу потому, что сам люблю читать на этом форуме рассказы о чужих разработках.
Но это же не курсовая или диссертация, чтобы её защищать, тем более по переписке.