Перейти к содержанию
    

инкремент двоичного счётчика на два

9 minutes ago, new123 said:

на языке электроники (сумматор, регистры...)

так ведь Verilog как раз и описывает эти сумматоры и регистры. 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Yuri124 said:

Важно, чтобы написанное на языке можно было синтезировать в железе

ну это же квартус делает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иногда сразу заворачивает - если ему что-то не нравится, хотя на языке выглядит красиво.

А иногда то, что должно синтезироваться за 5 минут, пытается делать часами, безуспешно. Потому что на языке выглядит правдоподобно, а в железе - не реализуемо.

Изменено пользователем Yuri124

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, new123 сказал:

ну это же квартус делает?

Тут как говорится "весь секс в голове".

программист всегда имеет дело с фиксированной структурой железа и мыслит в "последовательности действий". И попав в ПЛИС пытается работать старыми технологическими приемами. 

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

Вот в этом видимо и есть разница. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу основной задачи можно вообще считать отдельно случаи когда нужно считать по два. Т.е. основной счётчик считает по 1. А дополнительный тоже по одному то в тот момент когда нужно считать по 2. Потом на выходе их складываем :)

30 минут назад, new123 сказал:

Интересно было почитать. Если не сложно, извините что не совсем по теме. Почему в данном случае вы все общаетесь на языке электроники (сумматор, регистры...) Если проще было один раз написать на Verilog с одним If и простым инкрементом. В журнале Иосифа так же половину текста долго рассказывается на языке электроники и достаточно быстро выложено одним куском кода пересказанное.
Это наверное идеология, которая мне, программисту, не понятна?

Тут есть несколько причин.

1. Физическая реализуемость. Т.е. в плис есть свои кубики и думать в этих кубиках вполне логично (например есть кубик сумматора с быстрым переносом). Примерно так же как программисты думаю в ячейках памяти или регистрах процессора если пишут на ассемблере. Т.е. это связь с внешним миром.
2. Приемственность поколений :))) Когда солнце было ярче а трава зеленее не было никаких плис. А были россыпи жёсткой логики в отдельных корпусах. И мыслить корпусами было вполне естественно.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно, спасибо ответившим. Я получается зашел в ПЛИС с другого края и по мере роста проекта приходится изучать финты с ушами, типа как описано Иосифом - деление большого счетчика на два с переносом.

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, new123 сказал:

Понятно, спасибо ответившим. Я получается зашел в ПЛИС с другого края и по мере роста проекта приходится изучать финты с ушами, типа как описано Иосифом - деление большого счетчика на два с переносом.

Я не очень разбираюсь по поколениям плис от альтеры. Но для того что сейчас навалом от Xilinx (Spartan 6,7, Artix) частоты 120Мгц и счётчик на 20 бит это вообще не требует оптимизации. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, MegaVolt said:

Я не очень разбираюсь по поколениям плис от альтеры. Но для того что сейчас навалом от Xilinx (Spartan 6,7, Artix) частоты 120Мгц и счётчик на 20 бит это вообще не требует оптимизации. 

MAXII вроде очень лайт. На нем наверное даже ethernet 100 не поднять будет. 
Мне поэтому и интересно стало читать, как форумчане пытаются уложить в него логику на электронном языке сразу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, new123 сказал:

MAXII вроде очень лайт. На нем наверное даже ethernet 100 не поднять будет. 
Мне поэтому и интересно стало читать, как форумчане пытаются уложить в него логику на электронном языке сразу

А... тогда да. Хитростей полно. Но тогда нужно понимать что за кристалл. Пишите какие то частоты из паспорта. Например максимальная частота клокового буфера. От неё думаю можно отталкиваться. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, new123 said:

логику на электронном языке сразу

Мне кажется, тут особо сложного ничего нет. Если представить себе, как в принципе реализуется какой-то кусок схемы, который должен что-то выполнять (т.е. что он принципиально реализуем) - то просто описывается его поведение в блоке языком, без вхождение в его внутреннюю структуру. А синтезатор уже сам сконструирует исходя из возможностей кристалла и нужных опций (оптимизация по быстродействию, энергопотреблению или количеству ресурсов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 22.03.2019 в 13:26, Yuri124 сказал:

Мне кажется, тут особо сложного ничего нет. Если представить себе, как в принципе реализуется какой-то кусок схемы, который должен что-то выполнять (т.е. что он принципиально реализуем) - то просто описывается его поведение в блоке языком, без вхождение в его внутреннюю структуру. А синтезатор уже сам сконструирует исходя из возможностей кристалла и нужных опций (оптимизация по быстродействию, энергопотреблению или количеству ресурсов).

железячник, накидывая код, примерно понимает как его разложит синтезатор. сколько это будет лутов и триггеров, сколько слоев логики, уложится ли это в требования к быстродействию и объему проекта или нет, какие его ждут неприятности в последствии и куда надо будет смотреть, если что то не заработает.  программист приблизительно что то понимая пишет код и отдает его на откуп синтезатору, рассчитывая что он по заданным ему параметрам что то соберет. косяк в том, что настраивать синтезатор программист не умеет :). да и сама эта шайтан машина работает далеко не идеально и постоянно выеживается, выдавая не то что должен был выдать.

 

например запись сумматора Х=А + В + Р(перенос), это не то же самое что Х=В+А+Р (или Х=А+Р+В - уже не помню :)). эти записи синтезатор разложит по-разному

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 22.03.2019 в 11:22, new123 сказал:

Это наверное идеология, которая мне, программисту, не понятна?

Крайне желательно, чтобы программист понимал, во что превратится (синтезируется) написанный им код. Раньше сказали бы - обязательно, а не желательно. На практике все же приходится констатировать факт, что до какого-то уровня сложности кода можно получать работающий результат, не понимая подробностей.

 

Считается, что "программист ПЛИС" - и не программист даже, а схемотехник. С соответствующим базовым образованием. Но эта грань все больше стирается: на практике чистый программист или математик может написать мудреный hdl-код, который будет неплохо собираться и отлично работать, но при этом будет совершенно непонятен классическим плисоводам.

 

В целом же, у меня лично складывается мнение что при современном уровне развития синтезаторов математика >> схемотехники. Человек, привыкший мыслить абстрактно, способен выдать синтезируемую реализацию алгоритма, смотря на которую схемотехники только голову чешут: "а что, разве так вообще можно писать"? Ну а необходимые для работы практические концепции (ресеты, разноклоковость, где сколько уровней логики возникнет) программист легко усваивает и без специального образования.

 

Однозначно, вендоры будут и дальше прикладывать огромные усилия, чтобы рядовому "программисту ПЛИС" почти ничего не требовалось бы знать о регистрах и сумматорах. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот такая "колбаса" в блок-схеме получилась. :biggrin:

Гляньте, не перемудрил ли чего ?

Интересно, а на Verilog это как выглядеть будет? 

cnt.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И зачем все это? Если пишете код, то синтезатор автоматически выберет лучшую из готовых реализаций. Когда надо будет собрать код под млн. гейтов, то никто не будет заниматься этой ерундой.

Требуется писать правильный код и понимать куда он вас приведёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...