Flip-fl0p 4 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 19 минут назад, Bad0512 сказал: Что вы понимаете под "правильно"? В коде есть неоднозначность, которая позволяет синтезатору по своему разумению расставить приритеты между сигналами reset и count_enable. Думаете он знает как "правильно" с вашей точки зрения? Что будет в случае если reset = 1 и count_enable = 1 ? Какое событие произойдёт и почему? Стандарт языка не даст синтезатору творить вакханалию. Я сам так всегда пишу, ни разу синтезатор не ошибся Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 15 minutes ago, Flip-fl0p said: Стандарт языка не даст синтезатору творить вакханалию. Я сам так всегда пишу, ни разу синтезатор не ошибся Ну и что говорит стандарт о подобных конструкциях? Как он разрешает подобные коллизии? "я сам так всегда пишу" - это аргумент из серии " я улицу перехожу не глядя на светофор, и ни разу ещё ничего не случилось". З Ы Я допускаю, что разработчики конкретного ситезатора подстелили соломки и трактуют подобные неявные конструкции в пользу наиболее вероятного поведения. Но это относится только к данному синтезатору, и не факт что другой синтезатор будет поступать так же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nameless 0 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба Большое спасибо всем откликнувшимся! Я осознаю, что являюсь заложником мощной традиции процедурного программирования. Однако налицо ограничения синтезатора. Отсюда другой вопрос: есть ли альтернатива ISE для работы со "старыми" приборами? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 2 hours ago, Bad0512 said: Что вы понимаете под "правильно"? А Вы попробуйте засинтезировать конструкцию с двумя условиями сброса. Уверен что после синтеза получится некое неожиданное создание и Вы будете "приятно" удивлены полученной конструкцией. 2 hours ago, Bad0512 said: В коде есть неоднозначность, которая позволяет синтезатору по своему разумению расставить приритеты между сигналами reset и count_enable. Это возможно для Вас неоднозначность. А для разработчика синтезатора или для инженера всё выгляди вполне логично (если говорить именно про сигнал сброса, а не установки в единицу или инициализации шины в какое-то непонятное значение): сначала мы подключаем комбинационную логику, которая заходит на сигналы CE/D, а потом мы подключаем сброс тригерра. Никакой мистики. Опять же, вот написаны очень правильные слова (об этом я тоже упоминал): 14 hours ago, Maverick_ said: Берем оттуда готовые описания, подгоняем под свои нужды и делаем для каждого описания отдельные файлы. И разработчики ISE в некоторых документах именно так рекомендуют делать описание триггеров. 1 hour ago, nameless said: Отсюда другой вопрос: есть ли альтернатива ISE для работы со "старыми" приборами? Увы, но нет. Максимум что Вы можете - это перейти на Verilog. Хотя это не спасёт ситуацию кардинально. Читать темплейты всё равно придётся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 2 hours ago, Bad0512 said: Что вы понимаете под "правильно"? В коде есть неоднозначность, которая позволяет синтезатору по своему разумению расставить приритеты между сигналами reset и count_enable. Думаете он знает как "правильно" с вашей точки зрения? Что будет в случае если reset = 1 и count_enable = 1 ? Какое событие произойдёт и почему? Я, конечно, не автор и сам так не пишу (не оставляю "простора для творчества" синтезатору на всякслучай), но, насколько помню, стандарт оговаривает, что если за один "проход" процесса некоему сигналу присваивается несколько значений, то в итоге будет присвоено последнее значение. Поэтому данный пример (сначала if Count_Enable...end if, а затем if Reset...end if) действительно будет работать правильно (Reset будет иметь приоритет). Но, как по мне, читаемость такой конструкции хуже, и лучше использовать if ... elsif... elsif... else, где неоднозначностей нет в принципе. 1 hour ago, nameless said: Отсюда другой вопрос: есть ли альтернатива ISE для работы со "старыми" приборами? По большому счёту, нет. Хотя для симуляции и собственно синтеза можно использовать сторонние средства. Я, например, использую QuestaSim и Precision (последний позволяет мне использовать VHDL-2008, а не -2002, коим ограничен ISE, да и Vivado вроде держит 2008 довольно плохо, но от неё я вообще стараюсь подальше держаться -- жуткий тормоз). 21 minutes ago, Nick_K said: Увы, но нет. Максимум что Вы можете - это перейти на Verilog. Хотя это не спасёт ситуацию кардинально. Читать темплейты всё равно придётся. Верилог ничем не поможет. Если нужно программировать, скажем, Spartan-3 -- то ISE, и точка. От языка это не зависит вообще никак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 6 minutes ago, SII said: Но, как по мне, читаемость такой конструкции хуже, и лучше использовать if ... elsif... elsif... else, где неоднозначностей нет в принципе. А тут уже вылазит проблема не читаемости, а синтеза. Когда у Вас должен быть один триггер и ему на вход сброса заведён выход элемента "И", а в результате синтезируется треггер со сбросом по одному сигналу и выходом через мультиплексор с переключением по второму сигналу (который должен был подаваться на элемент "И"). Отсюда времянка летит, непонятные конструкции вылазят (особенно на шинах под 16-32 бита). За годы проектирования таких приколов навидался, что пришлось "обучится" писать как в даташитах и ансверрекордах, а не как логично или удобочитаемо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 5 hours ago, Nick_K said: А Вы попробуйте засинтезировать конструкцию с двумя условиями сброса. Уверен что после синтеза получится некое неожиданное создание и Вы будете "приятно" удивлены полученной конструкцией. Это возможно для Вас неоднозначность. А для разработчика синтезатора или для инженера всё выгляди вполне логично (если говорить именно про сигнал сброса, а не установки в единицу или инициализации шины в какое-то непонятное значение): сначала мы подключаем комбинационную логику, которая заходит на сигналы CE/D, а потом мы подключаем сброс тригерра. Никакой мистики. Опять же, вот написаны очень правильные слова (об этом я тоже упоминал): 1 Зачем мне эта дичь? Пытаться выстрелить себе в ногу и убедиться что не попал ибо от этого меня "спас" разработчик синтезатора? Почему не научиться сразу писать правильно? 2 Зачем вы тут мне рассказываете как устроена ячейка ПЛИС? Вы думаете я этого не знаю? Вопрос ведь не в том "как оно получится" а в том "как писать правильно". 3 По поводу абсолютной пользы темплейтов целиком и полностью согласен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 7 минут назад, Bad0512 сказал: 1 Зачем мне эта дичь? Пытаться выстрелить себе в ногу и убедиться что не попал ибо от этого меня "спас" разработчик синтезатора? Почему не научиться сразу писать правильно? 2 Зачем вы тут мне рассказываете как устроена ячейка ПЛИС? Вы думаете я этого не знаю? Вопрос ведь не в том "как оно получится" а в том "как писать правильно". 3 По поводу абсолютной пользы темплейтов целиком и полностью согласен. А как сразу правильно писать ? Если конструкция работает так, как задумывал разработчик и при этом такая конструкция не не противоречит языку - то почему бы и нет ? В любом варианте без "прибития гвоздями" синтезатор разложит так, как ему удобнее, главное, чтобы выполнялось поведение задуманной схемы. Кто-то пишет сброс через else, а кто-то пишет отдельным if в конце процесса. Оба варианта синтаксически правильны. Я, например предпочитаю последнее. Но если я буду работать в команде, где так делать нельзя - то буду писать через else. Вопрос привычки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 5 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 7 hours ago, nameless said: Большое спасибо всем откликнувшимся! Я осознаю, что являюсь заложником мощной традиции процедурного программирования. Однако налицо ограничения синтезатора. Отсюда другой вопрос: есть ли альтернатива ISE для работы со "старыми" приборами? Синопсис в 199х лохматом году сделал behavior compiler, который понимает процедурные описания любой сложности с тех пор это является нормой, если кто-то описывает триггера или glue-логику, то он может писать по процессу на триггер, а если кто-то описывает вычислительные ускорители, ДСП-ядра и подобные сложные объекты, то естественно, что кодинг стайл из 80-х для этого не годится ну и еще - если начинаете - возьмите Verilog / SV - более толковый язык, по крайней мере в конфе будете ответы по делу получать, а не общие рассуждения :) -------- по первому вопросу - скорее всего нужна дополнительная защелка, чтобы массив замапировался в память. такие большие элементы как память, ДСП блоки и т.д. нужно либо описывать точно как написано в документе на ПЛИС либо вообще вставлять в виде инстанса, то есть как оно есть в железе. это очень платформозависимо (для памятей есть общие свойства, но тем не менее). если код будет платформонезависимым, то маст ду :) ISE для старых семейств, вариантов нет, но возьмите к нему синтезатор Synplify или Precision - синтезатор будет разбирать код (он это делает лучше) а в ISE будет уже даваться технологический нетлист, который он будет мапировать на камень Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 26 сентября, 2019 Опубликовано 26 сентября, 2019 · Жалоба 21 hours ago, Flip-fl0p said: А как сразу правильно писать ? Если конструкция работает так, как задумывал разработчик и при этом такая конструкция не не противоречит языку - то почему бы и нет ? В любом варианте без "прибития гвоздями" синтезатор разложит так, как ему удобнее, главное, чтобы выполнялось поведение задуманной схемы. Кто-то пишет сброс через else, а кто-то пишет отдельным if в конце процесса. Оба варианта синтаксически правильны. Я, например предпочитаю последнее. Но если я буду работать в команде, где так делать нельзя - то буду писать через else. Вопрос привычки. 1 Как писать правильно? Например, посмотреть в темплейты. Вопрос тут не в привычках описания, а в том, что одно описание сразу однозначно расставляет приритеты между reset и CE, а второе этот вопрос отдаёт на откуп создателям синтезатора. ИМХО первый вариант надёжнее, а поэтому правильный. А вообще практика писать конструкции типа if-elseif-elseif-endif пошла у меня от борьбы с латчами, которые по неопытности плодил иногда в случаях множественных вложенных if-endif. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KeisN13 6 9 октября, 2019 Опубликовано 9 октября, 2019 (изменено) · Жалоба On 9/23/2019 at 11:26 AM, nameless said: type ac_array is array (0 to (slide_len - 1)) of std_logic_vector(9 downto 0); signal A_ac_buff : ac_array; attribute ram_style of A_ac_buff : signal is "bram"; --------------------------------- COMPONENT SR1024 PORT ( d : IN STD_LOGIC; clk : IN STD_LOGIC; ce : IN STD_LOGIC; q : OUT STD_LOGIC );END COMPONENT; ----------------------------------- begin SR1024_0 : SR1024 PORT MAP (d => sr1k_0_in, clk => clk50, ce => sr1k_0_en, q => sr1k_0_out); SR1024_1 : SR1024 PORT MAP (d => sr1k_1_in, clk => clk50, ce => sr1k_1_en, q => sr1k_1_out); ----------------------------------- process(clk50) begin if rising_edge(clk50) then if(...) then sampl_cntr <= 0; AQ1_cntr <= 0; AQ2_cntr <= 0; SHIFT_cntr <= 0; nestd_SH_cntr <= 0; nestd_SH2_cntr <= 0; end if if(sampl_cntr /= sampl) then A_buff(sampl_cntr) <= DA; sampl_cntr <= sampl_cntr + 1; elsif((sampl_cntr=sampl) AND (SHIFT_cntr /= slide_len)) then if(nestd_SH_cntr /= slide_len) then if((sr1k_0_out xor sr1k_1_out) = '1') then ACC0 <= ACC0 + 1; end if; nestd_SH_cntr <= nestd_SH_cntr + 1; elsif((nestd_SH_cntr = slide_len) AND (nestd_SH2_cntr /= 1)) then -- здесь +1 такт для дополнительного сдвига (не описано) buff_10bit_std <= conv_std_logic_vector(ACC0,16)(11 downto 2); nestd_SH2_cntr <= nestd_SH2_cntr + 1; elsif((nestd_SH_cntr = slide_len) AND (nestd_SH2_cntr = 1)) then nestd_SH_cntr <= 0; nestd_SH2_cntr <= 0; ACC0 <= 0; SHIFT_cntr <= SHIFT_cntr + 1; end if; A_ac_buff(SHIFT_cntr) <= buff_10bit_std; --conv_std_logic_vector(SHIFT_cntr,16)(9 downto 0);-- ВОТ ЗДЕСЬ!!!!!!!!!!!!!!!!!!!!!!!!!!!! elsif(...)then divider <= divider + 1; if(...) then if(...) then Tx_data_int <= A_ac_buff(...); end if; end if; end if; end if; end process; Прошу прощения за длинные имена. Почему синтезатор "внешний" счетчик (SHIFT_cntr) писать в память A_ac_buff() позволяет а buff_10bit_std - нет? Не позволяет - это значит синтезирует бесконечно. sr1k_0_out и sr1k_1_out - выходы сдвиговых регистров. Длина сдвиговых регистров не влияет на собираемость проекта. Может быть что-то не так с моим сдвиговым? library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity SR1024 is -------------------------------------------------------------------------- generic ( n : integer := 1024 ); port ( d : in std_logic; clk : in std_logic; ce : in std_logic; q : out std_logic); end SR1024; architecture Behavioral of SR1024 is signal tmp: std_logic_vector(n-1 downto 0) := (Others => '0'); begin process (clk) begin if (clk'event and clk = '1') then if (ce = '1') then tmp(0) <= d; for idx in 1 to n-1 loop tmp(idx) <= tmp(idx-1); end loop; end if; end if; end process; q <= tmp(n-1); end Behavioral; Непонятно почему до сих пор не прочитаны основы проектирования на VHDL и шаблоны описания конкретных элементов от вендора. UG901 если это Xilinx Else всегда должен быть, никогда не останавливай код на else if или if. Изменено 9 октября, 2019 пользователем KeisN13 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 9 октября, 2019 Опубликовано 9 октября, 2019 · Жалоба 13 minutes ago, KeisN13 said: Else всегда должен быть, никогда не останавливай код на else if или if. очень спорное утверждение, особенно для процессов описания регистровой логики(а у ТС именно регистровая логика). On 9/26/2019 at 4:12 PM, Bad0512 said: 1 Как писать правильно? Например, посмотреть в темплейты. Вопрос тут не в привычках описания, а в том, что одно описание сразу однозначно расставляет приритеты между reset и CE, а второе этот вопрос отдаёт на откуп создателям синтезатора. ИМХО первый вариант надёжнее, а поэтому правильный. Правильны оба описания, в том числе с точки зрения стандарта VHDL и было там со времен царя гороха. В V/SV тоже есть много подобных описаний, когда логика пишется похожим образом. ТС. вы бы код весь выложили, тогда проблема решилась бы намного быстрее) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 9 октября, 2019 Опубликовано 9 октября, 2019 · Жалоба 37 minutes ago, des00 said: Правильны оба описания, в том числе с точки зрения стандарта VHDL и было там со времен царя гороха. В V/SV тоже есть много подобных описаний, когда логика пишется похожим образом. По поводу соответствия стандартам целиком и полностью согласен. Но мы же понимаем, что не всякая синтаксически верная конструкция может быть синтезирована (или ,например, однозначно трактуема) синтезатором. В данном конкретном случае речь идёт именно о синтезируемом подмножестве. И вопрос именно был не "соответствует - не соответствует?", а "правильно - неправильно?". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 9 октября, 2019 Опубликовано 9 октября, 2019 · Жалоба 9 минут назад, Bad0512 сказал: По поводу соответствия стандартам целиком и полностью согласен. Но мы же понимаем, что не всякая синтаксически верная конструкция может быть синтезирована (или ,например, однозначно трактуема) синтезатором. В данном конкретном случае речь идёт именно о синтезируемом подмножестве. И вопрос именно был не "соответствует - не соответствует?", а "правильно - неправильно?". В данном конкретном случае у нас нет никакой разницы: писать ветку else или же нет. Quartus и Vivado нормально такие конструкции раскладывают, проблем выявлено не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 9 октября, 2019 Опубликовано 9 октября, 2019 · Жалоба 1 hour ago, Bad0512 said: В данном конкретном случае речь идёт именно о синтезируемом подмножестве. И вопрос именно был не "соответствует - не соответствует?", а "правильно - неправильно?". оба варианта правильные и поддерживаются синтезаторами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться