Реализация фильтрующего компонента генератора в MATLAB

®

В этих примерах показано, как MATLAB ® может использоваться для реализации компонента фильтра, используемого в модели. Пример компилирует генератор VHDL/Verilog, задает компонент фильтра, который моделируется с помощью MATLAB, и запускает симуляцию HDL. Этот пример требует временной директории, чтобы сгенерировать рабочий проект ModelSim VHDL или Incisive Verilog. После создания HDL-проекта этот пример запускает Симулятор HDL (для этого требуется доступ к ModelSim/Incisive из командной строки). Этот пример использует общую память для завершения ссылки и поэтому требует, чтобы симулятор HDL находился на том же компьютере, что и MATLAB. После компиляции проекта симуляция может быть запущена из ModelSim/Incisive.

В этом примере были разработаны генераторы VHDL в ModelSim и генератор Verilog в Incisive, и наша задача состоит в том, чтобы найти фильтр очистки для генератора, который удовлетворяет нашим потребностям.

Первый конечная импульсная характеристика является фильтром 31-го порядка (32-тап) без избыточной дискретизации. Второй фильтр является фильтром 127-го порядка (128-тап) с 4X избыточной дискретизацией. Третий фильтр является фильтром 255-го порядка (256-тап) с 8X избыточной дискретизацией. Все три фильтра имеют одну и ту же линию задержки, и избыточная дискретизация реализована с помощью полифазного метода.

Файл simple_osc.vhd/ simple_osc.v содержит простой генератор, разработанный в VHDL/Verilog.

Файл osc_filter.vhd/ osc_filter.v содержит компонент MATLAB, который мы моделируем. Он содержит сущность с пустой архитектурой. Команда matlabcp управляет выходами VHDL/Verilog и проверяет входы VHDL/Verilog образца, созданного из этой сущности.

Файл osc_top.vhd/ osc_top.v содержит проводку верхнего уровня между генератором и компонентом MATLAB.

Файл oscfilter.m/ oscfilter_incisive.m содержит фактическую поведенческую модель компонента.

Для ModelSim:

Можно также задать переменные «UsrTclCmds» и «RunMode» перед вызовом программы MATLAB с командами tcl и runmode ModelSim. Примеры:

UsrTclCmds = {'run 100000'}; RunMode = 'Batch' или 'CLI' или 'GUI';

srcfile1 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos','vhdl','osc','simple_osc.vhd');
srcfile2 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos','vhdl','osc','osc_filter.vhd');
srcfile3 = fullfile(matlabroot,'toolbox','edalink','extensions','modelsim','modelsimdemos','vhdl','osc','osc_top.vhd');

ModelSim использует формат директории стилей UNIX ®, который использует косые черты («/») вместо обратных косых черт («\»).

unixsrcfile1 = ['"' strrep(srcfile1,'\','/') '"'];
unixsrcfile2 = ['"' strrep(srcfile2,'\','/') '"'];
unixsrcfile3 = ['"' strrep(srcfile3,'\','/') '"'];

Для резкого:

srcfile1 = fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Oscillator','simple_osc.v');
srcfile2 = fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Oscillator','osc_filter.v');
srcfile3 = fullfile(matlabroot,'toolbox','edalink','extensions','incisive','incisivedemos','Oscillator','osc_top.v');

Создайте директорию проекта

Создадим временную рабочую директорию, в котором будет сгенерирован проект.

Для ModelSim:

if strcmp(computer,'PCWIN'),
    projdir = tempdir;  % Change to writable directory of your choosing
else
    projdir = tempname;
    if ~exist(projdir,'dir')
        mkdir(tempdir,strrep(projdir,tempdir,''));
    end
end
unixprojdir = strrep(projdir,'\','/');

Для резкого:

projdir = tempname;
warnstatus = warning('off','MATLAB:MKDIR:DirectoryExists');
mkdir(projdir);
warning(warnstatus);

Запуск сервера MATLAB

Сначала запускаем сервер MATLAB, hdldaemon, таким образом, чтобы он использовал коммуникацию общей памяти. Сначала проверьте, работает ли сервер с общей памятью. Если hdldaemon не работает, он запускается. Или, если он работает с использованием связи разъема TCP/IP, он завершается и перезапускается с помощью передачи общей памяти.

dstatus = hdldaemon('status');
% Use shared memory
if isempty(dstatus)
    % not running - start it
    dstatus = hdldaemon;    % tell user what's happening
elseif strcmp(dstatus.comm,'shared memory')
    % already running
    % user knows what's happening from previous hdldaemon('status')
elseif strcmp(dstatus.comm,'sockets')
    % running with different comm - stop and restart it
    disp('Shutting down HDLDaemon to restart it with shared memory');
    hdldaemon('kill');
    dstatus = hdldaemon;
else
    error(message('HDLLink:modsimosc:UnexpectedDaemonStatus'));
end

Задайте команды TCL

Далее задаем команды Tcl, которые будут выполняться в Симулятор HDL до запуска симуляции.

ModelSim:

tclcmd = {  ['cd ',unixprojdir],...
            'vlib work',... %create library (if necessary)
           ['vcom -performdefaultbinding ' unixsrcfile1],...
           ['vcom -performdefaultbinding ' unixsrcfile2],...
           ['vcom -performdefaultbinding ' unixsrcfile3],...
            'vsimmatlab  work.osc_top ',...
            'matlabcp u_osc_filter -mfunc oscfilter',...
            'add wave sim:/osc_top/clk',...
            'add wave sim:/osc_top/clk_enable',...
            'add wave sim:/osc_top/reset',...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.001 -offset 50000 ',...
            'sim:/osc_top/osc_out'],...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.00003125 -offset 50000 ',...
            'sim:/osc_top/filter1x_out'],...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.00003125 -offset 50000 ',...
            'sim:/osc_top/filter4x_out'],...
           ['add wave -height 100 -radix decimal -format analog-step -scale 0.00003125 -offset 50000 ',...
            'sim:/osc_top/filter8x_out'],...
            'force sim:/osc_top/clk_enable 1 0',...
            'force sim:/osc_top/reset 1 0, 0 120 ns',...
            'force sim:/osc_top/clk 1 0 ns, 0 40 ns -r 80ns',...
            };
% Add "if any" User tcl commands at the end
if exist('UsrTclCmds','var')
    tclcmd(end+1) = UsrTclCmds;
end

Резцовые:

tclcmd = {  ['cd ',projdir],...
           ['exec ncvlog -64bit ' srcfile1],...
           ['exec ncvlog -64bit ' srcfile2],...
           ['exec ncvlog -64bit ' srcfile3],...
           'exec ncelab -64bit -access +wc osc_top',...
            ['hdlsimmatlab -gui  osc_top ', ...
           ' -input "{@matlabcp osc_top.u_osc_filter -mfunc oscfilter_incisive}"',...
           ' -input "{@force osc_top.clk_enable 1 -after 0ns}"',...
           ' -input "{@force osc_top.reset 0 -after 0ns 1 -after 40ns 0 -after 120ns}"',...
           ' -input "{@force osc_top.clk 1 -after 0ns 0 -after 40ns -repeat 80ns}"',...
           ' -input "{@simvision  {set w \[waveform new\]}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals osc_top.clk_enable}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals osc_top.clk}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals osc_top.reset}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.osc_out)}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.filter1x_out)}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.filter4x_out)}}"',...
           ' -input "{@simvision {waveform add -using \$w -signals signed(osc_top.filter8x_out)}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.osc_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.filter1x_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.filter4x_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform format -using \$w signed(osc_top.filter8x_out) -trace analogSampleAndHold}}"',...
           ' -input "{@simvision {waveform axis range -min -50000 -max 50000 -using \$w signed(osc_top.osc_out)}}"',...
           ' -input "{@simvision {waveform axis range -min -1.5e6 -max 1.5e6 -using \$w signed(osc_top.filter1x_out)}}"',...
           ' -input "{@simvision {waveform axis range -min -1.5e6 -max 1.5e6 -using \$w signed(osc_top.filter4x_out)}}"',...
           ' -input "{@simvision {waveform axis range -min -1.5e6 -max 1.5e6 -using \$w signed(osc_top.filter8x_out)}}"'
           ]};

Запустите Симулятор HDL

Теперь запускаем Симулятор HDL через команду vsim (в случае с ModelSim) или nclaunch (в случае с Incisive). The 'tclstart' свойство приводит к выполнению заданных команд Tcl при запуске. После запуска симулятора, чтобы запустить симуляцию, используйте команду run, указав соответствующее время симуляции. Для примера типа run 10000 ns в ModelSim или 'run 10000' в Резцовой консоли. можно также задать RunMode = 'Batch' или 'CLI' или 'GUI' перед запуском этого примера. Если не задан, режим выполнения по умолчанию является 'GUI'.

ModelSim:

if exist('RunMode','var')
    vsim('tclstart',tclcmd,'runmode',RunMode);
else
    vsim('tclstart',tclcmd);
end

Резцовые:

nclaunch('tclstart',tclcmd);

Теперь проверьте результаты в окне ModelSim/Incisive plot. Вы увидите, что фильтр без избыточной дискретизации делает мало хорошего, но 4X и 8X фильтры с избыточной дискретизацией выглядят намного лучше.

На этом этот пример завершается.

Обязательно закройте симулятор HDL, как только вы сделаны с этим примером, так как каждый раз, когда пример запускается, запускается новый симулятор HDL.