Jump to content
    

нужна помощь VHDL

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

 

Короче не синтезирует такое компилятор и все. Глобальные переменные можно использовать только при моделировании. Могу еще процитировать одну христоматию по ВХДЛ:

 

В языке не предусмотрены механизмы синхронизации передачи глобальных переменных. Поэтому их применение ограничено, например, рассылкой общего начального значения, работой с файлами.

 

Вообще они очень легко заменяются на сигналы, лично я еще никогда их не использовал, тем более для служебного счетчика :)

Share this post


Link to post
Share on other sites

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

У Вас несинтезируемый код: не надо использовать shared variable. Используйте сигналы, причем не надо присваивать ему одновременно значения в разных процесах, иначе получите сообщение об ошибке (Вы сейчас так делаете для переменной a ). Что касается отличия переменной от сигнала - то посмотрите в любой литературе по VHDL :)

 

Что значит несинтезируемый код и почему не надо использовать Shared value? Мне кажется что это очень удобно использовать для какого-нибудь служебного счетчика например.

 

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

Share this post


Link to post
Share on other sites

Вы наверное использовали переменные внутри процесса(просто variable, объявленный внутри процесса ). А тут речь идет о глобальных перемнных, используя их врядли можно КА построить. А насчет уменьшения скорости в 10 раз - действительно странно :huh: Честно говоря я сам переменные использую очень редко и с таким никогда не сталкивался.

Share this post


Link to post
Share on other sites

Вы наверное использовали переменные внутри процесса(просто variable, объявленный внутри процесса ). А тут речь идет о глобальных перемнных, используя их врядли можно КА построить. А насчет уменьшения скорости в 10 раз - действительно странно :huh: Честно говоря я сам переменные использую очень редко и с таким никогда не сталкивался.

 

 

да внутри процесса, но это я о переменных в целом

 

я когда с переменными повозился, решил: "значит правила игры такие, все пишем на битовых векторах". Там автомат тупой, переводил 32 параллельных бита в 2 последовательные посылки по 16 бит с паузами и клоковыми сигналами. Вот когда состояния считал логик_вектор, скорость была типа 100 МГц, а когда я для удобства понимания воткнул переменную типа инт вместо счетчика состояний(он просто декрементируется и сравнивается), стало типа 10 МГц. Я в этом деле новичок, и не очень понял, почему критический путь так удлинился, но время, если честно разбираться нет, потому отметил для себя «переменные не трогаем». Они еще и ошибки время от времени вызывают, синтаксис их применения я еще не чувствую, перекомпиливать много приходилось, а это время... теперь все пишу на логик векторах и не жужу, вот, может я и не прав.

 

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

Share this post


Link to post
Share on other sites

У Вас несинтезируемый код: не надо использовать shared variable. Используйте сигналы, причем не надо присваивать ему одновременно значения в разных процесах, иначе получите сообщение об ошибке (Вы сейчас так делаете для переменной a ). Что касается отличия переменной от сигнала - то посмотрите в любой литературе по VHDL :)

 

 

Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются.

 

Насчет использовать сигналы ? опишите память ВХДЛ через сигналы хотя бы на пару мегабайт и по симулите ее в проекте, активно выполняя транзакйии записи/чтения в нее (пс. при этом посмотрите сколько у вас памяти симулятор сожрет и как быстро это будет работаь).

 

Переменные это благо, но пользовать их нужно с умом.

Share this post


Link to post
Share on other sites

Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются.

 

Нельзя ли поподробнее? Чем синтезируются? В каких конструкциях? Поддерживает ли при этом синтезатор protected типы? :smile3009:

Share this post


Link to post
Share on other sites

Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются.

 

Цитата из Бибило: "...в некоторых случаях использование общей переменной допускается, например, если значенение ей присваивается лишь в одном месте".

Share this post


Link to post
Share on other sites

2 disel и 2 Oldring

 

Нельзя ли поподробнее? Чем синтезируются? В каких конструкциях? Поддерживает ли при этом синтезатор protected типы?

 

Насчет shared variable собирал симплифаем 8х, описывал одно/двухпортовую одно/двухклоковую память все собираеться хорошо (странно что в доке на синтезатор сие не описанно).

 

про protected еще не исследовал, некогда :(

 

Насчет простых variable постоянно пользуюсь ими для более наглядного описания логики, все собираеться нормально, просто нужно помнить в чем разница между signal и variable.

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

 

Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются.

Цитата из Бибило: "...в некоторых случаях использование общей переменной допускается, например, если значенение ей присваивается лишь в одном месте".

 

Да мне до цитат как то глубоко по.....у , просто задался однажды целью уменьшить время симуляции проекта в разы, опираясь на профайлер.

переписал всю память на shared variable и вуаля, время симуляции сильно уменьшилось, симулятор (алдек) перестал тормозить. Потом решил собрать что получилось в симплифае и вуаля все оказываеться работает, ну а дальше понеслось мини исследование :)

 

Тут коллега подсказывает что у него и в XST (ISE 7.1) собралась блочная двухклокова память описанная через shared variable.

 

Так что Бибило и юзер гайды мне друг, но истина дороже :biggrin:

Share this post


Link to post
Share on other sites

про protected еще не исследовал, некогда :(

 

BTW VHDL LRM 4.3.1.3: The base type of the subtype indication of a shared variable declaration must be a protected type. Так что, у Вас было не совсем VHDL и не совсем shared variables, а некий хак от некоторых синтезаторови симуляторов :biggrin:

Share this post


Link to post
Share on other sites

Да мне до цитат как то глубоко по.....у , просто задался однажды целью уменьшить время симуляции проекта в разы, опираясь на профайлер.

переписал всю память на shared variable и вуаля, время симуляции сильно уменьшилось, симулятор (алдек) перестал тормозить. Потом решил собрать что получилось в симплифае и вуаля все оказываеться работает, ну а дальше понеслось мини исследование :)

Ну зачем же так грубо, причин то вроде бы не было. А на.. и по.. это не аргумент. В описанном выше коде shared variable использовались одновременно в двух процессах, причем в обоих процессах переменной присваивалось значение. О чем я и написал. И ishergin тоже совершенно правильно это заметил.

Share this post


Link to post
Share on other sites

про protected еще не исследовал, некогда :(

 

BTW VHDL LRM 4.3.1.3: The base type of the subtype indication of a shared variable declaration must be a protected type. Так что, у Вас было не совсем VHDL и не совсем shared variables, а некий хак от некоторых синтезаторови симуляторов :biggrin:

 

architecture rtl of dp_ram is

type mem_type is array(2**ADDR_WIDTH-1 downto 0) of std_logic_vector(DATA_WIDTH-1 downto 0);
shared variable mem :mem_type;

begin

  -- port a
  process(clk_a)
  begin
    if rising_edge(clk_a) then
      if en_a = '1' then
        if we_a = '1' then
          mem(to_integer(unsigned(addr_a))) := din_a;
        end if;
      end if;
    end if;
  end process;
  
  -- port b
  process(clk_b)
  begin
    if rising_edge(clk_b) then
      if en_b = '1' then
        dout_b <= mem(to_integer(unsigned(addr_b)));
      end if;
    end if;
  end process;

end architecture rtl;

 

---------------------------------------

Resource Usage Report for dp_ram

 

Mapping to part: xc4vfx12sf363-12

Cell usage:

GND 1 use

RAMB16 2 uses

VCC 1 use

 

I/O primitives: 119

IBUF 55 uses

OBUF 64 uses

 

BUFGP 2 uses

 

I/O Register bits: 0

Register bits not including I/Os: 0 (0%)

 

RAM/ROM usage summary

Block Rams : 2 of 36 (5%)

 

 

Global Clock Buffers: 2 of 32 (6%)

 

 

Mapping Summary:

Total LUTs: 0 (0%)

 

Mapper successful!

Process took 0h:00m:01s realtime, 0h:00m:01s cputime

# Fri Jun 16 14:51:43 2006

 

 

Ну зачем же так грубо, причин то вроде бы не было.

 

ну если для вас слово поБАРАБАНу являеться грубым (слово барабан я решил не писать), то извините учту на будующее.

 

А на.. и по.. это не аргумент.

 

глупый вопрос аргумент чего ? Я предпочитаю доверять, но проверять. Если кто-то, где-то пишет что-то,

(например Бибило в книгах о языке), то я сначала задумаюсь а так ли это и откуда следует сие утверждение. Слепо верить и этому следовать это глупо. (во всем сомневайся - один из принципов моего самообучения)

 

В описанном выше коде shared variable использовались одновременно в двух процессах, причем в обоих процессах переменной присваивалось значение. О чем я и написал. И ishergin тоже совершенно правильно это заметил.

 

Вы наверное не увидели или не так поняли мою фразу

 

Переменные это благо, но пользовать их нужно с умом.

 

у меня нет желания расписывать все, что я понимаю под фразой "пользовать их нужно с умом"

Share this post


Link to post
Share on other sites

 type mem_type is array(2**ADDR_WIDTH-1 downto 0) of std_logic_vector(DATA_WIDTH-1 downto 0);
shared variable mem :mem_type;

 

Так я в курсе способностей XST. Но именно это и не есть VHDL, на что я и хочу обратить внимание. А пользовать нестандартные расширения или нет - это личное дело каждого руководителя проекта. В случае чего нарываться тоже ему. :)

Share this post


Link to post
Share on other sites

глупый вопрос аргумент чего ?

Только не чего, а где. Аргумента в споре.

 

Я предпочитаю доверять, но проверять. Если кто-то, где-то пишет что-то,

(например Бибило в книгах о языке), то я сначала задумаюсь а так ли это и откуда следует сие утверждение. Слепо верить и этому следовать это глупо. (во всем сомневайся - один из принципов моего самообучения)

А что, я где-то утверждал обратное?

 

В принципе, и предмета спора нет.

Share this post


Link to post
Share on other sites

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

 

Покурив стандарт, соглашусь + еще похоже альдек не понимает protected типы :(

Но согласитесь что никто не говорил что симулять и собирать проект нужно с одними и теми же настройками. Если проект кросс-платформеный, то используем бехавор память на переменных (кстати на просто variable требования protected не распространяються на ней можно налабать однопортовку или синхронную двухпортовку) и быстро симуляемся.(особенно заметно когда совокупный объем симуляемой памяти достигает >= 30-50 килобоайт).

Для рабочего дебага также bahavior модель пойдет, а вот когда нужно собирать что то итоговое подсовываем другое тело под объект, а дальше тайминг симуляция (если нужно, но тормоза еще те :()

 

PS. Класно в ВХДЛ даже аналоги сишных класов есть, можно не плохо симуляться(найдти бы только такой

симулятор, надо квесту попробывать). Хотя в эру систем си как то это немного запоздало.

Share this post


Link to post
Share on other sites

У Вас несинтезируемый код: не надо использовать shared variable. Используйте сигналы, причем не надо присваивать ему одновременно значения в разных процесах, иначе получите сообщение об ошибке (Вы сейчас так делаете для переменной a ). Что касается отличия переменной от сигнала - то посмотрите в любой литературе по VHDL :)

 

 

Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются.

 

Насчет использовать сигналы ? опишите память ВХДЛ через сигналы хотя бы на пару мегабайт и по симулите ее в проекте, активно выполняя транзакйии записи/чтения в нее (пс. при этом посмотрите сколько у вас памяти симулятор сожрет и как быстро это будет работаь).

 

Переменные это благо, но пользовать их нужно с умом.

 

Чтоб окончательно все прояснить (или запутать :blink: )

 

Про несинтезируемость конструкции shared variable я узнал из Стешенко "ПЛИС фирмы Altera..." тама прямо так и написано : неподдерживаемое средствами синтеза конструкции : зарезервированное слово shared :cheers:

 

Скачать с ФТП нормальный последний стандарт VHDL на англицком я пока не могу, так что приходтится довольствоваться тем, что есть :(

 

PS. Это хорошо что shared синтезируются: с ними иногда проще жить :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...