Jump to content
    

[Verilog] Накладывание сигналов

Вы думаете остроумно пошутили? А на самом деле всю глубину своего непонимания вытащили. Вы даже разницу между кодом для моделирования и кодом для синтеза не улавливаете.

 

я ведь не на ровном месте стал вас поучать

Вы сначала опубликовали заведомо несинтезируемый код. Перепутали? Но даже при копи-пасте нельзя перепутать "я помню чудное мгновение" и "чижика-пыжика"

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

 

А до этого вы не знали что разницу между "==" и "===" можно посмотреть в Стандарте, а времянки проверяют не по User Manual, а по Datasheet_у.

Поэтому и объяснил разницу на пальцах, да еще дал ссылку на дельную главу, которую вы даже не взглянули.

 

почему? Можно подробнее что имеется ввиду?

Адмирал может в этом убедиться в ModelSim (вы ЭТО хоть моделировали когда-нибудь??)

 

 

 

Как SPI то ваш?

1.1. Тут кстати интересный момент я все входные сообщения как более важный обложил контрольными суммами и поскольку они сходились, выходные остались без них. Выходные сообщения не очень важны, и мне показалось что их можно читать по 2 раза, это надежнее контрольной суммы.

Так и не работает в обе стороны?

Share this post


Link to post
Share on other sites

Смешно когда люди считают себя настолько гениальными что им все чем то обязаны:)...

 

Мой SPI конечно же работает, в обе стороны, без ошибок на 50 МГц, при этом ПЛИС с тактовой частотой 100 является слэйвом.

 

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

 

 

 

 

Share this post


Link to post
Share on other sites

По вашему подходу вывод, что HDL'ем пользуются только разработчики самой ПЛИС и прочих ASIC'ов, а у остальных ЯП, а не HDL. :)

 

По моему, практически любой язык можно использовать в качестве HDL, если сделать синтезатор устройств с него, и любой язык, изначально придуманный как HDL, использовать как ЯП, исполняя его на исполнительном устройстве. И я не считаю, что HDL именно в качестве HDL используют только разработчики ПЛИС и ASIC, я допускаю, но не знаю, возможно есть синтез с каких-то описательных языков и систем/устройств в каких либо других областях...

 

А вот разницу между разводкой реальных металлических дорожек в full custom и gate array, и включением нужных выключателей в ПЛИС, которые тоже формируют в результате реальную топологию таких же металлических дорожек на кристалле, соединяющую элементарные ячейки (которые несколько различны в ПЛИС, gate array и full custom, но тоже не критически различны), я не вижу никакой - суть одинаковая, формирование электрической схемы устройства, а не исполнение инструкций на исполнительном устройстве.

 

UPD

И, конечно же, никто не запрещает программировать на HDL, даже это бывает необходимо при написании тестбенчей, но с целью синтеза лучше его использовать, все таки, в смысле именно HDL, а не ЯП, чтобы не задавать таких вопросов, как тот, с чего началась эта тема - его бы просто не могло бы возникнуть по определению!

Share this post


Link to post
Share on other sites

А как иногда хочется чтобы все работало по обоим фронтам. Да в том же моем спи если вход пости по обоим фронтам 100 Мгц, можно было бы обойтись и без асинхронщины. А что стоит синтезатору сделать вход ксор вход с задержкой?

 

Все таки думаю в будущем так и будет, а вивадо первый шаг

 

Про ддр вкурсе, рассматривал...

Share this post


Link to post
Share on other sites

2SM

 

:) Своим последним постом вы фактически признали, что HDL - суть ЯП. И что практически любой ЯП может выступать в роли HDL, если написать синтезатор, который будет делать требуемую имплементацию. С этим не поспоришь, всё так. Стою на прежнем: HDL - исторически сложившееся название класса языков программирования с нативной поддержкой параллельных потоков выполнения. Имплементация может быть различной, но она не может определять сущность языка, т.к. является вещью производной.

 

В общем, называть можно как угодно, суть от этого не меняется. Я бы предложил вместо указания новичкам, что они "не пишут программу, а описывают схему", делать акцент на имплементации. Чтобы они при использовании одного и того же ЯП понимали разницу между именно имплементациями в виде виртуальной машины симулятора, ПЛИС и настоящим аппаратным ASIC'ом. Такое понимание наиболее близко к реальности и, ПМСМ, даст лучшее понимание того, что они делают на всём пути реализации проекта (от моделирования до железа).

Share this post


Link to post
Share on other sites

Ну и я стою на своем точно также :)

 

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

 

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

 

UPD. А что касается вопроса, почему С - назван ЯП, а Verilog - назван HDL - так лишь потому, что первый ориентирован его разработчиками на программирование, а второй - на описание устройств, а вовсе не потому, что так сложилось исторически - такова основная ориентация этих языков, заложенная их авторами. И на первом можно описывать устройства и синтезировать (неплохой пример - синтезируемое подмножество SystemC), а на втором - программировать (куча примеров из тестбенчей), но основное их предназначение все таки определено вполне четко. По аналогии, и микроскопом можно гвоздь забить, и поэтому назвать его молотком (еще и с непробиваемой аргументацией - ведь я же им гвозди на самом деле забиваю! Однозначно молоток!) :) Но основное его назначение, все таки, разглядывать мелкие предметы.

Share this post


Link to post
Share on other sites

2SM

Я бы предложил вместо указания новичкам, что они "не пишут программу, а описывают схему", делать акцент на имплементации. Чтобы они при использовании одного и того же ЯП понимали разницу между именно имплементациями в виде виртуальной машины симулятора, ПЛИС и настоящим аппаратным ASIC'ом. Такое понимание наиболее близко к реальности и, ПМСМ, даст лучшее понимание того, что они делают на всём пути реализации проекта (от моделирования до железа).

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

 

Мне кажется это что то на уровне разделения визуалы, аудиалы, кинестетики. Одни мир пониют так, другие сяк. Им так легче, и нет тут правильного или неправильного... Это просто по другому.

Share this post


Link to post
Share on other sites

Всегда так старалс делать, и поддерживаю. Не важно что они железо пересоединяют,

 

Вот-вот, а потом появляются глупые происходящие от непонимания того, что делается, вопросы из серии FAQ, "а почему у меня не синтезируется схема, где регистр работает по двум разным клокам", или "а почему у меня не синтезируется схема, работающая по обоим фронтам сразу", а то и еще хуже, "почему синтезировалось, а не работает в железе"... А зато ему ВАЖНЕЕ, что он "программу пишет" :smile3046: , якобы понимая, что она "выполняется впараллель" :) Да этих вопросов не было бы и в помине, даже не придумалось бы такое, если подойти к делу с правильной стороны - с того, что ЭТО СХЕМА, описанная словами языка, и в этой схеме нет места таким элементам, так как в том наборе примитивов, из которых эта схема строится, и которые подробнейшим образом описаны в документации на конкретную ПЛИС, нужных для этого, желаемого, нет физически.

Share this post


Link to post
Share on other sites

Вы убиваете магию в этом мире. Помню первый раз когда мне показали ПЛИС я подумал во круто. Пишешь ей текст, а она становится железкой котрая этот текст реализует. Скажи мне тогда что набор функций ограничен, я бы растроился....

 

Ладно, ладно не буду работать по 2 фронтам одновременно... Но станет ли мир лучше от этого?:)

Share this post


Link to post
Share on other sites

Не ради того чтобы что-то доказать...

Добрался до модуля что описан был с работой по обоим фронтам.

 

Поставил делить частоту на 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 после перехода по ссылке, вверху идет таймер.

 

если кому не удобно, скажите как перевыложу файлик по другому.

Share this post


Link to post
Share on other sites

не синтезируется... Я взял файл 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


Share this post


Link to post
Share on other sites

Не ради того чтобы что-то доказать...

Добрался до модуля что описан был с работой по обоим фронтам.

 

Поставил делить частоту на 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 внутри себя.

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

Share this post


Link to post
Share on other sites

не синтезируется... Я взял файл user_logic.v, сделал пустой проект с одним этим файлом:

 

 

Там есть проектик для ISE, у меня 14.4. Фиг его знает все имплементиться. Может дальше он после втыкания в платформ студию и генерации ядра проца вылезит с ошибкой, но это уже долго, не проверял. Хотя имплиментация проходит все стадии, в том числе и мапинг...

 

логарифм мне нужен только константы посчитать, да и то я баловался когда это писал, биты можно было и руками проставить. Интересно что ISE спокойно проглатывает и эту функцию, варнинг есть, но ошибок нет. За правки спасибо, учту в будущем....

 

 

 

Share this post


Link to post
Share on other sites

Там есть проектик для 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

Share this post


Link to post
Share on other sites

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

 

Я пытался в схемах отыскать счетчик, но его нет, есть какая - то конструкция на мультиплексорах, я так понимаю синтезатор превратил его в нечто работающее не на клоках, а на состояниях.

 

 

 

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...