2016-08-04 13 views
0

Этот вопрос является продолжением из другого здесь показано, VHDL Process Confusion with Sensitivity ListsMatch Моделирование и пост-Синтез Поведение в VHDL

Однако, имея менее 50 Rep точек, я не смог прокомментировать для дальнейшего объяснения.

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

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

Кроме того, я новичок в VHDL, поэтому возможно, что использование процессов не является правильным способом для достижения желаемого результата. Я использую DE2-115 с Quartus Prime 16.0. Любая информация будет принята с благодарностью.

+0

* Мне нужен список чувствительности, чтобы мои инструменты синтеза не игнорировались. * Используйте последовательные конструкции, рекомендованные вашим поставщиком (как в ответе на вопрос). Любой оцениваемый сигнал в состоянии или инструкции в противном случае должен быть в списке чувствительности (эквивалент в -2008 для использования зарезервированного слова «все»). См. Quartus Prime Standard Edition Справочник Том 1, 12. Рекомендуемые стили кодирования HDL, регистр и стиль кодирования защелки. Моделирование (результаты не показаны), по-видимому, рассчитывается на защелке, которую ЕС не видит в списке чувствительности, который не используется в синтезе (и не обеспечивает фиксации). – user1155120

ответ

2

Если вы используете VHDL для программирования вашей прототипической платы на основе FPGA, вас интересует семантика синтеза языка. Он сильно отличается от семантики моделирования, описанной в Справочном руководстве по языку (LRM). Хуже того: он не стандартизирован и варьируется между инструментами синтеза. В любом случае, синтез означает трансляцию из кода VHDL на цифровое оборудование. Единственный рекомендуемый подход здесь для новичков, которые до сих пор не ясно понимают семантику синтеза, составляет:

Сначала подумайте об аппаратном обеспечении, затем код.

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

  1. Окружайте свой рисунок большим прямоугольником. Это граница вашей цепи. Все, что пересекает эту границу, является входным или выходным портом. Объект VHDL будет описывать эту границу.
  2. Четко разделенные регистровые регистры (например, квадратные блоки) из комбинаторной логики (например, круглые блоки).
  3. Не используйте защелки с уровнем срабатывания.
  4. Используйте только начальные регистры с начальным фронтом и используйте одни и те же одиночные часы для всех них. Его имя clock. Он поступает извне и представляет собой вход всех квадратных блоков и только их. Даже не представляйте часы, это одинаково для всех квадратных блоков, и вы можете оставить его неявным в своей диаграмме.
  5. Представление сообщений между блоками с именованными и ориентированными стрелками. Для блока появляется стрелка, стрелка - выходной сигнал. Для блока стрелка идет, стрелка является входным сигналом.
  6. Стрелки имеют одно происхождение, но у них может быть несколько мест назначения. Если стрелка имеет несколько мест назначения, разворачивайте стрелку столько раз, сколько необходимо.
  7. Некоторые стрелки из-за большого прямоугольника. Это входные порты объекта. Стрелка ввода также не может быть выходом любого из ваших блоков.
  8. Некоторые стрелки выходят наружу. Это выходные порты. Стрелка вывода имеет одно единственное происхождение и одно место назначения: снаружи. Нет вил на выходных стрелках. Таким образом, стрелка вывода не может быть также входом одного из ваших блоков.Если вы хотите использовать стрелку вывода в качестве входа для некоторых ваших блоков, вставьте новый круглый блок, чтобы разбить его на две части: ввод нового блока с таким количеством вилок, как вы хотите, и стрелкой вывода, которая появляется из нового блока и выходит наружу. Новый блок станет простым непрерывным назначением в VHDL. Прозрачное переименование.
  9. Все стрелки, которые не поступают или не выходят из/наружу, являются внутренними сигналами. Вы объявите их все в архитектуре.
  10. Каждый цикл диаграммы должен содержать по меньшей мере один квадратный блок.

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

Кодирование VHDL становится деталью:

  • один синхронный процесс на квадратный блок,
  • один комбинаторный процессом за один раунд блока.

Синхронный процесс выглядит следующим образом:

process(clock) 
begin 
    if rising_edge(clock) then 
    o1 <= i1; 
    ... 
    on <= in; 
    end if; 
end process; 

где i1, i2,..., in являются все стрелки, которые входят в соответствующий квадратный блок вашей диаграммы и o1, ..., om являются все стрелки, выход соответствующего квадратного блока вашей диаграмме. Не меняйте ничего, кроме имен сигналов. Ничего. Даже не один персонаж. ОК?

Комбинаторное процесс выглядит следующим образом:

process(i1, i2,... , in) 
    <declarations> 
begin 
    o1 <= <default_value_for_o1>; 
    ... 
    om <= <default_value_for_om>; 
    <statements> 
end process; 

где i1, i2,..., in являются все стрелки, которые входят в соответствующий круглый блок диаграмме. все и не более. Не забудьте одну стрелку и ничего не добавляйте. Исключений нет. Никогда. А где o1, ..., om: все стрелки, которые выводят соответствующий круглый блок вашей диаграммы. все и не более. Не меняйте ничего, кроме <declarations>, имена входов, имена выходов, значения <default_value_for_oi> и <statements>. Do не забудьте одно назначение значения по умолчанию. Если бы вам пришлось создать новый круглый блок для разделения первичного выхода стрелки, соответствующий процесс просто:

process(i) 
begin 
    o <= i; 
end process; 

который можно упростить:

o <= i; 

без декларации процесса вшита. Это эквивалентное параллельное назначение сигнала.

После того, как вам будет комфортно с этим стилем кодирования и только тогда, вы будете:

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

Использование асинхронные переустанавливает:

process(clock, reset) 
begin 
    if reset = '1' then 
    o <= reset_value_for_o; 
    elsif rising_edge(clock) then 
    o <= i; 
    end if; 
end process; 

объединить несколько комбинаторных процессов в одном комбинаторном процессе. Это тривиально и представляет собой просто реорганизацию блок-схемы.

Объединить некоторые комбинаторные процессы с синхронными процессами. Но для этого вы должны вернуться к своей блок-схеме и добавить одиннадцатое правило:

  1. Группируйте несколько круглых блоков и по крайней мере один квадратный блок, рисуя вокруг них ограждение. Также приложите стрелки, которые могут быть. Не позволяйте стрелке пересекать границу корпуса, если она не приходит или не выходит из/за пределы корпуса. Как только это будет сделано, посмотрите на все выходные стрелки корпуса. Если какой-либо из них поступает из круглого блока корпуса или также является входом в корпус, вы не можете объединить эти процессы в синхронном процессе.

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

+0

Цифровой аппаратный дизайн с использованием VHDL в двух словах. –

+0

Отличная информация, которая помогает многим. Я думаю, что я понимаю, как это работает, но есть ли у вас визуальная ссылка на описанный вами процесс проектирования (например, видеоурок) или то, что является правильным названием для исследования «процесса проектирования блок-диаграммы», которое вы описали? – Dylan

+0

@ Dylan: Я начал вносить вклад в документацию VHDL на SO. Будьте терпеливы, и вы обнаружите все это там однажды. –