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

Вопрос начинающего (VHDL)

19 минут назад, Bad0512 сказал:

Что вы понимаете под "правильно"? В коде есть неоднозначность, которая позволяет синтезатору по своему разумению расставить приритеты между сигналами reset и count_enable. Думаете он знает как "правильно" с вашей точки зрения? Что будет в случае если reset = 1 и count_enable = 1 ? Какое событие произойдёт и почему?

Стандарт языка не даст синтезатору творить вакханалию. Я сам так всегда пишу, ни разу синтезатор не ошибся

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


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

15 minutes ago, Flip-fl0p said:

Стандарт языка не даст синтезатору творить вакханалию. Я сам так всегда пишу, ни разу синтезатор не ошибся

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

 

З Ы Я допускаю, что разработчики конкретного ситезатора подстелили соломки и трактуют подобные неявные конструкции в пользу наиболее вероятного поведения. Но это относится только к данному синтезатору, и не факт что другой синтезатор будет поступать так же.

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


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

Большое спасибо всем откликнувшимся!

Я осознаю, что являюсь заложником мощной традиции процедурного программирования.

Однако налицо ограничения синтезатора.

Отсюда другой вопрос: есть ли альтернатива ISE для работы со "старыми" приборами?

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


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

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. Хотя это не спасёт ситуацию кардинально. Читать темплейты всё равно придётся.

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


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

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, и точка. От языка это не зависит вообще никак.

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


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

6 minutes ago, SII said:

Но, как по мне, читаемость такой конструкции хуже, и лучше использовать if ... elsif... elsif... else, где неоднозначностей нет в принципе.

А тут уже вылазит проблема не читаемости, а синтеза. Когда у Вас должен быть один триггер и ему на вход сброса заведён выход элемента "И", а в результате синтезируется треггер со сбросом по одному сигналу и выходом через мультиплексор с переключением по второму сигналу (который должен был подаваться на элемент "И"). Отсюда времянка летит, непонятные конструкции вылазят (особенно на шинах под 16-32 бита). За годы проектирования таких приколов навидался, что пришлось "обучится" писать как в даташитах и ансверрекордах, а не как логично или удобочитаемо.

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


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

5 hours ago, Nick_K said:

А Вы попробуйте засинтезировать конструкцию с двумя условиями сброса. Уверен что после синтеза получится некое неожиданное создание и Вы будете "приятно" удивлены полученной конструкцией.

Это возможно для Вас неоднозначность. А для разработчика синтезатора или для инженера всё выгляди вполне логично (если говорить именно про сигнал сброса, а не установки в единицу или инициализации шины в какое-то непонятное значение): сначала мы подключаем комбинационную логику, которая заходит на сигналы CE/D, а потом мы подключаем сброс тригерра. Никакой мистики. Опять же, вот написаны очень правильные слова (об этом я тоже упоминал):

 

1 Зачем мне эта дичь? Пытаться выстрелить себе в ногу и убедиться что не попал ибо от этого меня "спас" разработчик синтезатора? Почему не научиться сразу писать правильно?

2 Зачем вы тут мне рассказываете как устроена ячейка ПЛИС? Вы думаете я этого не знаю? Вопрос ведь не в том "как оно получится" а в том "как писать правильно".

3 По поводу абсолютной пользы темплейтов целиком и полностью согласен.

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


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

7 минут назад, Bad0512 сказал:

1 Зачем мне эта дичь? Пытаться выстрелить себе в ногу и убедиться что не попал ибо от этого меня "спас" разработчик синтезатора? Почему не научиться сразу писать правильно?

2 Зачем вы тут мне рассказываете как устроена ячейка ПЛИС? Вы думаете я этого не знаю? Вопрос ведь не в том "как оно получится" а в том "как писать правильно".

3 По поводу абсолютной пользы темплейтов целиком и полностью согласен.

А как сразу правильно писать ? Если конструкция работает так, как задумывал разработчик и при этом такая конструкция не не противоречит языку - то почему бы и нет ? В любом варианте без "прибития гвоздями" синтезатор разложит так, как ему удобнее, главное, чтобы выполнялось поведение задуманной схемы. Кто-то пишет сброс через else, а кто-то пишет отдельным if в конце процесса. Оба варианта синтаксически правильны. Я, например предпочитаю последнее. Но если я буду работать в команде, где так делать нельзя - то буду писать через else. Вопрос привычки. 

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


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

7 hours ago, nameless said:

Большое спасибо всем откликнувшимся!

Я осознаю, что являюсь заложником мощной традиции процедурного программирования.

Однако налицо ограничения синтезатора.

Отсюда другой вопрос: есть ли альтернатива ISE для работы со "старыми" приборами?

 

Синопсис в 199х лохматом году сделал behavior compiler, который понимает процедурные описания любой сложности

с тех пор это является нормой, если кто-то описывает триггера или glue-логику, то он может писать по процессу на триггер, а если кто-то описывает вычислительные ускорители, ДСП-ядра и подобные сложные объекты, то естественно, что кодинг стайл из 80-х для этого не годится

ну и еще - если начинаете - возьмите Verilog / SV - более толковый язык, по крайней мере в конфе будете ответы по делу получать, а не общие рассуждения :)

--------

по первому вопросу - скорее всего нужна дополнительная защелка, чтобы массив замапировался в память. такие большие элементы как память, ДСП блоки и т.д. нужно либо описывать точно как написано в документе на ПЛИС либо вообще вставлять в виде инстанса, то есть как оно есть в железе. это очень платформозависимо (для памятей есть общие свойства, но тем не менее). если код будет платформонезависимым, то маст ду :)

ISE для старых семейств, вариантов нет, но возьмите к нему синтезатор Synplify или Precision - синтезатор будет разбирать код (он это делает лучше) а в ISE будет уже даваться технологический нетлист, который он будет мапировать на камень

 

 

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


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

21 hours ago, Flip-fl0p said:

А как сразу правильно писать ? Если конструкция работает так, как задумывал разработчик и при этом такая конструкция не не противоречит языку - то почему бы и нет ? В любом варианте без "прибития гвоздями" синтезатор разложит так, как ему удобнее, главное, чтобы выполнялось поведение задуманной схемы. Кто-то пишет сброс через else, а кто-то пишет отдельным if в конце процесса. Оба варианта синтаксически правильны. Я, например предпочитаю последнее. Но если я буду работать в команде, где так делать нельзя - то буду писать через else. Вопрос привычки. 

1 Как писать правильно? Например, посмотреть в темплейты. Вопрос тут не в привычках описания, а в том, что одно описание сразу однозначно расставляет приритеты между reset и CE, а второе этот вопрос отдаёт на откуп создателям синтезатора. ИМХО первый вариант надёжнее, а поэтому правильный.

А вообще практика писать конструкции типа if-elseif-elseif-endif пошла у меня от борьбы с латчами, которые по неопытности плодил иногда в случаях множественных вложенных if-endif.

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


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

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. 

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

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


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

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 тоже есть много подобных описаний, когда логика пишется похожим образом.

ТС. вы бы код весь выложили, тогда проблема решилась бы намного быстрее)

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


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

37 minutes ago, des00 said:

Правильны оба описания, в том числе с точки зрения стандарта VHDL и было там со времен царя гороха. В V/SV тоже есть много подобных описаний, когда логика пишется похожим образом.

По поводу соответствия стандартам целиком и полностью согласен. Но мы же понимаем, что не всякая синтаксически верная конструкция может быть синтезирована (или ,например, однозначно трактуема) синтезатором. В данном конкретном случае речь идёт именно о синтезируемом подмножестве. И вопрос именно был не "соответствует - не соответствует?", а "правильно - неправильно?".

 

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


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

9 минут назад, Bad0512 сказал:

По поводу соответствия стандартам целиком и полностью согласен. Но мы же понимаем, что не всякая синтаксически верная конструкция может быть синтезирована (или ,например, однозначно трактуема) синтезатором. В данном конкретном случае речь идёт именно о синтезируемом подмножестве. И вопрос именно был не "соответствует - не соответствует?", а "правильно - неправильно?".

 

 В данном конкретном случае у нас нет никакой разницы: писать ветку else или же нет. Quartus и Vivado нормально такие конструкции раскладывают, проблем выявлено не было. 

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


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

1 hour ago, Bad0512 said:

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

оба варианта правильные и поддерживаются синтезаторами.

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


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

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

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

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

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

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

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

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

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

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