2015-04-20 2 views
-1

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

type integer_vector is array (0 to N) of integer; 
... 
process(...) 
variable tab: integer_vector; 
... 
if reset = '1' then 
tab := ?? 

Есть ли что-то похожее на tab <= (others=>(others=>'0')), который работает для SLV? Я не хочу использовать for-loop, поскольку синтез этого не поддерживает.

+0

Синтез - большинство инструментов синтезатора - может поддерживать циклы 'for', если они подчиняются определенным правилам, например, они имеют« локально статический »диапазон, например, постоянные ограничения по контурам. –

ответ

2

Код Мортена выглядит хорошо, поэтому, пожалуйста, укажите инструмент синтеза и версию, которая сообщает об этом. Некоторые инструменты синтеза могут быть слишком примитивными для принятия этого кода: в других случаях могут быть варианты синтеза, чтобы включить необходимое поведение. (Также проверьте, что вы точно выполнили его инструкции: (others => 0); запрашивает целые числа, а (others => '0'); запрашивает биты).

Однако для синтеза обратите внимание на две вещи:
(a) Целочисленные ряды будут лучше; он пытается генерировать 32-битные целые числа (хотя более поздние этапы синтеза могут их обрезать)

Так, например.

subtype my_int is natural range 0 to 99; -- needs 7 bits 
type my_int_vector is array (0 to N) of my_int; 

может давать меньше оборудования и, конечно же, дает читателю понять, что ожидаются меньшие целые числа.

(b), чтобы сбросить весь массив за одну операцию, ему потребуется реализовать всю партию в регистрах, что может привести к огромному количеству аппаратного обеспечения.

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

+0

Благодарим вас за глубокое понимание этой проблемы. (b) было очень полезно! – stoff

0

Когда элемент массива является integer, вы можете сделать:

tab := (others => 0); 

в вашем примере внутренняя (others=>'0') присваивает '0' всем std_logic элементов в каждом std_logic_vector массива, так что, когда элемент integer, это просто 0, как показано выше.

+0

Спасибо за ваш быстрый ответ! Это решение отлично работает для моделирования, но мой синтез все еще не устраивает этот: «Несоответствие ширины. имеет ширину 320 бит, но назначенное выражение имеет ширину 10 бит». – stoff

Смежные вопросы