Если ваше приложение HDL должно отправить данные о HDL в функцию MATLAB®, вы, возможно, сначала должны преобразовать данные в тип, поддержанный MATLAB и программным обеспечением HDL Verifier™.
Чтобы программировать функцию MATLAB для модели HDL, необходимо изучить преобразования типов, требуемые приложением. Вы, возможно, также должны обработать различия между соглашениями индексации массива, используемыми HDL, который вы используете и MATLAB (см. следующий раздел).
Типы данных аргументов, переданных в к функции, определяют следующее:
Типами преобразований, требуемых перед данными, управляют
Типы преобразований, требуемых возвратить данные в симулятор HDL
Следующая таблица подводит итог, как программное обеспечение HDL Verifier преобразует, поддержал типы данных VHDL® к типам MATLAB на основе того, является ли тип скаляром или массивом.
Преобразования VHDL к типу данных MATLAB
Типы VHDL... | Когда скаляр преобразует в... | Когда массив преобразует в... |
---|---|---|
STD_LOGIC , STD_ULOGIC , и BIT | Символ, который совпадает с символьным литералом для желаемого логического состояния. | |
STD_LOGIC_VECTOR , STD_ULOGIC_VECTOR , BIT_VECTOR , SIGNED , и UNSIGNED | Вектор-столбец символов (как задано в Преобразованиях VHDL для симулятора HDL) с одним битом за символ. | |
Массивы STD_LOGIC_VECTOR , STD_ULOGIC_VECTOR , BIT_VECTOR , SIGNED , и UNSIGNED | Массив символов (как задано выше) с размером, который эквивалентен размеру порта VHDL. | |
INTEGER и NATURAL | Введите int32 . | Массивы типа int32 с размером, который эквивалентен размеру порта VHDL. |
REAL | Введите double . | Массивы типа double с размером, который эквивалентен размеру порта VHDL. |
TIME | Введите double для временных стоимостей в секундах и типе int64 для значений, представляющих шаг времени средства моделирования (см. описание 'time' опция в hdldaemon ). | Массивы типа double или int64 с размером, который эквивалентен размеру порта VHDL. |
Перечислимые типы | Вектор символов или строковый скаляр, который содержит представление MATLAB метки VHDL или символьного литерала. Например, метка high преобразует в 'high' и символьный литеральный 'c' преобразует в '''c''' . | Массив ячеек из символьных векторов или массив строк с каждым элементом равняются метке для заданного перечислимого типа. Каждым элементом является представление MATLAB метки VHDL или символьного литерала. Например, векторный (one, '2', three) преобразует в вектор-столбец ['one'; '''2'''; 'three'] . Пользовательский перечислимый тип, который содержит только символьные литералы, и затем преобразует в вектор или массив символов, как обозначено для типов STD_LOGIC_VECTOR , STD_ULOGIC_VECTOR , BIT_VECTOR , SIGNED , и UNSIGNED . |
Следующая таблица подводит итог, как программное обеспечение HDL Verifier преобразует, поддержал типы данных Verilog® к типам MATLAB. Программное обеспечение поддерживает только скалярные типы данных для Verilog.
Преобразования Verilog к типу данных MATLAB
Типы Verilog... | Преобразует в... |
---|---|
wire , reg | Символ или вектор-столбец символов, который совпадает с символьным литералом для желаемых логических состояний (биты). |
Следующая таблица подводит итог, как программное обеспечение HDL Verifier преобразует, поддержал типы данных SystemVerilog к типам MATLAB. Программное обеспечение поддерживает только скалярные типы данных для SystemVerilog.
Преобразования SystemVerilog к типу данных MATLAB
Типы SystemVerilog... | Преобразует в... |
---|---|
wire , reg , logic | Символ или вектор-столбец символов, который совпадает с символьным литералом для желаемых логических состояний (биты). |
integer
| Вектор-столбец с 32 элементами символов, который совпадает с символьным литералом для желаемых логических состояний (биты). |
Многомерные массивы reg
/wire
/logic
не поддержаны.
В HDL у вас есть гибкость, чтобы задать битовый вектор или с MSB 0 или с LSB 0 нумераций. В MATLAB битовый векторы всегда рассматриваются LSB 0 нумерациями. Для того, чтобы предотвратить повреждение данных, рекомендуется, чтобы вы использовали LSB 0 индексаций в ваших интерфейсах HDL.
Если вы задаете логический вектор в HDL как:
signal s1 : std_logic_vector(7 downto 0);
Это сопоставлено с int8 в MATLAB с s1[7] как MSB. В качестве альтернативы, если вы задаете свой логический вектор как:
signal s1 : std_logic_vector(0 to 7);
Это сопоставлено с int8 в MATLAB с s1[0] как MSB.
В многомерных массивах тот же базовый буфер памяти ОС сопоставляет с различными элементами в MATLAB, и симулятор HDL (это отображение только отражает различные пути различное предложение языков по именованию элементов того же массива). Когда вы используете обоих matlabtb
и matlabcp
функции, стараться присвоить и интерпретировать значения последовательно в обоих приложениях.
В HDL, многомерный массив, объявленный как:
type matrix_2x3x4 is array (0 to 1, 4 downto 2) of std_logic_vector(8 downto 5);
имеет размещение памяти можно следующим образом:
bit 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 - dim1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 dim2 4 4 4 4 3 3 3 3 2 2 2 2 4 4 4 4 3 3 3 3 2 2 2 2 dim3 8 7 6 5 8 7 6 5 8 7 6 5 8 7 6 5 8 7 6 5 8 7 6 5
Это то же размещение соответствует следующему MATLAB 4x3x2 матрица:
bit 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 - dim1 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 dim2 1 1 1 1 2 2 2 2 3 3 3 3 1 1 1 1 2 2 2 2 3 3 3 3 dim3 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
Поэтому, если H является массивом HDL, и M является матрицей MATLAB, следующие индексируемые значения являются тем же самым:
b1 H(0,4,8) = M(1,1,1) b2 H(0,4,7) = M(2,1,1) b3 H(0,4,6) = M(3,1,1) b4 H(0,4,5) = M(4,1,1) b5 H(0,3,8) = M(1,2,1) b6 H(0,3,7) = M(2,2,1) ... b19 H(1,3,6) = M(3,2,2) b20 H(1,3,5) = M(4,2,2) b21 H(1,2,8) = M(1,3,2) b22 H(1,2,7) = M(2,3,2) b23 H(1,2,6) = M(3,3,2) b24 H(1,2,5) = M(4,3,2)
Можно расширить эту индексацию к N-размерностям. В общем случае размерности — если пронумеровано слева направо — инвертируются. Самая правая размерность в HDL соответствует крайней левой размерности в MATLAB.
В зависимости от того, как ваша функция MATLAB симуляции использует данные, которые она получает от симулятора HDL, вы, возможно, должны закодировать функцию, чтобы преобразовать данные в другой тип прежде, чем управлять ею. В следующей таблице перечислены обстоятельства, при которых вы потребовали бы таких преобразований.
Необходимые преобразования данных
Если вам нужна функция к... | Затем... |
---|---|
Вычислите числовые данные, которые получены как тип кроме double |
Используйте datas(inc+1) = double(idata); |
Преобразуйте стандартную логику или битовый вектор к беззнаковому целому или положительному десятичному числу |
Используйте uval = mvl2dec(oport.val) Этот пример принимает стандартную логику, или битовый вектор состоит из символьных литералов
Смотрите |
Преобразуйте стандартную логику или битовый вектор к отрицательному десятичному числу |
Используйте следующее приложение suval = mvl2dec(oport.val, true); Этот пример принимает стандартную логику, или битовый вектор состоит из символьных литералов |
Следующая выборка кода иллюстрирует, что преобразование типа данных данных передало в коллбэку:
InDelayLine(1) = InputScale * mvl2dec(iport.osc_in',true);
Этот пример тестирует значения порта типа VHDL STD_LOGIC
и STD_LOGIC_VECTOR
при помощи all
функция можно следующим образом:
all(oport.val == '1' | oport.val == '0')
Этот пример возвращает True
если всеми элементами является '1'
или '0'
.
Если ваша функция MATLAB симуляции должна возвратить данные в симулятор HDL, вы, возможно, сначала должны преобразовать данные в тип, поддержанный программным обеспечением HDL Verifier. Следующие таблицы приводят обстоятельства, при которых такие преобразования требуются для VHDL и Verilog.
Когда значения данных возвращены в симулятор HDL, размер массива символов должен совпадать с типом HDL, включая продвижение обнуляет, если применимо. Например:
oport.signal = dec2mvl(2)
будет только работать если signal
2-битный тип в HDL. Если тип HDL - что-либо еще, необходимо задать второй аргумент:
oport.signal = dec2mvl(2, N)
где N является количеством битов в типе данных HDL.
Преобразования VHDL для симулятора HDL
Возвратить данные в порт IN типа... | Затем... |
---|---|
STD_LOGIC , STD_ULOGIC , или BIT |
Объявите данные как символ, который совпадает с символьным литералом для желаемого логического состояния. Для iport.s1 = 'X'; %STD_LOGIC iport.bit = '1'; %BIT |
STD_LOGIC_VECTOR , STD_ULOGIC_VECTOR , BIT_VECTOR , SIGNED , или UNSIGNED |
Объявите данные как вектор-столбец или вектор-строку из символов (как задано выше) с одним битом за символ. Например: iport.s1v = 'X10ZZ'; %STD_LOGIC_VECTOR iport.bitv = '10100'; %BIT_VECTOR iport.uns = dec2mvl(10,8); %UNSIGNED, 8 bits |
Массив STD_LOGIC_VECTOR , STD_ULOGIC_VECTOR , BIT_VECTOR , SIGNED , или UNSIGNED | Объявите данные как массив символа текста с размером, который эквивалентен размеру порта VHDL. Смотрите Различия в Индексации массива Между MATLAB и HDL. |
INTEGER or NATURAL | Объявите данные как массив типа iport.int = int32(1:10)'; |
REAL |
Объявите данные как массив типа iport.dbl = ones(2,2); |
TIME | Объявите VHDL iport.t1 = int64(1:10)'; %Simulator time %increments iport.t2 = 1e-9; %1 nsec |
Перечислимые типы | Объявите данные как вектор символов или строковый скаляр для скалярных портов или массива ячеек из символьных векторов или массива строк для портов массива с каждым элементом, равным метке для заданного перечислимого типа. iport.char = {'''A''', '''B'''}; %Character %literal iport.udef = 'mylabel'; %User-defined label |
Символьный массив для стандартного логического или битного представления |
Используйте oport.slva =dec2mvl([23 99],8)'; |
Преобразования Verilog для симулятора HDL
Возвратить данные в input Порт типа... | Затем... |
---|---|
reg , wire |
Объявите данные как символ или вектор-столбец символов, который совпадает с символьным литералом для желаемого логического состояния. Например: iport.bit = '1'; |
Преобразования SystemVerilog для симулятора HDL
Возвратить данные в input Порт типа... | Затем... |
---|---|
reg , wire , logic |
Объявите данные как символ или вектор-столбец символов, который совпадает с символьным литералом для желаемого логического состояния. Например: iport.bit = '1'; |
integer | Объявите данные как вектор-столбец с 32 элементами символов (как задано выше) с одним битом за символ. |
Многомерные массивы reg
/wire
/logic
не поддержаны.