Yuri124 2 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба 9 minutes ago, new123 said: на языке электроники (сумматор, регистры...) так ведь Verilog как раз и описывает эти сумматоры и регистры. Важно, чтобы написанное на языке можно было синтезировать в железе - а то можно такого наворотить, что будет пытаться вечность синтезироваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба 2 minutes ago, Yuri124 said: Важно, чтобы написанное на языке можно было синтезировать в железе ну это же квартус делает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 2 22 марта, 2019 Опубликовано 22 марта, 2019 (изменено) · Жалоба Иногда сразу заворачивает - если ему что-то не нравится, хотя на языке выглядит красиво. А иногда то, что должно синтезироваться за 5 минут, пытается делать часами, безуспешно. Потому что на языке выглядит правдоподобно, а в железе - не реализуемо. Изменено 22 марта, 2019 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба 3 минуты назад, new123 сказал: ну это же квартус делает? Тут как говорится "весь секс в голове". программист всегда имеет дело с фиксированной структурой железа и мыслит в "последовательности действий". И попав в ПЛИС пытается работать старыми технологическими приемами. А я аппаратчик, я сначала рисую алгоритм вычислений, а потом для него делаю блок-схему вычислителя. И уже по блок-схеме вычислителя описываю проект. Причем для одного и того же алгоритма можно сделать несколько вариантов вычислителей, с разным быстродействием и разными ресурсами. Вот в этом видимо и есть разница. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 28 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба По поводу основной задачи можно вообще считать отдельно случаи когда нужно считать по два. Т.е. основной счётчик считает по 1. А дополнительный тоже по одному то в тот момент когда нужно считать по 2. Потом на выходе их складываем :) 30 минут назад, new123 сказал: Интересно было почитать. Если не сложно, извините что не совсем по теме. Почему в данном случае вы все общаетесь на языке электроники (сумматор, регистры...) Если проще было один раз написать на Verilog с одним If и простым инкрементом. В журнале Иосифа так же половину текста долго рассказывается на языке электроники и достаточно быстро выложено одним куском кода пересказанное. Это наверное идеология, которая мне, программисту, не понятна? Тут есть несколько причин. 1. Физическая реализуемость. Т.е. в плис есть свои кубики и думать в этих кубиках вполне логично (например есть кубик сумматора с быстрым переносом). Примерно так же как программисты думаю в ячейках памяти или регистрах процессора если пишут на ассемблере. Т.е. это связь с внешним миром. 2. Приемственность поколений :))) Когда солнце было ярче а трава зеленее не было никаких плис. А были россыпи жёсткой логики в отдельных корпусах. И мыслить корпусами было вполне естественно. А вообще вы правы. Текущие плис в большинстве случаев позволяют всё скинуть на автоматическую раскладку и всё будет работать. А места и скорости в современных ПЛИС уже с запасом. Само собой это не относиться к проектам работающим на грани возможностей кристалла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 22 марта, 2019 Опубликовано 22 марта, 2019 (изменено) · Жалоба Понятно, спасибо ответившим. Я получается зашел в ПЛИС с другого края и по мере роста проекта приходится изучать финты с ушами, типа как описано Иосифом - деление большого счетчика на два с переносом. Изменено 22 марта, 2019 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 28 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба 13 минут назад, new123 сказал: Понятно, спасибо ответившим. Я получается зашел в ПЛИС с другого края и по мере роста проекта приходится изучать финты с ушами, типа как описано Иосифом - деление большого счетчика на два с переносом. Я не очень разбираюсь по поколениям плис от альтеры. Но для того что сейчас навалом от Xilinx (Spartan 6,7, Artix) частоты 120Мгц и счётчик на 20 бит это вообще не требует оптимизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба 5 minutes ago, MegaVolt said: Я не очень разбираюсь по поколениям плис от альтеры. Но для того что сейчас навалом от Xilinx (Spartan 6,7, Artix) частоты 120Мгц и счётчик на 20 бит это вообще не требует оптимизации. MAXII вроде очень лайт. На нем наверное даже ethernet 100 не поднять будет. Мне поэтому и интересно стало читать, как форумчане пытаются уложить в него логику на электронном языке сразу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 28 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба 6 минут назад, new123 сказал: MAXII вроде очень лайт. На нем наверное даже ethernet 100 не поднять будет. Мне поэтому и интересно стало читать, как форумчане пытаются уложить в него логику на электронном языке сразу А... тогда да. Хитростей полно. Но тогда нужно понимать что за кристалл. Пишите какие то частоты из паспорта. Например максимальная частота клокового буфера. От неё думаю можно отталкиваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 2 22 марта, 2019 Опубликовано 22 марта, 2019 · Жалоба 11 minutes ago, new123 said: логику на электронном языке сразу Мне кажется, тут особо сложного ничего нет. Если представить себе, как в принципе реализуется какой-то кусок схемы, который должен что-то выполнять (т.е. что он принципиально реализуем) - то просто описывается его поведение в блоке языком, без вхождение в его внутреннюю структуру. А синтезатор уже сам сконструирует исходя из возможностей кристалла и нужных опций (оптимизация по быстродействию, энергопотреблению или количеству ресурсов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 28 марта, 2019 Опубликовано 28 марта, 2019 · Жалоба В 21.03.2019 в 22:24, zombi сказал: Не пинайте слишком сильно если спрашиваю ерунду. Но, толи устал толи ... Проект на MAXII. Есть 20-ти разрядный двоичный счёчик с сигналами сброса, начальной загрузки и входом разрешения счёта. Нужно как-то реализовать возможность увеличения его значения на единицу или на два. В зависимости от некого внешнего сигнала. Как это реализовать? вроде так. счет вверх-вниз по выбору. по желанию ненужные варианты выпиливаются. сигналы в капсе - внешние порты вашего устройства (если счетчик это отдельный блок). если просто код процесса внутри большого устройства - то они вырабатываются где тов другом месте architecture Behavioral of counter is signal ct, INCR :std_logic_vector(19 downto 0):=(others=>'0'); signal res_ct, CE_CT, init_ct :std_logic; signal res_ct_m2d, res_ct_md :std_logic; signal INCR_SELECT, direct_count :std_logic; constant const_v1 :std_logic_vector(19 downto 0):="00000000000000000001"; constant const_v2 :std_logic_vector(19 downto 0):="00000000000000000010"; constant CONST_INIT :std_logic_vector(19 downto 0):="11111000000111001110"; --значние -1 от нужного, т.к. счет с/до нуля BEGIN pr_ct:process(CLK) begin if CLK'event and CLK='1' then --если у вас срабатываение счетчика 1 раз на 3 такта, то условие сброса, выработанное на предпоследнем такте "выравнивается" по срабатыванию --если счетчик срабатывает на каждом такте частоты, то ничего выравнивать не надо if res_ct='1' then res_ct<='0' after 100 ps; elsif direct_count='0' and CE_CT='1' and ct=CONST_INIT then res_ct_m2d<='1' after 100 ps; elsif direct_count='1' and CE_CT='1' and ct=const_v1 then res_ct_m2d<='1' after 100 ps; else res_ct_m2d<=res_ct_m2d after 100 ps; end if; res_ct_md<=res_ct_m2d after 100 ps; res_ct<=res_ct_md after 100 ps; --условие на выработку СЕ счетчика if INCR_SELECT='1' then incr<=const_v1 after 100 ps; else incr<=const_v2 after 100 ps; end if; if res_ct='1' and direct_count='0' then ct<=(others=>'0') after 100 ps; elsif (res_ct='1' and direct_count='1') or INIT_CT='1' then ct<=CONST_INIT after 100 ps; elsif CE_CT='1' and direct_count='0' then ct<=ct+incr after 100 ps; elsif CE_CT='1' and direct_count='1' then ct<=ct-incr after 100 ps; else ct<=ct after 100 ps; end if; end if;--clk END. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 28 марта, 2019 Опубликовано 28 марта, 2019 · Жалоба В 22.03.2019 в 13:26, Yuri124 сказал: Мне кажется, тут особо сложного ничего нет. Если представить себе, как в принципе реализуется какой-то кусок схемы, который должен что-то выполнять (т.е. что он принципиально реализуем) - то просто описывается его поведение в блоке языком, без вхождение в его внутреннюю структуру. А синтезатор уже сам сконструирует исходя из возможностей кристалла и нужных опций (оптимизация по быстродействию, энергопотреблению или количеству ресурсов). железячник, накидывая код, примерно понимает как его разложит синтезатор. сколько это будет лутов и триггеров, сколько слоев логики, уложится ли это в требования к быстродействию и объему проекта или нет, какие его ждут неприятности в последствии и куда надо будет смотреть, если что то не заработает. программист приблизительно что то понимая пишет код и отдает его на откуп синтезатору, рассчитывая что он по заданным ему параметрам что то соберет. косяк в том, что настраивать синтезатор программист не умеет :). да и сама эта шайтан машина работает далеко не идеально и постоянно выеживается, выдавая не то что должен был выдать. например запись сумматора Х=А + В + Р(перенос), это не то же самое что Х=В+А+Р (или Х=А+Р+В - уже не помню :)). эти записи синтезатор разложит по-разному Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flood 13 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба В 22.03.2019 в 11:22, new123 сказал: Это наверное идеология, которая мне, программисту, не понятна? Крайне желательно, чтобы программист понимал, во что превратится (синтезируется) написанный им код. Раньше сказали бы - обязательно, а не желательно. На практике все же приходится констатировать факт, что до какого-то уровня сложности кода можно получать работающий результат, не понимая подробностей. Считается, что "программист ПЛИС" - и не программист даже, а схемотехник. С соответствующим базовым образованием. Но эта грань все больше стирается: на практике чистый программист или математик может написать мудреный hdl-код, который будет неплохо собираться и отлично работать, но при этом будет совершенно непонятен классическим плисоводам. В целом же, у меня лично складывается мнение что при современном уровне развития синтезаторов математика >> схемотехники. Человек, привыкший мыслить абстрактно, способен выдать синтезируемую реализацию алгоритма, смотря на которую схемотехники только голову чешут: "а что, разве так вообще можно писать"? Ну а необходимые для работы практические концепции (ресеты, разноклоковость, где сколько уровней логики возникнет) программист легко усваивает и без специального образования. Однозначно, вендоры будут и дальше прикладывать огромные усилия, чтобы рядовому "программисту ПЛИС" почти ничего не требовалось бы знать о регистрах и сумматорах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 15 апреля, 2019 Опубликовано 15 апреля, 2019 · Жалоба Вот такая "колбаса" в блок-схеме получилась. Гляньте, не перемудрил ли чего ? Интересно, а на Verilog это как выглядеть будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 16 апреля, 2019 Опубликовано 16 апреля, 2019 · Жалоба И зачем все это? Если пишете код, то синтезатор автоматически выберет лучшую из готовых реализаций. Когда надо будет собрать код под млн. гейтов, то никто не будет заниматься этой ерундой. Требуется писать правильный код и понимать куда он вас приведёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться