VHDL: выяснить / сообщить битовую ширину / длину целого числа (против std_logic_vector)? - PullRequest
5 голосов
/ 04 марта 2011

Скажите, что мне нужен сигнал для представления чисел от 0 до 5;очевидно, что для этого нужно представить 3 бита std_logic (, т. е. если MAXVAL = 5, то битовая ширина = {wcalc "floor(logtwo($MAXVAL))+1"} ).

Я знаю, что мог бы сделать:

SIGNAL myLogicVector : STD_LOGIC_VECTOR(2 downto 0) := 5; 

, с помощью которого я бы явно указал массив из трех битов std_logic и установил начальное значение;тогда я мог бы использовать REPORT для распечатки длины (в данном случае 3):

report("Bit width of myLogicVector is "& integer'image(myLogicVector'length));

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

SIGNAL myInteger : NATURAL range 0 to 5 := 5;

Я предполагаю, что здесь 'compiler' ('synthesizer') автоматически выведет, что ему нужно3 бита длины памяти, так как это целое число ранжируется со значениями от 0 до 5. Если это так, мой вопрос таков: можно ли каким-то образом распечатать этот бит ширина / длина / размер вОТЧЕТ?

Хитрость, конечно, в том, что что-то вроде этого:

report("Bit width of myInteger is "& integer'image(myInteger'length));

... потерпит неудачу (скажем, с " HDLParsers: 3389 - Префикс длины атрибута долженбыть объектом массива"), поскольку, насколько я понимаю, все эти атрибуты, такие как 'length и 'range, применимы только к массивам ( Общие сведения об атрибутах VHDL )тогда как целое число (натуральное) не является массивом - это число :) ( VHDL-векторное целочисленное преобразование, вопрос )

Опять же, я знаю, что ямог бы использовать log2 ( вычисление ширины переменной без знака из максимального значения? ) - но я хотел бы просто увидеть быстро ( во время синтеза ) сколько 'бит«синтезатор», выделенный для возможного синтезированного проекта, и, следовательно, приблизительный объем, который будет использоваться в терминах конечных ресурсов ПЛИС (, особенно если бы я использовал «универсальные», чтобы каким-то образом вычислить конкретное максимальное значение для целого числа *)1043 *).

Ну, заранее спасибо за любыеответит, ура!

РЕДАКТИРОВАТЬ: немного контекста: я использую ISE Webpack 9.2;Я пытаюсь использовать «общие» переменные / константы в качестве параметров, а затем использовать уравнения для расчета максимальных значений для счетчиков.Это вычисление, я полагаю, происходит во время «компиляции» (которое было бы «Синтезировать» в ISE, а не «Реализация дизайна»), и поэтому именно здесь я хочу, чтобы сообщения отчета появлялись (, и я фактически получилих так, для собственно std_logic_vector, в журнале синтеза - однако, те же самые сообщения для меня появляются и при запуске поведенческого моделирования, что вполне нормально ).

И цель этих сообщений отчета - убедиться, что мои уравнения в порядке, и что синтезатор не будет пытаться вывести 32-битный счетчик - даже если я хочу считать только от 0 до 5:)

Ответы [ 4 ]

6 голосов
/ 05 марта 2011

В принципе, представление целого числа VHDL не определено.

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

2 голосов
/ 04 марта 2011

Я предполагаю, что здесь "компилятор" («синтезатор») будет автоматически сделать вывод, что ему нужно 3 бита длина, так как это целое число ранжируется с значения от 0 до 5

Согласно спецификации это должно, но это не обязательно. От IEEE 1076.6-2004:

1.3 Терминология

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

8.3.1.2 Целочисленные типы

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

Инструмент синтеза должен поддерживать целочисленные типы и положительные, отрицательные и неограниченные (универсальные) целые числа чьи границы лежат в диапазоне от –2 147 483 648 до +2 147 483 647 включительно (диапазон который успешно отображает 32-битные числа с двумя дополнениями)

Пример: «Диапазон от 9 до 10» должен быть синтезирован с использованием эквивалентная длина вектора 4 бита, как если бы она была определена с указанием подтипа «INTEGER диапазон от 0 до 15».

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

Для ПЛИС Xilinx отчет об обобщении XST сообщит, какие элементы памяти имеют неиспользуемые биты, но не простые провода.

0 голосов
/ 17 сентября 2016

Это можно решить следующим образом:

Сначала объявите новый (под) тип, представляющий диапазон, который должен использоваться для myInteger.(Затем объявите myInteger как сигнал этого типа, а не непосредственно целочисленного диапазона.)

Затем объявите фиктивный тип массива, используя объявленный диапазон в качестве диапазона индекса, а затем используйте 'length, что :

subtype myInteger_range is natural range 0 to 5;
signal myInteger : myInteger_range;
type myInteger_dummy_array is array (myInteger_range) of boolean; -- or whatever
report integer'image(myInteger_dummy_array'length); --> "6"
0 голосов
/ 19 марта 2015

Вы всегда можете использовать:

отчет («Битовая ширина myInteger is» & integer'image (myInteger'left - myInteger'Right));

...