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

Любой ли синтаксически верный код VHDL будет корректно работать на реальной ПЛИС?

Интересный вывод. То есть попытка полностью понять что происходит, понять инструмент и в деталях управлять процессом - это молодость:)?

Вы как я понимаю точно знаете что будет да?

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

Молодость в вашем нетерпении. Тут должны пройти года(и ворох ошибок).

 

А на основании чего вы это заявляете? Вы как я понял сторонник "деды так делали и мы так будем" :))) так вот может иногда стоит по молодецки поэкспериментировать? А заодно нам дуракам расскажете что получилось.

Человеку свойственно ошибаться.

Человеку не свойственно совершенство (с) Ф.Брукс

...В том числе и мне. ))). Это просто опыт..

 

Вот это мне демонстрирует полное непонимание или не владение темой. С чего вдруг то надо обязательно так делать?

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

Гляньте шире. Проблема ведь не в этой комбинационной схеме, а в следующем регистре, у которого на входе будет эта КАША...

 

 

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

 

Простите. Я не ставил целью обижать. Я склонен утрировать для понимания...

 

 

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

 

Это смотря к чему список чувствительности.. К тактированному или полностью параллельному блоку?

 

Именно, в этом и был смысл примера, но видать он был слишком молодецким%) Более того попытки защелкнуть комбинаторику в триггера без синхронизации, вот тут то как раз все встанет в полный рост с мета-стабильностью, гонками сигналов и прочими проблемами. Это к тезису что синхронный дизайн всегда благо.

 

Всегда благо

 

И есть один очень хороший пример

sample_and: process(d)
begin
   a <= b & c;
end process;

Уважаемый Мур прокомментируете что будет при синтезе и симуляции данной схемы

Отличный пример. Вы тут получите свой а в моменты смены сигнала d

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


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

Отличный пример. Вы тут получите свой а в моменты смены сигнала d

Переступите через свой опыт, пожалуйста... и проверьте что будет на самом деле:) единственное я имел ввиду, конечно a <= b and c; просто давно не писал на VHDL...

И да, когда будите проверять не поленитесь посмотреть технологическую схему после синтеза, а то и сделать пост синтез симуляцию

 

 

Гляньте шире. Проблема ведь не в этой комбинационной схеме, а в следующем регистре, у которого на входе будет эта КАША...

Какая каша простите? Если входы этой схемы - это выходы регистров на той же частоте - ничего не будет, все будет работать штатно.

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

 

 

 

Это смотря к чему список чувствительности.. К тактированному или полностью параллельному блоку?

В том то и дело что НЕВАЖНО!!!!! синтезатор просто игнорирует список чувствительности и синтезирует схему по внутреннему описанию процесса!

Это верно как минимум для ISE, Quartus, кто там еще остался симплифай? Вроде как он тоже себя так ведет.

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


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

Переступите через свой опыт, пожалуйста... и проверьте что будет на самом деле:) единственное я имел ввиду, конечно a <= b and c; просто давно не писал на VHDL...

И да, когда будите проверять не поленитесь посмотреть технологическую схему после синтеза, а то и сделать пост синтез симуляцию

Спасибочки... Сделаю для развития...

 

Какая каша простите? Если входы этой схемы - это выходы регистров на той же частоте - ничего не будет, все будет работать штатно.

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

 

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

 

В том то и дело что НЕВАЖНО!!!!! синтезатор просто игнорирует список чувствительности и синтезирует схему по внутреннему описанию процесса!

Это верно как минимум для ISE, Quartus, кто там еще остался симплифай? Вроде как он тоже себя так ведет.

А вы пропустите в списке какой нибудь сигнал

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


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

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

С чего вдруг то?

 

А вы пропустите в списке какой нибудь сигнал

тут мы возвращаемся к предложенной схеме

sample_and: process(d)
begin
   a <= b and c;
end process;

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

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


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

Как-то дискуссия в тупик зашла. Предлагаю сойтись на том, что для абсолютной переносимости и для сопоставимости результатов работы железа и симулятора ЛУЧШЕ не экспериментировать, а приучить себя думать и над списком чувствительности в том числе.

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


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

Как-то дискуссия в тупик зашла. Предлагаю сойтись на том, что для абсолютной переносимости и для сопоставимости результатов работы железа и симулятора ЛУЧШЕ не экспериментировать, а приучить себя думать и над списком чувствительности в том числе.

зачем? используем VHDL 2008 :)

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


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

Пропустил...

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

Для приведения к синхронности применяют не один триггер. Одного мало...

А что делать с SPI slave при взаимодействии с мастером из внешнего мира?

Как!!! Вы этого не применяете? тот же прием! привязать события набором триггеров (не один)

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


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

Для приведения к синхронности применяют не один триггер. Одного мало...

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

 

 

Как!!! Вы этого не применяете? тот же прием! привязать события набором триггеров (не один)

Конечно же нет, потому что это верный способ провалить частоту минимум в 4 раза. Просто на самом деле знаю что там происходит и что такое мета-стабильность, и гонка сигналов. Поэтому я и могу сделать правильный SPI slave, который естественно не пересинхронизируется во время приема-передачи на рабочую частоту схемы.

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


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

Пишите на Verilog'е - там список чуствительности влияет (более того - определяет) синтезируемую схему :yeah:

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


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

Пишите на Verilog'е - там список чуствительности влияет (более того - определяет) синтезируемую схему :yeah:

 

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

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


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

если написать

always(posedge clk or negedge reset_n)
  begin
    if(reset_n == 1'b1)
       ....
    else
       ....
  end

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

 

ну и конечно же симуляция честно отрабатывает фронты асинхронных сигналов, а реальная схема отрабатывает уровни. То есть

 

always(posedge clk or posedge set)
  begin
    if(set == 1'b1)
       a <= b;
    else
       ....
  end

 

в симуляции в а засовывается b по фронту set, и меняй не меняй b после фронта - пофиг. В реальной схеме, Если set стоит в 1, то изменение b будет проходить на a.

 

А влияние на поведение, - это пропуск слова posedge, хотя я сейчас что-то задумался....

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


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

А можно какой-то пример? С Верилогом особо не работал, для общего развития немного баловался, но не более. Насколько я знаю, там, например, в списке чувствительность указывают фронт ресета тоже из соображения корректности симуляции, потому что в реальном железе никакой фронт конечно же анализироваться не будет.
Будет. Пример уже Golikov привел. Основное отличие от VHDL в том, что в Verilog'е нет конструкций clk'event и аналогичных, а реакция на фронты выводится из списка чуствительности. В VHDL реакция на фронты явно записывается в теле процесса.

 

Если синтезатор в Verilog'е не опознает паттерн из списка чуствительности и использования сигнала в блоке, то он скорее всего вообще откажется это синтезировать.

 

Ну и что бы не быть голословным:

// D trigger with async reset
always(posedge clk or posedge reset)
if (reset)
  out <= 1'b0;
else
  out <= in;

// Latch with reset
always(posedge reset)
if (reset)
  out <= 1'b0;
else
  out <= in;

Как видно минимальное отличие только в списке чуствительности (posedge clk) привело к изменению схемы (причем оба варианта вполне валидны)

 

 

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


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

// Latch with reset

always(posedge reset)

if (reset)

out <= 1'b0;

else

out <= in;[/code]Как видно минимальное отличие только в списке чуствительности (posedge clk) привело к изменению схемы (причем оба варианта вполне валидны)

 

А, все, понял, о чем речь.

А нельзя сделать в явном виде:

always(posedge reset)
if (reset)
  out <= 1'b0;
else
    if (clk)
       out <= in;

 

Понятно, что многие любят язык в том числе за то, что позволяет убрать избыточность типа такой, но если VHDL со своим стилем уже въелся в мозг, не поможет такой вариант исправить ситуацию?

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


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

нет, не может.

это будет латч с разрешением что ли%:) он просто не станет триггером, потому что нужно не значение клока а фронт, событие.

То есть нет аналога ВХДЛьного clk'event внутри алвейса,

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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