Jump to content

    

Странные вопросы по VHDL

Лазая по буржуйским формумам, посвященным 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, делятся, после чего делается все в обратном порядке. Вопрос - нафига такое хитрое двойное преобразование типов?

Share this post


Link to post
Share on other sites

Новичок пишется через "о".

 

Лазая побуржуйским формумам, посвященным 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, таскть.

Edited by andrew_b

Share this post


Link to post
Share on other sites

Чтобы не плодить темы, напишу в этой.

Я новичок в 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.

 

Я раньше на Верилоге писал, с такими конструкциями не было проблем. Получается нельзя заранее рассчитать значение параметра по умолчанию?

Share this post


Link to post
Share on other sites

как вычислить

BW_IN * 2 - RND_PROD_BITS

если

ни BW_IN ни RND_PROD_BITS не имеют изначально никаких значений?

 

когда на верилоге пишите через parameter, то вы изначально ему уже значение присваиваете, потому и можно рассчитать начальное значение оп умолчанию...

Share this post


Link to post
Share on other sites

да я пробовал и задавать значения по умолчанию - не помогает.

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

Share this post


Link to post
Share on other sites

2 Krys

сделайте BW_PROD не параметром а константой например, внури модуля. Ведь по сути, у вас некоторый аналог "localparam".

Share this post


Link to post
Share on other sites

тогда я не смогу параметризировать разрядность выхода p, который зависит от BW_OUT, который зависит от BW_PROD

Share this post


Link to post
Share on other sites
Получается нельзя заранее рассчитать значение параметра по умолчанию?

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. рекомендую изучить

Share this post


Link to post
Share on other sites

спасибо за помощь, всё сразу стало понятно. Всё объяснили наглядно, на пальцах, как раз для начинающих. И главное решение проблемы сразу указано. Щас побыстрому 299 страниц прочту (а главное вникну! (а потом ещё и всё и сразу запомню на всю жизнь с первого прочтения)), работа подождёт месяц-другой...

 

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

 

Я вообще даже думаю написать какую-нибудь инструкцию типа Переход с Verilog на VHDL за 30 минуту ))) Потому что из всей этой макулатуры в 299 страниц реально нужно всего 10 шаблонов, а дальше копипастить, почти не разбираясь. Утрированно конечно, но мысль такая. Особенно руки опускаются разбираться досконально, до мелочей, в VHDL, на котором уже всем продвинутым инженерным сообществом поставлен крест...

Share this post


Link to post
Share on other sites

по моему вы только что поставили крест на своей карьере.

 

Учиться надо было в вузе, и на всю жизнь.

когда я заканчивал вуз, технологии которыми я пользуюсь сейчас не существовали. И что я должен по такой нелепой причине проиграть современным выпускникам и уступить им рабочее место? ЧУШЬ!

 

 

 

 

Share this post


Link to post
Share on other sites
спасибо за помощь, всё сразу стало понятно. Всё объяснили наглядно, на пальцах, как раз для начинающих. И главное решение проблемы сразу указано. Щас побыстрому 299 страниц прочту (а главное вникну! (а потом ещё и всё и сразу запомню на всю жизнь с первого прочтения)), работа подождёт месяц-другой...

 

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

 

Я вообще даже думаю написать какую-нибудь инструкцию типа Переход с Verilog на VHDL за 30 минуту ))) Потому что из всей этой макулатуры в 299 страниц реально нужно всего 10 шаблонов, а дальше копипастить, почти не разбираясь. Утрированно конечно, но мысль такая. Особенно руки опускаются разбираться досконально, до мелочей, в VHDL, на котором уже всем продвинутым инженерным сообществом поставлен крест...

изречения - весьма оригинальные.... :wacko:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Действительно, дженерики не могут ссылаться друг на друга. В данном случае я делаю примерно так:

 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 нет, чтобы затруднить вражеским шпионам чтение кода, зато есть перегрузка функций.

Share this post


Link to post
Share on other sites

Спасибо, хитро Вы придумали. Но, как я понимаю, если я объявлю константу, я не смогу задать через неё ширину входного или выходного порта? Мне то надо параметризировать ширину порта, которая бы зависела от совокупности других дженериков.

Ладно, невозможность ссылки дженериков друг на друга будет ещё одним гвоздём в крышке гроба VHDL... (я постепенно их коплю, чтобы потом вбить).

 

по моему вы только что поставили крест на своей карьере.
Меня уволят за такие изречения?

 

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

 

И что я должен по такой нелепой причине проиграть современным выпускникам и уступить им рабочее место? ЧУШЬ!
Рано или поздно это произойдёт. Нас запишут в старпёры, как и мы когда-то старую гвардию записывали...

 

 

изречения - весьма оригинальные.... :wacko:
Ну вообще-то это был по большей части сарказм. Конечно, в каждой шутке...

Но всё равно. Я же утрировал, на самом деле я бы хотел, чтобы это было не так, но увы это почти так и есть...

 

Share this post


Link to post
Share on other sites
Спасибо, хитро Вы придумали. Но, как я понимаю, если я объявлю константу, я не смогу задать через неё ширину входного или выходного порта? Мне то надо параметризировать ширину порта, которая бы зависела от совокупности других дженериков.

Ладно, невозможность ссылки дженериков друг на друга будет ещё одним гвоздём в крышке гроба VHDL... (я постепенно их коплю, чтобы потом вбить).

Если дженерик соотвествует ширине какого-нибудь порта, то такой дженерик вообще не нужен, достаточно сделать этот порт unconstrained, и узнавать его фактическую размерность через стандартные атрибуты. В этом VHDL даже удобнее Верилога.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this