Джеймс 5 January 26, 2014 Posted January 26, 2014 · Report post Вы думаете остроумно пошутили? А на самом деле всю глубину своего непонимания вытащили. Вы даже разницу между кодом для моделирования и кодом для синтеза не улавливаете. я ведь не на ровном месте стал вас поучать Вы сначала опубликовали заведомо несинтезируемый код. Перепутали? Но даже при копи-пасте нельзя перепутать "я помню чудное мгновение" и "чижика-пыжика" Во-вторых даже при самом беглом взгляде на код оказалось, что даже в поведенческом варианте он не будет работать как задумывалось. А до этого вы не знали что разницу между "==" и "===" можно посмотреть в Стандарте, а времянки проверяют не по User Manual, а по Datasheet_у. Поэтому и объяснил разницу на пальцах, да еще дал ссылку на дельную главу, которую вы даже не взглянули. почему? Можно подробнее что имеется ввиду? Адмирал может в этом убедиться в ModelSim (вы ЭТО хоть моделировали когда-нибудь??) Как SPI то ваш? 1.1. Тут кстати интересный момент я все входные сообщения как более важный обложил контрольными суммами и поскольку они сходились, выходные остались без них. Выходные сообщения не очень важны, и мне показалось что их можно читать по 2 раза, это надежнее контрольной суммы. Так и не работает в обе стороны? Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 26, 2014 Posted January 26, 2014 · Report post Смешно когда люди считают себя настолько гениальными что им все чем то обязаны:)... Мой SPI конечно же работает, в обе стороны, без ошибок на 50 МГц, при этом ПЛИС с тактовой частотой 100 является слэйвом. А вы если бы не закатывали многозначительно глаза и не пытались меня уколоть, сделали бы мир лучше, а так вы просто клавиатуру портите.... Quote Share this post Link to post Share on other sites More sharing options...
SM 13 January 26, 2014 Posted January 26, 2014 · Report post По вашему подходу вывод, что HDL'ем пользуются только разработчики самой ПЛИС и прочих ASIC'ов, а у остальных ЯП, а не HDL. :) По моему, практически любой язык можно использовать в качестве HDL, если сделать синтезатор устройств с него, и любой язык, изначально придуманный как HDL, использовать как ЯП, исполняя его на исполнительном устройстве. И я не считаю, что HDL именно в качестве HDL используют только разработчики ПЛИС и ASIC, я допускаю, но не знаю, возможно есть синтез с каких-то описательных языков и систем/устройств в каких либо других областях... А вот разницу между разводкой реальных металлических дорожек в full custom и gate array, и включением нужных выключателей в ПЛИС, которые тоже формируют в результате реальную топологию таких же металлических дорожек на кристалле, соединяющую элементарные ячейки (которые несколько различны в ПЛИС, gate array и full custom, но тоже не критически различны), я не вижу никакой - суть одинаковая, формирование электрической схемы устройства, а не исполнение инструкций на исполнительном устройстве. UPD И, конечно же, никто не запрещает программировать на HDL, даже это бывает необходимо при написании тестбенчей, но с целью синтеза лучше его использовать, все таки, в смысле именно HDL, а не ЯП, чтобы не задавать таких вопросов, как тот, с чего началась эта тема - его бы просто не могло бы возникнуть по определению! Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 26, 2014 Posted January 26, 2014 · Report post А как иногда хочется чтобы все работало по обоим фронтам. Да в том же моем спи если вход пости по обоим фронтам 100 Мгц, можно было бы обойтись и без асинхронщины. А что стоит синтезатору сделать вход ксор вход с задержкой? Все таки думаю в будущем так и будет, а вивадо первый шаг Про ддр вкурсе, рассматривал... Quote Share this post Link to post Share on other sites More sharing options...
dxp 115 January 26, 2014 Posted January 26, 2014 · Report post 2SM :) Своим последним постом вы фактически признали, что HDL - суть ЯП. И что практически любой ЯП может выступать в роли HDL, если написать синтезатор, который будет делать требуемую имплементацию. С этим не поспоришь, всё так. Стою на прежнем: HDL - исторически сложившееся название класса языков программирования с нативной поддержкой параллельных потоков выполнения. Имплементация может быть различной, но она не может определять сущность языка, т.к. является вещью производной. В общем, называть можно как угодно, суть от этого не меняется. Я бы предложил вместо указания новичкам, что они "не пишут программу, а описывают схему", делать акцент на имплементации. Чтобы они при использовании одного и того же ЯП понимали разницу между именно имплементациями в виде виртуальной машины симулятора, ПЛИС и настоящим аппаратным ASIC'ом. Такое понимание наиболее близко к реальности и, ПМСМ, даст лучшее понимание того, что они делают на всём пути реализации проекта (от моделирования до железа). Quote Share this post Link to post Share on other sites More sharing options...
SM 13 January 26, 2014 Posted January 26, 2014 · Report post Ну и я стою на своем точно также :) Суть в том, что отличие - при процессе программирования подразумевается исполнение написанного (или результата компиляции написанного) на одном или множестве исполнительных устройств, а при описании устройства подразумевается синтез самого устройства в целом - и в этом фундаментальное отличие принципов того, что и как можно использовать с целью описания устройства и его синтеза, и с целью написания программы и последующего ее исполнения. По крайней мере, это понятно для начинающих, и вынуждает их разобраться в том, что они пишут, что от этого хотят получить, что получают, и как и из чего оно получается. И, заметьте, я ведь не делю языки на ЯП / HDL, я веду лишь речь о том, что товарищ делает - программирует, или описывает устройство, не применительно к конкретному языку, а применительно к результату работы - синтезу устройства в целом или исполнению на исполнительном устройстве. И разделение этих принципов в начале пути того, кто решил заняться синтезом устройств, уже владея программированием, позволяет избежать огромного количества классических ошибок. UPD. А что касается вопроса, почему С - назван ЯП, а Verilog - назван HDL - так лишь потому, что первый ориентирован его разработчиками на программирование, а второй - на описание устройств, а вовсе не потому, что так сложилось исторически - такова основная ориентация этих языков, заложенная их авторами. И на первом можно описывать устройства и синтезировать (неплохой пример - синтезируемое подмножество SystemC), а на втором - программировать (куча примеров из тестбенчей), но основное их предназначение все таки определено вполне четко. По аналогии, и микроскопом можно гвоздь забить, и поэтому назвать его молотком (еще и с непробиваемой аргументацией - ведь я же им гвозди на самом деле забиваю! Однозначно молоток!) :) Но основное его назначение, все таки, разглядывать мелкие предметы. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 26, 2014 Posted January 26, 2014 · Report post 2SM Я бы предложил вместо указания новичкам, что они "не пишут программу, а описывают схему", делать акцент на имплементации. Чтобы они при использовании одного и того же ЯП понимали разницу между именно имплементациями в виде виртуальной машины симулятора, ПЛИС и настоящим аппаратным ASIC'ом. Такое понимание наиболее близко к реальности и, ПМСМ, даст лучшее понимание того, что они делают на всём пути реализации проекта (от моделирования до железа). Всегда так старался делать, и поддерживаю. Не важно что они железо пересоединяют, или программой управляют как в симуляторе, просто надо правильно понимать что все выполняется в параллель. Это по мне важнее в начале чем то что там реально что-то пересоединяется внутри. Мне кажется это что то на уровне разделения визуалы, аудиалы, кинестетики. Одни мир пониют так, другие сяк. Им так легче, и нет тут правильного или неправильного... Это просто по другому. Quote Share this post Link to post Share on other sites More sharing options...
SM 13 January 26, 2014 Posted January 26, 2014 · Report post Всегда так старалс делать, и поддерживаю. Не важно что они железо пересоединяют, Вот-вот, а потом появляются глупые происходящие от непонимания того, что делается, вопросы из серии FAQ, "а почему у меня не синтезируется схема, где регистр работает по двум разным клокам", или "а почему у меня не синтезируется схема, работающая по обоим фронтам сразу", а то и еще хуже, "почему синтезировалось, а не работает в железе"... А зато ему ВАЖНЕЕ, что он "программу пишет" :smile3046: , якобы понимая, что она "выполняется впараллель" :) Да этих вопросов не было бы и в помине, даже не придумалось бы такое, если подойти к делу с правильной стороны - с того, что ЭТО СХЕМА, описанная словами языка, и в этой схеме нет места таким элементам, так как в том наборе примитивов, из которых эта схема строится, и которые подробнейшим образом описаны в документации на конкретную ПЛИС, нужных для этого, желаемого, нет физически. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 27, 2014 Posted January 27, 2014 · Report post Вы убиваете магию в этом мире. Помню первый раз когда мне показали ПЛИС я подумал во круто. Пишешь ей текст, а она становится железкой котрая этот текст реализует. Скажи мне тогда что набор функций ограничен, я бы растроился.... Ладно, ладно не буду работать по 2 фронтам одновременно... Но станет ли мир лучше от этого?:) Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 27, 2014 Posted January 27, 2014 · Report post Не ради того чтобы что-то доказать... Добрался до модуля что описан был с работой по обоим фронтам. Поставил делить частоту на 3, просимулировал, получил в симуляторе картинку где входная частота на выходе действительно поделена на 3. Попробовал имплементировать, все получилось, модуль синтезировался и имплементировался. Поглядел что там внутри сделал синтезатор, оба выхода прямой и инверсный получаются с защелок на которые заведен клок. Разрешением служит некая схема на мультиплексорах. В модуле у меня никак не законстрейнен выходной клок, и я так понимаю воспользовавшись этим синтезатор просто передвинул изменение сигнала с падающего фронта, на следующий ближайший восходящий. Получил не 50% скважность, но сделал все же делитель на 3 (в симуляторе все же 50% скважность). Осциллографа под рукой нет, чтобы проверить как оно все в железе работает и правда ли делиться клок на 3, и какая у него скважность. Отчасти примененный мной подход привел не со всем к ожидаемому результату. Что в свою очередь могло вернуться неожиданными ошибками в будущем. С другой стороны я действительно не накладывал никаких ограничений на сигнал, и описав примерно что я хочу, я получил нужный делитель. Думаю что жизнь в очередной раз показывает что нет черного и белого, а правда как всегда где то по середине. Результат можно получить быстрее, и он же может выйти боком. Естественно не считая себя центром вселенной, допускаю что я вообще полностью неправильно интерпретировал результаты, потому хочу приложить к проекту архивчик с этим компонентом. В нем в user я чтобы не было никаких разночтений закоментил кусок где мог быть выбор работы по 1 или по 2 фронтам. Также я под akways засунул прямо код, а не таск как было изначально, на случай если у одного оратора в его недоговорках действительно что-то было кроме истерики. Если кто-то возьмет на себя труд поглядеть это все, и высказать свое авторитетное мнение что-же там на самом деле произошло, буду рад. Чтобы все заработало на вход s_axi_aclk надо подать клок а на s_axi_aresetn подать 1 ну или просто подключить модуль к Axi шине микроблайза. m_mclk_out - интересующий нас выход с деленным клокм вот ссылка на файлы.mail.ru http://files.mail.ru/345E34A4E4524CF294365F6B4E429762 обычное скачивание с "медленной" скоростью у них достаточно быстро, и не надо ничего ставить. Скачать дадут через секунд 10 после перехода по ссылке, вверху идет таймер. если кому не удобно, скажите как перевыложу файлик по другому. Quote Share this post Link to post Share on other sites More sharing options...
SM 13 January 27, 2014 Posted January 27, 2014 · Report post не синтезируется... Я взял файл user_logic.v, сделал пустой проект с одним этим файлом: ERROR - CS162 :"E:\test-v\motor_spi_v1_00_a\user_logic.v":167:16:167:28|Loop iteration limit 2000 exceeded - add '// synthesis loop_limit 4000' before the loop construct поставил лимит 40000, получил примерно тоже самое ERROR - CS162 :"E:\test-v\motor_spi_v1_00_a\user_logic.v":167:16:167:28|Loop iteration limit 40000 exceeded - add '// synthesis loop_limit 80000' before the loop construct Это цикл внутри ф-ции log2. По ходу к этому еще имеет отношение вот это: WARNING - E:/test-v/motor_spi_v1_00_a/user_logic.v(164,3-164,20) (VERI-1606) non-module variable pow2 cannot be initialized at declaration UPD: вот поставил руками вместо log2 числа конкретные.... Получил, что и должен был получить: ERROR - CG300 :"E:\test-v\motor_spi_v1_00_a\user_logic.v":226:10:226:50|posedge and negedge of the same signal not allowed UPD2: синтезировал Synplify Pro H-2013.03 - пробовал и для LatticeXP2 синтезировать (заменив ODDR на ODDRXC), и для Xilinx Spartan-6 (как есть), без разницы, одинаково UPD3: переписал еще Вам и log2, чтобы он без ошибок работал при синтезе: function integer log2; input integer value; integer i; begin log2 = 0; for(i = 0; 2**i < value; i = i + 1) log2 = i + 1; end endfunction // или function integer log2; input integer value; integer pow2; begin pow2 = 1; for (log2=0; pow2 < value; log2=log2+1) pow2 =((pow2<<1) + 1); end endfunction // или тупо включить опцию, что исходник на SystemVerilog, а не на Verilog-2001 Quote Share this post Link to post Share on other sites More sharing options...
Timmy 1 January 27, 2014 Posted January 27, 2014 · Report post Не ради того чтобы что-то доказать... Добрался до модуля что описан был с работой по обоим фронтам. Поставил делить частоту на 3, просимулировал, получил в симуляторе картинку где входная частота на выходе действительно поделена на 3. Если кто-то возьмет на себя труд поглядеть это все, и высказать свое авторитетное мнение что-же там на самом деле произошло, буду рад. Чтобы все заработало на вход s_axi_aclk надо подать клок а на s_axi_aresetn подать 1 ну или просто подключить модуль к Axi шине микроблайза. m_mclk_out - интересующий нас выход с деленным клокм Ну, так, как написано, это просто ужас ужас, так что мне не интересно разбираться, что произошло, лучше скажу, как надо делать. 1) рисуем осциллограмму системного клока. 2) рисуем осциллограмму выходного, делённого на 3 клока. 3) внимательно читаем даташит про ODDR, и рисуем осциллограммы для сигналов D0 и D1, чтобы получить на выходе требуемый делённый на три системный клок. При этом на клоки ODDR подаётся постоянный системный клок, а не gated, как у вас. 4) программируем с помощью счётчика и case простейший конечный автомат на 6(скорее всего) состояний, формирующий сигналы D0 и D1. И никаких отрицательных фронтов в программе, с ними разбирается ODDR внутри себя. Чтобы выбрать именно такой путь решения, как раз и требуется понимание того, как изнутри устроена аппаратура, что она может делать хорошо, а что не очень. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 27, 2014 Posted January 27, 2014 · Report post не синтезируется... Я взял файл user_logic.v, сделал пустой проект с одним этим файлом: Там есть проектик для ISE, у меня 14.4. Фиг его знает все имплементиться. Может дальше он после втыкания в платформ студию и генерации ядра проца вылезит с ошибкой, но это уже долго, не проверял. Хотя имплиментация проходит все стадии, в том числе и мапинг... логарифм мне нужен только константы посчитать, да и то я баловался когда это писал, биты можно было и руками проставить. Интересно что ISE спокойно проглатывает и эту функцию, варнинг есть, но ошибок нет. За правки спасибо, учту в будущем.... Quote Share this post Link to post Share on other sites More sharing options...
SM 13 January 27, 2014 Posted January 27, 2014 · Report post Там есть проектик для ISE, у меня 14.4. у меня сейчас нет ISE, я его ставил, когда смотрел, какую ПЛИС выбрать под очередной проект, потом снес, когда понял, что xilinx в очередной раз мимо (как раз была дискусия по HOLD-ам)... Так что с Synplify только могу. И, увы, даже при режиме SystemVerilog, в котором допустимо инитить переменные функций при их объявлении, все равно имеем ERROR - CG300 :"E:\test-v\motor_spi_v1_00_a\user_logic.v":226:10:226:50|posedge and negedge of the same signal not allowed Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 27, 2014 Posted January 27, 2014 · Report post у меня сейчас нет ISE, я его ставил, когда смотрел, какую ПЛИС выбрать под очередной проект, потом снес, когда понял, что xilinx в очередной раз мимо (как раз была дискусия по HOLD-ам)... Так что с Synplify только могу. И, увы, даже при режиме SystemVerilog, в котором допустимо инитить переменные функций при их объявлении, все равно имеем ERROR - CG300 :"E:\test-v\motor_spi_v1_00_a\user_logic.v":226:10:226:50|posedge and negedge of the same signal not allowed Во время той дискуссии я как раз пытался по обоим фронтам без ДДР обработать клок входной SPI, и мне синтезатор тоже сказал что нет вараинтов захвата по обоим фронтам. То есть ISE такое тоже говорит, если надо. Но тут он поразительным образом молчит. Я пытался в схемах отыскать счетчик, но его нет, есть какая - то конструкция на мультиплексорах, я так понимаю синтезатор превратил его в нечто работающее не на клоках, а на состояниях. Quote Share this post Link to post Share on other sites More sharing options...