Если вашему HDL-приложению необходимо отправить HDL- данных в MATLAB® функция может потребоваться сначала преобразовать данные в тип, поддерживаемый MATLAB и программным обеспечением HDL Verifier™.
Чтобы запрограммировать функцию MATLAB для HDL- модели, вы должны понять преобразования типов, необходимые вашему приложению. Также может потребоваться обработать различия между соглашениями об индексации массивов, используемыми используемым HDL, и MATLAB (см. следующий раздел).
Типы данных аргументов, переданных в функцию, определяют следующее:
Типы преобразований, необходимые перед обработкой данных
Типы преобразований, необходимые для возврата данных в Симулятор HDL
В следующей таблице приведено описание преобразования поддерживаемого VHDL в программное обеспечение HDL Verifier.® типы данных для типов 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-to-MATLAB
Типы верилогов... | Преобразует в... |
---|---|
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
functions, будьте осторожны, чтобы назначать и интерпретировать значения последовательно в обоих приложениях.
В 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, размер массива char должен совпадать с типом 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 или 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 |
Перечисляемые типы | Объявите данные как вектор символов или строковый скаляр для скалярных портов или массива ячеек с векторами символов или строковых массивов для портов массива с каждым элементом, равным метке для заданного перечисляемого типа. The iport.char = {'''A''', '''B'''}; %Character %literal iport.udef = 'mylabel'; %User-defined label |
Символьный массив для стандартной логики или битового представления |
Используйте oport.slva =dec2mvl([23 99],8)'; |
Преобразования верилога для Симулятора HDL
Возврат данных в input Порт типа... | Тогда... |
---|---|
reg , wire |
Объявите данные как символ или вектор-столбец символов, которые соответствуют литералу символов для необходимого логического состояния. Для примера: iport.bit = '1'; |
Преобразования SystemVerilog для Симулятора HDL
Возврат данных в input Порт типа... | Тогда... |
---|---|
reg , wire , logic |
Объявите данные как символ или вектор-столбец символов, которые соответствуют литералу символов для необходимого логического состояния. Для примера: iport.bit = '1'; |
integer | Объявите данные как 32-элементный вектор-столбец символов (как определено выше) с одним битом на символ. |
Примечание
Многомерные массивы reg
/ wire
/ logic
не поддерживаются.