В этом примере показано, как спроектировать FPGA (Программируемая пользователем вентильная матрица) реализация готовый ответ Доплера области значений, чтобы совпадать с соответствующей поведенческой моделью в Simulink® с помощью Phased Array System Toolbox™. Чтобы проверить функциональную корректность модели реализации, мы сравниваем симуляцию выход модели реализации с той из поведенческой модели. Термин развертывание здесь подразумевает разработку модели, которая подходит для реализации на FPGA. Модель является готовой реализацией, и это будет проверено в примере. Рабочий процесс HDL спроектирован в фиксированной точке.
Phased Array System Toolbox™ обеспечивает поведенческую модель с плавающей точкой для ответа Доплера области значений через phased.RangeDopplerResponse Системный объект. Эта поведенческая модель используется, чтобы проверить правильность модели реализации.
Fixed-Point Designer™ обеспечивает типы данных и инструменты для разработки фиксированной точки и алгоритмов одинарной точности, чтобы оптимизировать эффективность на встроенном оборудовании. Битно-истинные симуляции могут быть выполнены, чтобы наблюдать удар ограниченного диапазона и точности, не реализовывая проект в оборудовании.
Этот пример использует HDL Coder™, чтобы сгенерировать HDL-код из разработанной модели Simulink и проверяет HDL-код с помощью HDL Verifier™. HDL Verifier™ используется, чтобы сгенерировать модель испытательного стенда co-симуляции, чтобы проверить поведение автоматически сгенерированного HDL-кода. Испытательный стенд использует ModelSim® для Co-симуляции, чтобы проверить сгенерированный HDL-код.
phased.RangeDopplerResponse системный объект генерирует Доплера области значений Респонса, использующего следующий алгоритм:
Быстро-разовая размерность: фильтрует сигнал с согласованным фильтром, чтобы сгенерировать ответ области значений
Медленно-разовая размерность: вычислите БПФ, чтобы сгенерировать Доплеровский ответ, согласованным фильтром является КИХ-Фильтр с коэффициентами как противоположная временем копия переданного сигнала.
Когда мы принимаем входные данные, чтобы быть матрицей M x N, где M является количеством ячеек, и N является количеством импульсов, чтобы вычислить ответ области значений, мы используем КИХ-Фильтр через (быстро-разовые) строки и вычисляем БПФ через (медленно-разовые) столбцы.
Мы используем данные в качестве примера из phased.RangeDopplerResponse документации для входного сигнала и параметров блоков, примером является availalble в phased.RangeDopplerResponse примере
Мы сериализируем и десериализовываем сигнал с помощью блоков respectively.These блоков Serializer1D/Deserializer1D, имеют ввод и вывод ограничения для генерации кода, таким образом, мы устанавливаем Длину БПФ как 64 и используем подмножество куба входных данных.
Размер слова 32 битов и дробная длина 31 бита используются для модели реализации
Следующая команда используется, чтобы открыть Модель Simulink.
modelname = 'SimulinkRangeDopplerProcessingHDLWorkflowExample'; open_system(modelname); %Ensure model is visible and not obstructed by scopes open_system(modelname); set(allchild(0),'Visible','off');
Модель Simulink состоит из двух ветвей от блока Input. Верхняя ветвь является поведенческой моделью с операциями с плавающей точкой phased.RangeDopplerResponse Системного объекта. Нижняя ветвь является функционально эквивалентной моделью реализации в фиксированной точке, спроектированной с блоками, которые поддерживают генерацию HDL-кода от Библиотеки Simulink® HDL Coder™.
Вход и Коэффициенты сгенерированы из данных Доплера области значений в качестве примера. Вход является матрицей MxN, где M является количеством ячеек области значений (быстро-разовая размерность), и N является количеством импульсов (медленно-разовая размерность). Выход phased.RangeDopplerResponse является матрицей MxL, где M является количеством ячеек области значений, и L является Длина БПФ. Начиная с ввода и вывода модели Implementation должны быть потоки данных, вход сериализируется и квантуется в, 'Сериализируют и Квантуют' подсистему, и выход десериализовывается, чтобы сформировать матричную карту Доплера области значений при выходе в 'Deserialize и Dequantize' подсистема.
Следующая команда открывается, 'Сериализируют и Квантуют' подсистему
open_system([modelname '/Serialize and Quantize'])
Входные данные являются нулем, дополненным для КИХ-задержки фильтра (от Оптимизированного HDL), использование матрицы конкатенирует блок. Данные затем сериализируются блоком Serializer1D, используемым в каскаде с изменением, и тип данных преобразуют (квантуйте к фиксированной точке), блок.
Следующая команда открывает 'Deserialize и Dequantize' подсистема
open_system([modelname '/Deserialize and Dequantize'])
Этот блок использует блок Deserialiser1D, который использует тип данных, преобразуют и изменяют блоки, чтобы преобразовать поток вывода в карту Доплера области значений
Следующая команда используется, чтобы открыть 'Согласованную фильтрацию - Область значений, Обрабатывающая' подсистему
open_system([modelname '/RangeDopplerResponseHDL/Matched Filtering - Range Processing'])
Входной поток обрабатывается с блоком Disctete FIR Filter HDL Optimized, с соответствующими коэффициентами, через быстро-разовое (строка) размерность, чтобы получить ответ области значений. Используемый блок является HDL, оптимизированным с задержкой 7 Циклов. Это указывает в КИХ-фильтре, должны быть сброшены к начальному значению 0 после каждой строки. Это выполняется при помощи булевой прямоугольной волны - реализованное использование Счетчика и Сравнивание с постоянным блоком.
Следующая команда используется, чтобы открыть 'Buffer & Transpose - Столбец' подсистема
open_system([modelname '/RangeDopplerResponseHDL/Buffer & Transpose - Column'])
Обработанные данные области значений десериализовываются с помощью, расположил каскадом блоки Deserializer1D и преобразован в матричный формат с изменять блоком. Эти данные теперь дополнены нулем и транспонированы для вычисления БПФ через медленно-разовое (столбец) размерность. Область значений обработанные и транспонированные данные теперь сериализируется снова для расчета БПФ (Доплер, обрабатывающий)
%The following command is used to open the 'FFT - Doppler Processing' subsystem open_system([modelname '/RangeDopplerResponseHDL/FFT - Doppler Processing'])
БПФ переданного потоком (через столбец) данные вычисляются с помощью блока FFT HDL Optimized, который имеет задержку 173 циклов. Основание потоковой передачи 2^2 архитектура используется с Длиной БПФ 64.
Следующая команда используется, чтобы открыть 'Буфер - подсистема' Сдвига БПФ
open_system([modelname '/RangeDopplerResponseHDL/Buffer - FFT Shift'])
Доплер обработал последовательные данные, десериализован с помощью блоков Deserialized1D и транспонирован. БПФ обработал потребности данных, которые будут перестроены, чтобы иметь нулевые центральные данные о спектре, которые эмулированы при помощи комбинации селекторных блоков, и матрица конкатенируют.
Следующая команда используется, чтобы открыться, 'Сериализируют Выход' подсистема
open_system([modelname '/RangeDopplerResponseHDL/Serialize Output'])
Данные о карте Доплера области значений после обработки в форме матрицы, которая затем сериализируется с помощью изменения и блока Serializer1D для потока вывода.
Модель может быть симулирована путем нажимания кнопки 'Play' или использования sim команды как показано ниже,
sim(modelname);
Чтобы проверить функциональную корректность модели Implementation, мы вычитаем матрицу ответа поведенческой модели из матрицы ответа модели реализации и проверяем, что различие (ошибка) близко к нулю (квантование в модели реализации).
Мы экспортируем данные об ответе от Simulink® до MATLAB® Workspace, с помощью блока To Workspace, в формате массивов. Мы вычитаем поведенческий reponse вектор из ответа модели реализации, изменяем форму ошибочной матрицы в 1D массив и строим ошибку с индексом элемента в оси X и ошибку в оси Y. Мы используем функцию imagesc, чтобы отобразить карту Доплера области значений. Следующий скрипт может использоваться, чтобы построить ответ и ошибку.
%Uncomment the following lines of Code to visualize the response map % % %Behavioral Output % behavioralResponse = out.RangeDopplerResponseBehavioral(:,:,1); % Response from To Workspace Block % behavioralResponsedB = mag2db(abs(behavioralResponse)); % Convert to dB % rangeGrid = out.RangeGrid(:,1,1); % Range Grid % dopplerGrid = out.DopplerGrid(:,1,1); % Doppler Grid % % %The following block of code is used to visualize the range-Doppler (Behavioral) map % % f1 = figure(1); % Figure handle % f1.Name = 'Behavioral'; % Figure Name % fax1 = axes; % Axis Handle % imagesc(fax1,dopplerGrid,rangeGrid,behavioralResponsedB) % % xlabel(fax1,'Doppler'); % ylabel(fax1,'Range') % title(fax1,'Behavioral Response') % % %HDL Output % idx = find(out.Valid); % Search for valid output % HdlResponse = out.RangeDopplerResponseHdl(:,:,idx(1)); % Response from To Workspace Block % HdlResponsedB = mag2db(abs(HdlResponse)); % Convert to dB % % %The following block of code is used to visualize the Range-Doppler (HDL) map % % f2 = figure(2); % Figure handle % f2.Name = 'HDL'; % Figure Name % fax2 = axes; % Axis handle % imagesc(fax2,dopplerGrid,rangeGrid,HdlResponsedB); % Use behavioral output of range and doppler grid% % % xlabel(fax2,'Doppler') % ylabel(fax2,'Range') % title(fax2,'HDL Response') % % %Error % %The following line subtracts Behavioral Response from HDL % %response to calculate the error % errorMatrix = abs(HdlResponse - behavioralResponse); % Matrix Subtract % % %The following line converts the error matrix into a row vector which can % %be visualised on a 2D axis % % errorStream = reshape(errorMatrix,1,[]); % Convert error matrix to 1D, row wise % % %The follwing line finds the index and the value of maximum error between % %HDL and behavioral model % % Ymax = max(errorStream); % Find Maximum Error % Xmax = find(errorStream == Ymax); % Find index of maximum error % % %The following block of code plots the error on a 2D plot and also annotates the % %maximum error between HDL and behavioral response % f3 = figure(3); % Figure handle % f3.Name = 'Error'; % Figure Name % fax3 = axes; % Axis handle % plot(fax3,errorStream) % Plot % % ylabel(fax3,'Error'); % xlabel(fax3,'Data Point Index') % title(fax3,'Error between Behavioral and HDL Model'); % % Annotate the Maximum error % textstr = strcat(' ErrorMax = ',num2str(Ymax)); % Display Maximum error as a text % text(fax3,Xmax,Ymax,textstr); %
Область значений Доплеровская карта и ошибка между поведенческим и моделью реализации как показано ниже
Этот раздел покрывает процедуру, чтобы сгенерировать HDL-код для модели реализации Доплера области значений Респонса и проверить функционально правильность. Поведенческая модель вводит ссылочные значения, чтобы гарантировать, что выход от HDL в пределах допуска. На основе настройки модели Simulink, аналогичной описанному выше, Модель реализации созданные с использованием блоки вычислений с фиксированной точкой та генерация HDL-кода поддержки. В качестве альтернативы, если вы начинаете с новой модели, можно запустить hdlsetup (HDL Coder™), чтобы сконфигурировать модель Simulink для генерации HDL-кода. Чтобы сконфигурировать модель Simulink для создания испытательного стенда, откройте Настройки Simulink Модели, выберите Test Bench под генерацией HDL-кода в левой панели и проверяйте тестовую модель HDL и Co-имитационную-модель в группе Выходных свойств Генерации Испытательного стенда.
После того, как реализация фиксированной точки проверяется, и модель реализации приводит к тем же результатам как ваша поведенческая модель с плавающей точкой, можно сгенерировать HDL-код и испытательный стенд. Для генерации кода и испытательного стенда, установленного параметры генерации HDL-кода в диалоговом окне Параметров конфигурации. Следующие параметры в Настройках Модели устанавливаются под генерацией HDL-кода:
Цель: инструмент синтеза Xilinx Vivado; семейство Virtex7; Устройство xc7vx485t; пакет ffg1761, скорость-1; и целевая частота 300 МГц.
Оптимизация: Снимите флажок со всей оптимизацией
Глобальные Настройки: Установите тип Сброса на Асинхронный
Испытательный стенд: Выберите испытательный стенд HDL, Co-имитационную-модель и Систему испытательный стенд DPI Verilog
После того, как Модель настраивается, HDL Workflow Advisor может быть вызван, чтобы сгенерировать HDL-код с помощью HDL Coder™, также используют HDL Verifier™, чтобы сгенерировать Систему Испытательный стенд DPI Verilog, чтобы протестировать модель. Чтобы вызвать HDL Workflow Advisor щелкают правой кнопкой по подсистеме RangeDopplerResponseHDL и перешли к HDL-коду и щелкают левой кнопкой по HDL Workflow Advisor. Вместо того, чтобы использовать советника Рабочего процесса HDL следующие строки кода могут также использоваться, чтобы сгенерировать HDL-код и Систему Испытательный стенд Verilog
%Uncomment the following two lines to generate HDL code and test bench. % makehdl([modelname '/RangeDopplerResponseHDL']); % Generate HDL code % makehdltb([modelname '/RangeDopplerResponseHDL']); % Generate Cosimulation test bench
После генерации HDL-кода и испытательного стенда новая модель Simulink, названная gm _ <modelname> _mq содержащий блок Simulator ModelSim®, создается в вашей рабочей директории, которая выглядит так:
%To open the test bench model, uncomment the following lines of code % modelname = ['gm_',modelname,'_mq']; % open_system(modelname);
Запустите ModelSim® и запустите co-имитационную-модель, чтобы отобразить результаты симуляции. Можно нажать на кнопку воспроизведения на верхней части холста Simulink, чтобы запустить испытательный стенд, или можно сделать это через командное окно из кода ниже
%Uncomment the following line, to run the test bench. % sim(modelname);
Тестовая модель Simulink® заполнит QuestaSim® с сигналом модели HDL и Time Scope в Simulink®.
Осциллографы испытательного стенда показывают выход вектора отклика с комплексным знаком из модели реализации и от co-симуляции выход, а также ошибка между ними.
В данном примере размер слова 32 битов и дробная длина 31 бита использовались для проекта, симуляции и реализации. Существуют компромиссы, сопоставленные с увеличением точности данных относительно использования ресурса.
Следующий рисунок показывает точность относительно размера слова
Следующий рисунок показывает использование LUT среза относительно размера слова
Следующий рисунок показывает использование Регистров среза относительно размера слова
Следующий рисунок показывает использование DSP относительно размера слова
Следующий рисунок показывает использование блока RAM Tile относительно размера слова
Этот пример демонстрирует рабочий процесс для разработки модели Simulink для HDL Coder™ совместимый блок ответа Доплера области значений, проверьте результаты с эквивалентной поведенческой настройкой от Phased Array System Toolbox™. Затем пример также подчеркивает на генерации HDL-кода для реализации фиксированной точки, и проверьте сгенерированный код в Simulink® для функциональной корректности. Пример %This также продемонстрировал процесс подготовки и запуска ModelSim к co-simulate HDL-код, и сравните его выход с выходом, сгенерированным моделью реализации HDL. Co-симуляция использует ModelSim® для симуляции HDL-кода и сравнивает результаты с выходом, сгенерированным моделью реализации.