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

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

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


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

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

 

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

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

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


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

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

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

 

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

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


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

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

BW_IN * 2 - RND_PROD_BITS

если

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

 

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

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


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

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

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

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


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

2 Krys

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

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


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

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

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


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

Получается нельзя заранее рассчитать значение параметра по умолчанию?

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

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


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

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

 

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

 

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

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


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

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

 

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

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

 

 

 

 

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


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

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

 

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

 

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

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

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


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

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

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


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

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

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

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


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

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

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

 

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

 

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

 

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

 

 

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

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

 

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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