Unicorn 0 8 августа, 2006 Опубликовано 8 августа, 2006 · Жалоба Лазая по буржуйским формумам, посвященным VHDL, натолкнулся на длинный тред под сабжем std_logic_arith vs numeric_std. Там народ спорил об осбоенностях типов signed, unsigned и std_logic_vector. Меня этот спор тоже навел на несколько вопросов общего характера. 1. А почему, собственно, и, главное зачем, эти типы в принципе существуют вместе, если и то и другое array of std_logic? 2. Почему std_logic_arith более употребим, чем numeric_std, если над signed и unsigned определено больше математических операций, чем над std_logic_vector? Потом я интереса ради посмотрел библиотеки Альтеры и обнаружил интересную деталь. Как описан альтеровский делитель lpm_divide? Операнды типа std_logic_vector последовательно преобразуются в signed или unsigned в зависимости от того, знаковое деление или беззнаковое. Затем они преобразуются в integer, делятся, после чего делается все в обратном порядке. Вопрос - нафига такое хитрое двойное преобразование типов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 9 августа, 2006 Опубликовано 9 августа, 2006 (изменено) · Жалоба Новичок пишется через "о". Лазая побуржуйским формумам, посвященным VHDL, натолкнулся на длинный тред подсабжем std_logic_arith vs numeric_std. Там народ спорил об осбоенностях типов signed, unsigned и std_logic_vector. Меня этот спор тоже навел на несколько вопросов общего характера. 1. А почему, собственно, и, главное зачем, эти типы в принципе существуют вместе, если и то и другое array of std_logic? std_logic_vector --- это просто контейнер. В нем может быть все, что угодно. signed и unsigned ясно дают понять, кто есть ху. Советую почитать про перегрузку (overloading) функций в VHDL. 2. Почему std_logic_arith более употребим, чем numeric_std, если над signed и unsigned определено больше математических операций, чем над std_logic_vector? Потому что std_logic_arith появился раньше, чем numeric_std. К тому же, последний --- часть стандарта IEEE1076.3. С появлением numeric_std надобность в std_logic_arith полностью отпала. Потом я интереса ради посмотрел библиотеки Альтеры и обнаружил интересную деталь. Как описан альтеровский делитель lpm_divide? Операнды типа std_logic_vector последовательно преобразуются в signed или unsigned в зависимости от того, знаковое деление или беззнаковое.Затем они преобразуются в integer, делятся, после чего делается все в обратном порядке. Ну провильно. Целое число будет разным в зависимости от того, как проинтерпретировать параметр типа std_logic_vector. Вопрос - нафига такое хитрое двойное преобразование типов? Так это модель. Она же не синтезируется. Чтобы не изобретать велосипед, все сделано с использованием уже готовых функций. Reusable code, таскть. Изменено 9 августа, 2006 пользователем andrew_b Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба Чтобы не плодить темы, напишу в этой. Я новичок в VHDL, поэтому созрел такой вопрос: entity cm_add_m is generic ( BW_IN : natural; -- разрядность SUB : natural; -- если 1, то вычитание, если 0 - то сложение WRAP_PROD_BITS : natural; -- число старших откидываемых битов от внутреннего произведения RND_PROD_BITS : natural; -- число округляемых битов от внутреннего произведения BW_PROD : natural := BW_IN * 2 - RND_PROD_BITS; -- разрядность внутреннего произведения BW_OUT : natural := BW_PROD - WRAP_PROD_BITS; -- разрядность выхода общей части PP_INT : natural -- внутренние пайплайны, между каждыми DSP-блоками ); port ( clk : in std_logic; -- Клок работы модуля -- Входные данные add1, add2 : in std_logic_vector(BW_IN-1 downto 0); mult : in std_logic_vector(BW_IN-1 downto 0); -- Выходные данные p: out std_logic_vector(BW_OUT-1 downto 0) ); end cm_add_m; На блок generic, в частности на строчку BW_PROD : natural := BW_IN * 2 - RND_PROD_BITS; -- разрядность внутреннего произведения ISE ругается так: ERROR:HDLCompiler:37 - "bw_in" cannot be used in this expression. ERROR:HDLCompiler:37 - "bw_prod" cannot be used in this expression. ERROR:HDLCompiler:16 - <bw_in> cannot be used within its own interface list. Please verify that you don't use this object for the definition of other interface components. ERROR:HDLCompiler:16 - <wrap_prod_bits> cannot be used within its own interface list. Please verify that you don't use this object for the definition of other interface components. ERROR:HDLCompiler:16 - <rnd_prod_bits> cannot be used within its own interface list. Please verify that you don't use this object for the definition of other interface components. ERROR:HDLCompiler:16 - <bw_prod> cannot be used within its own interface list. Please verify that you don't use this object for the definition of other interface components. Active-HDL так: # Error: COMP96_0300: Cannot reference "BW_IN" until the interface list is complete. Я раньше на Верилоге писал, с такими конструкциями не было проблем. Получается нельзя заранее рассчитать значение параметра по умолчанию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба как вычислить BW_IN * 2 - RND_PROD_BITS если ни BW_IN ни RND_PROD_BITS не имеют изначально никаких значений? когда на верилоге пишите через parameter, то вы изначально ему уже значение присваиваете, потому и можно рассчитать начальное значение оп умолчанию... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба да я пробовал и задавать значения по умолчанию - не помогает. На самом деле если я их не задал - я их обязан задать в явном виде при инстантировании компонента. А если уж и тогда не задал - то пусть ругается, но на то, что я их не задал в явном виде. Но я их задавал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба 2 Krys сделайте BW_PROD не параметром а константой например, внури модуля. Ведь по сути, у вас некоторый аналог "localparam". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба тогда я не смогу параметризировать разрядность выхода p, который зависит от BW_OUT, который зависит от BW_PROD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба Получается нельзя заранее рассчитать значение параметра по умолчанию? RTFM !!! IEEE Std 1076, 2000 Edition -> 4. Declarations -> 4.3 Objects -> 4.3.2 Interface declarations -> 4.3.2.1 Interface lists -> An interface list contains the declarations of the interface objects required by a subprogram, a component, a design entity, or a block statement. interface_list ::= interface_element { ; interface_element } interface_element ::= interface_declaration A generic interface list consists entirely of interface constant declarations. A port interface list consists entirely of interface signal declarations. A parameter interface list may contain interface constant declarations, interface signal declarations, interface variable declarations, interface file declarations, or any combination thereof. A name that denotes an interface object may not appear in any interface declaration within the interface list containing the denoted interface object except to declare this objec и ниже пример entity E is generic (G1: INTEGER; G2: INTEGER := G1); -- Illegal port (P1: STRING; P2: STRING(P1'RANGE)); -- Illegal procedure X (Y1, Y2: INTEGER; Y3: INTEGER range Y1 to Y2); -- Illegal end E; ЗЫ. в мануале всего 299 страниц, не то что ~1500 в SV. рекомендую изучить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба спасибо за помощь, всё сразу стало понятно. Всё объяснили наглядно, на пальцах, как раз для начинающих. И главное решение проблемы сразу указано. Щас побыстрому 299 страниц прочту (а главное вникну! (а потом ещё и всё и сразу запомню на всю жизнь с первого прочтения)), работа подождёт месяц-другой... ... а если без шуток, то русский читает инструкцию, когда уже совсем ничего не получается. Иначе некогда, с работы уволят. И это я думаю обосновано. Учиться надо было в вузе, и на всю жизнь. А во время работы - поздно, работодатель хочет только результат и бесится, когда ты ещё и самообучиться пытаешься за его счёт. Я вообще даже думаю написать какую-нибудь инструкцию типа Переход с Verilog на VHDL за 30 минуту ))) Потому что из всей этой макулатуры в 299 страниц реально нужно всего 10 шаблонов, а дальше копипастить, почти не разбираясь. Утрированно конечно, но мысль такая. Особенно руки опускаются разбираться досконально, до мелочей, в VHDL, на котором уже всем продвинутым инженерным сообществом поставлен крест... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба по моему вы только что поставили крест на своей карьере. Учиться надо было в вузе, и на всю жизнь. когда я заканчивал вуз, технологии которыми я пользуюсь сейчас не существовали. И что я должен по такой нелепой причине проиграть современным выпускникам и уступить им рабочее место? ЧУШЬ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба спасибо за помощь, всё сразу стало понятно. Всё объяснили наглядно, на пальцах, как раз для начинающих. И главное решение проблемы сразу указано. Щас побыстрому 299 страниц прочту (а главное вникну! (а потом ещё и всё и сразу запомню на всю жизнь с первого прочтения)), работа подождёт месяц-другой... ... а если без шуток, то русский читает инструкцию, когда уже совсем ничего не получается. Иначе некогда, с работы уволят. И это я думаю обосновано. Учиться надо было в вузе, и на всю жизнь. А во время работы - поздно, работодатель хочет только результат и бесится, когда ты ещё и самообучиться пытаешься за его счёт. Я вообще даже думаю написать какую-нибудь инструкцию типа Переход с Verilog на VHDL за 30 минуту ))) Потому что из всей этой макулатуры в 299 страниц реально нужно всего 10 шаблонов, а дальше копипастить, почти не разбираясь. Утрированно конечно, но мысль такая. Особенно руки опускаются разбираться досконально, до мелочей, в VHDL, на котором уже всем продвинутым инженерным сообществом поставлен крест... изречения - весьма оригинальные.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба Если время-деньги, то сделайте все на хорошо знакомом верилоге, ведь от языка описания результат синтеза мало зависит. А 299 страниц прочитайте в свободное время, например в тесном заведении, где обычно читают такие вещи :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 7 октября, 2014 Опубликовано 7 октября, 2014 · Жалоба Действительно, дженерики не могут ссылаться друг на друга. В данном случае я делаю примерно так: BW_PROD : integer := 0; -- разрядность внутреннего произведения ... constant BW_PROD_REDEF:natural := iif(BW_PROD /= 0, BW_PROD, BW_IN * 2 - RND_PROD_BITS); iif(inline if) - функция, которую я сам определил в своём стандартном package для подобных случаев, так как оператора "? :" в VHDL нет, чтобы затруднить вражеским шпионам чтение кода, зато есть перегрузка функций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 8 октября, 2014 Опубликовано 8 октября, 2014 · Жалоба Спасибо, хитро Вы придумали. Но, как я понимаю, если я объявлю константу, я не смогу задать через неё ширину входного или выходного порта? Мне то надо параметризировать ширину порта, которая бы зависела от совокупности других дженериков. Ладно, невозможность ссылки дженериков друг на друга будет ещё одним гвоздём в крышке гроба VHDL... (я постепенно их коплю, чтобы потом вбить). по моему вы только что поставили крест на своей карьере.Меня уволят за такие изречения? когда я заканчивал вуз, технологии которыми я пользуюсь сейчас не существовали.Вы самообучались на деньги работодателя на рабочем месте, почти наверняка. А работодатель наверняка в явную на это не соглашался ))) И что я должен по такой нелепой причине проиграть современным выпускникам и уступить им рабочее место? ЧУШЬ!Рано или поздно это произойдёт. Нас запишут в старпёры, как и мы когда-то старую гвардию записывали... изречения - весьма оригинальные.... Ну вообще-то это был по большей части сарказм. Конечно, в каждой шутке... Но всё равно. Я же утрировал, на самом деле я бы хотел, чтобы это было не так, но увы это почти так и есть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 8 октября, 2014 Опубликовано 8 октября, 2014 · Жалоба Спасибо, хитро Вы придумали. Но, как я понимаю, если я объявлю константу, я не смогу задать через неё ширину входного или выходного порта? Мне то надо параметризировать ширину порта, которая бы зависела от совокупности других дженериков. Ладно, невозможность ссылки дженериков друг на друга будет ещё одним гвоздём в крышке гроба VHDL... (я постепенно их коплю, чтобы потом вбить). Если дженерик соотвествует ширине какого-нибудь порта, то такой дженерик вообще не нужен, достаточно сделать этот порт unconstrained, и узнавать его фактическую размерность через стандартные атрибуты. В этом VHDL даже удобнее Верилога. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться