MurrVK 0 June 15, 2006 Posted June 15, 2006 · Report post Код несентезируемый - это значит, что компилятор(синтезатор, называйте как душе будет угодно) не может поставить в соответствие этой конструкции некий примитив, который будет реально присутствовать на кристалле ПЛИСа. О загнул Короче не синтезирует такое компилятор и все. Глобальные переменные можно использовать только при моделировании. Могу еще процитировать одну христоматию по ВХДЛ: В языке не предусмотрены механизмы синхронизации передачи глобальных переменных. Поэтому их применение ограничено, например, рассылкой общего начального значения, работой с файлами. Вообще они очень легко заменяются на сигналы, лично я еще никогда их не использовал, тем более для служебного счетчика :) Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 June 15, 2006 Posted June 15, 2006 · Report post А зачем Вам пауза, если и так известно скоко бит передается? Задержку легко можно реализовать на конечном автомате. У Вас несинтезируемый код: не надо использовать shared variable. Используйте сигналы, причем не надо присваивать ему одновременно значения в разных процесах, иначе получите сообщение об ошибке (Вы сейчас так делаете для переменной a ). Что касается отличия переменной от сигнала - то посмотрите в любой литературе по VHDL :) Что значит несинтезируемый код и почему не надо использовать Shared value? Мне кажется что это очень удобно использовать для какого-нибудь служебного счетчика например. а у меня применения инта (варибал) для состояния конечного автомата сократило скорость работы схемы в 10 раз. Хотя может я что то не понимаю, но переменные решил не использовать, использую всегда сигналы... Quote Share this post Link to post Share on other sites More sharing options...
MurrVK 0 June 15, 2006 Posted June 15, 2006 · Report post Вы наверное использовали переменные внутри процесса(просто variable, объявленный внутри процесса ). А тут речь идет о глобальных перемнных, используя их врядли можно КА построить. А насчет уменьшения скорости в 10 раз - действительно странно :huh: Честно говоря я сам переменные использую очень редко и с таким никогда не сталкивался. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 June 15, 2006 Posted June 15, 2006 · Report post Вы наверное использовали переменные внутри процесса(просто variable, объявленный внутри процесса ). А тут речь идет о глобальных перемнных, используя их врядли можно КА построить. А насчет уменьшения скорости в 10 раз - действительно странно :huh: Честно говоря я сам переменные использую очень редко и с таким никогда не сталкивался. да внутри процесса, но это я о переменных в целом я когда с переменными повозился, решил: "значит правила игры такие, все пишем на битовых векторах". Там автомат тупой, переводил 32 параллельных бита в 2 последовательные посылки по 16 бит с паузами и клоковыми сигналами. Вот когда состояния считал логик_вектор, скорость была типа 100 МГц, а когда я для удобства понимания воткнул переменную типа инт вместо счетчика состояний(он просто декрементируется и сравнивается), стало типа 10 МГц. Я в этом деле новичок, и не очень понял, почему критический путь так удлинился, но время, если честно разбираться нет, потому отметил для себя «переменные не трогаем». Они еще и ошибки время от времени вызывают, синтаксис их применения я еще не чувствую, перекомпиливать много приходилось, а это время... теперь все пишу на логик векторах и не жужу, вот, может я и не прав. что такое RTL-код кстати, я думал это сеть с картинками из логических примитивов, но как то получаеться что нет... Quote Share this post Link to post Share on other sites More sharing options...
des00 26 June 16, 2006 Posted June 16, 2006 · Report post У Вас несинтезируемый код: не надо использовать shared variable. Используйте сигналы, причем не надо присваивать ему одновременно значения в разных процесах, иначе получите сообщение об ошибке (Вы сейчас так делаете для переменной a ). Что касается отличия переменной от сигнала - то посмотрите в любой литературе по VHDL :) Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются. Насчет использовать сигналы ? опишите память ВХДЛ через сигналы хотя бы на пару мегабайт и по симулите ее в проекте, активно выполняя транзакйии записи/чтения в нее (пс. при этом посмотрите сколько у вас памяти симулятор сожрет и как быстро это будет работаь). Переменные это благо, но пользовать их нужно с умом. Quote Share this post Link to post Share on other sites More sharing options...
Oldring 0 June 16, 2006 Posted June 16, 2006 · Report post Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются. Нельзя ли поподробнее? Чем синтезируются? В каких конструкциях? Поддерживает ли при этом синтезатор protected типы? :smile3009: Quote Share this post Link to post Share on other sites More sharing options...
disel 0 June 16, 2006 Posted June 16, 2006 · Report post Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются. Цитата из Бибило: "...в некоторых случаях использование общей переменной допускается, например, если значенение ей присваивается лишь в одном месте". Quote Share this post Link to post Share on other sites More sharing options...
des00 26 June 16, 2006 Posted June 16, 2006 · Report post 2 disel и 2 Oldring Нельзя ли поподробнее? Чем синтезируются? В каких конструкциях? Поддерживает ли при этом синтезатор protected типы? Насчет shared variable собирал симплифаем 8х, описывал одно/двухпортовую одно/двухклоковую память все собираеться хорошо (странно что в доке на синтезатор сие не описанно). про protected еще не исследовал, некогда :( Насчет простых variable постоянно пользуюсь ими для более наглядного описания логики, все собираеться нормально, просто нужно помнить в чем разница между signal и variable. С точки зрения синтезируемых конструкций через них описывал как память, так и задержки на регистрах. Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются. Цитата из Бибило: "...в некоторых случаях использование общей переменной допускается, например, если значенение ей присваивается лишь в одном месте". Да мне до цитат как то глубоко по.....у , просто задался однажды целью уменьшить время симуляции проекта в разы, опираясь на профайлер. переписал всю память на shared variable и вуаля, время симуляции сильно уменьшилось, симулятор (алдек) перестал тормозить. Потом решил собрать что получилось в симплифае и вуаля все оказываеться работает, ну а дальше понеслось мини исследование :) Тут коллега подсказывает что у него и в XST (ISE 7.1) собралась блочная двухклокова память описанная через shared variable. Так что Бибило и юзер гайды мне друг, но истина дороже Quote Share this post Link to post Share on other sites More sharing options...
Oldring 0 June 16, 2006 Posted June 16, 2006 · Report post про 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, а некий хак от некоторых синтезаторови симуляторов Quote Share this post Link to post Share on other sites More sharing options...
disel 0 June 16, 2006 Posted June 16, 2006 · Report post Да мне до цитат как то глубоко по.....у , просто задался однажды целью уменьшить время симуляции проекта в разы, опираясь на профайлер. переписал всю память на shared variable и вуаля, время симуляции сильно уменьшилось, симулятор (алдек) перестал тормозить. Потом решил собрать что получилось в симплифае и вуаля все оказываеться работает, ну а дальше понеслось мини исследование :) Ну зачем же так грубо, причин то вроде бы не было. А на.. и по.. это не аргумент. В описанном выше коде shared variable использовались одновременно в двух процессах, причем в обоих процессах переменной присваивалось значение. О чем я и написал. И ishergin тоже совершенно правильно это заметил. Quote Share this post Link to post Share on other sites More sharing options...
des00 26 June 16, 2006 Posted June 16, 2006 · Report post про 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, а некий хак от некоторых синтезаторови симуляторов 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 тоже совершенно правильно это заметил. Вы наверное не увидели или не так поняли мою фразу Переменные это благо, но пользовать их нужно с умом. у меня нет желания расписывать все, что я понимаю под фразой "пользовать их нужно с умом" Quote Share this post Link to post Share on other sites More sharing options...
Oldring 0 June 16, 2006 Posted June 16, 2006 · Report post 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, на что я и хочу обратить внимание. А пользовать нестандартные расширения или нет - это личное дело каждого руководителя проекта. В случае чего нарываться тоже ему. :) Quote Share this post Link to post Share on other sites More sharing options...
disel 0 June 16, 2006 Posted June 16, 2006 · Report post глупый вопрос аргумент чего ? Только не чего, а где. Аргумента в споре. Я предпочитаю доверять, но проверять. Если кто-то, где-то пишет что-то, (например Бибило в книгах о языке), то я сначала задумаюсь а так ли это и откуда следует сие утверждение. Слепо верить и этому следовать это глупо. (во всем сомневайся - один из принципов моего самообучения) А что, я где-то утверждал обратное? В принципе, и предмета спора нет. Quote Share this post Link to post Share on other sites More sharing options...
des00 26 June 20, 2006 Posted June 20, 2006 · Report post Но именно это и не есть VHDL, на что я и хочу обратить внимание. А пользовать нестандартные расширения или нет - это личное дело каждого руководителя проекта. В случае чего нарываться тоже ему. :) Покурив стандарт, соглашусь + еще похоже альдек не понимает protected типы :( Но согласитесь что никто не говорил что симулять и собирать проект нужно с одними и теми же настройками. Если проект кросс-платформеный, то используем бехавор память на переменных (кстати на просто variable требования protected не распространяються на ней можно налабать однопортовку или синхронную двухпортовку) и быстро симуляемся.(особенно заметно когда совокупный объем симуляемой памяти достигает >= 30-50 килобоайт). Для рабочего дебага также bahavior модель пойдет, а вот когда нужно собирать что то итоговое подсовываем другое тело под объект, а дальше тайминг симуляция (если нужно, но тормоза еще те :() PS. Класно в ВХДЛ даже аналоги сишных класов есть, можно не плохо симуляться(найдти бы только такой симулятор, надо квесту попробывать). Хотя в эру систем си как то это немного запоздало. Quote Share this post Link to post Share on other sites More sharing options...
ishergin 0 June 20, 2006 Posted June 20, 2006 · Report post У Вас несинтезируемый код: не надо использовать shared variable. Используйте сигналы, причем не надо присваивать ему одновременно значения в разных процесах, иначе получите сообщение об ошибке (Вы сейчас так делаете для переменной a ). Что касается отличия переменной от сигнала - то посмотрите в любой литературе по VHDL :) Не надо ля ля, все нормально синтезируються shared variable, да и сами variable тоже великолепно синтезируются. Насчет использовать сигналы ? опишите память ВХДЛ через сигналы хотя бы на пару мегабайт и по симулите ее в проекте, активно выполняя транзакйии записи/чтения в нее (пс. при этом посмотрите сколько у вас памяти симулятор сожрет и как быстро это будет работаь). Переменные это благо, но пользовать их нужно с умом. Чтоб окончательно все прояснить (или запутать :blink: ) Про несинтезируемость конструкции shared variable я узнал из Стешенко "ПЛИС фирмы Altera..." тама прямо так и написано : неподдерживаемое средствами синтеза конструкции : зарезервированное слово shared :cheers: Скачать с ФТП нормальный последний стандарт VHDL на англицком я пока не могу, так что приходтится довольствоваться тем, что есть :( PS. Это хорошо что shared синтезируются: с ними иногда проще жить :) Quote Share this post Link to post Share on other sites More sharing options...