« 上一篇: 序列检测的另外一种方法 下一篇: VHDL五分频 »
山城棒棒儿军 @ 2006-03-20 23:35

MATLABTestBench函数的编写

(基本上是翻译MATLAB的帮助,本人英文水平有限,不当之处敬请谅解)

 

Link for ModelSim是将VHDL硬件作为一个函数在MATLAB中进行验证,通常情况下,需要编辑一个MATLAB函数来满足Link for
ModelSim
的要求。这里以该工具箱中的实例函数modelsimrand_plot.m加以说明。

1.  MatlabTestBenchM函数的申明:

function [iport, tnext] = modsimrand_plot(oport, tnow, portiofo)

A.     默认情况下,Link for ModelSim假定MATLAB中的TestBench 函数名与要仿真验证的VHDL实体名一致,如果不一致的情况
下,需要用
matlabtb或者matlabeval函数的参数 –mfunc进行指定。

B.      函数定义时必须具有两个输出参数(这里为iport tnext),三个输入参数(本例子中是optorttnowportinfo),它们
的具体含义如下:

iport:描述VHDL实体中输入(IN)管脚的结构体;

tnext:指定下一次调用MATLAB函数的时间;

oport:接收相应VHDL实体中在特定时刻tnow时刻从输出(OUT)管脚的信号值;

tnow:接受本次MATLAB被调用的仿真时间;

portinfo:仅在第一激励该函数的时候有用,用来接收相应VHDL实体的管脚描述信息的一个矩阵。

C.     可以采用输出参数iport来代替或者补充诸如ModelSimforce命令等其他信号源的驱动输入信号。在仿真过程中可以采用混
合的信号方式作为输入源,但要注意在采用多个信号源驱动同一个
iport的时候,需要有一个仲裁函数来处理信号连接。

 

2.  函数的输出参数iporttnext必须采用类似如下方式初始化为空值:

tnext = [ ];

iport = strunct( );

 

3.  注意在仿真实体中定义的端口的数据类型。Link for ModelSim接口自动实现VHDL中的数据类型与MATLAB中的数据类型之间进行
相互转换。在编写
MATLAB函数的时候,必须很清楚的知道需要从ModelSim中接收到的数据的类型。

本例子中涉及三个STD_LOGIC类型的input端口和一个STD_LOGIC_VECTORoutput端口。接口自动地实现STD_LOGIC类型与
一个字符的转换,以及
STD_LOGIC_VECTOR与字符列的转换,其中每bit转换为一个字符。

 

4.  注意将通过Link for ModelSimModelSim中接收到的数据转换为MATLAB环境中计算需要的数据,如本例中的语句:

  ud.buffer(cyc) = mvl2dec(oport.dout)

这里,函数通过Link for ModelSim在输入参数oport中接收STD_LOGIC_VECTOR类型的OUTPUT端口信号作为一个二进制字符
串,通过函数
mvl2dec转换10进制数据进行算术计算。

 

5.  与普通MATLAB函数调用类似,可以在MATLAB函数中的适当位置设置断点,进行调试、查看相应参数。当执行到MATLAB中断点
时,
ModelSim中的执行也将暂停挂起。

附:

1.       实例中VHDL代码

---------------------------------------------------

-- Psuedo Random Word Generator

-- Demonstration of 'Link for ModelSim'    

--

--

--

--  Modelsim

-- >vsimmatlab work.modsimrand

-- >matlabtb modsimrand -mfunc modsimrand_plot -rising /modsimrand/clk

-- >force sim:/modsimrand/clk 0 0,1 5 ns -repeat 10 ns

-- >force sim:/modsimrand/clk_en 1

-- >force sim:/modsimrand/reset 1 0,0 50 ns

-- >run 80000

--

--  Copyright 2003 The MathWorks, Inc.

--  $Revision: 1.2 $  $Date: 2003/11/05 18:40:23 $

---------------------------------------------------

 

---------------------------------------------------

-- Entity: modsimrand

-- Pseudo random algorithm

-- Implements a uniform PN generator using

-- a fibonacci sequence. 

---------------------------------------------------

LIBRARY IEEE;

USE IEEE.std_logic_1164.all;

USE IEEE.numeric_std.all;

 

ENTITY modsimrand IS

PORT (

  clk    : IN std_logic ;

  clk_en : IN std_logic ;

  reset  : IN std_logic ;

  dout   : OUT std_logic_vector (31 downto 0) );

END modsimrand ;

 

ARCHITECTURE behavioral OF modsimrand IS

  TYPE    regfile_t IS ARRAY (NATURAL range <>) OF unsigned (31 downto 0);

  SIGNAL  regfile : regfile_t(54 DOWNTO 0);

BEGIN

  --

  PROCESS(clk)

  BEGIN

    IF (clk'EVENT AND clk = '1') THEN

      IF clk_en = '1' THEN

    IF reset = '1' THEN  -- Sync Reset

      regfile(54 DOWNTO 0) <= (OTHERS=>(OTHERS=>'1'));

    ELSE

  regfile(54 DOWNTO 1) <= regfile(53 DOWNTO 0);

  regfile(0) <= regfile(54) + regfile(23);

    END IF;

      END IF;

    END IF;

 

END PROCESS;

dout <= STD_LOGIC_VECTOR(regfile(0));

 

END behavioral;

 

-----------------------------------------------------

-- [EOF] modsimrand.vhd

 

 

 

 

 

2.       实例中MATLABTestBench函数

function [iport,tnext] = modsimrand_plot(oport, tnow, portinfo)

%MODSIMRAND_PLOT HDL simulator data transfer for demo "modsimrand"

%    MODSIMRAND_PLOT is executed by HDLDaemon on request from the HDL simulator.

%

%    ModelSim Entry - Executed by HDLDaemon on request from the HDL simulator

%     MODSIMRAND_PLOT(OPORT,TNOW,PORTINFO)

%     MODSIMRAND_PLOT(OPORT,TNOW)

%     Where

%       OPORT.DATA    - VHDL signal DATA value at simulation time TNOW

%       TNOW          - Simulation time (in seconds)

%       PORTINFO.DATA - Structure of port information (first invocation)

%

%    Visualize statistics of the VHDL lagged-Fibonacci pseudo-random

%    number generator.  Invoked by rising-edge transition on the clock

%    for 'entity_name.vhd'.

 

%   Copyright 2003-2004 The MathWorks, Inc.

%   $Revision: 1.1.6.4 $  $Date: 2004/07/21 06:19:11 $

 

persistent ud;  % userdata

 

tnext = [];

iport = struct();

 

% Plot information in DEMO_NAME demo display

 

modsim_plot = findobj('Tag', 'ModsimrandFig');

 

if isempty(modsim_plot)

  % there is no plot window; crete one

  draw_modsimrand_fig;

end

   

if nargin == 3 || isempty(ud),  % first time being called?

 

    % Get handles to GUI plots:

   

    hax_vals = findobj('Tag','StartupPlot');

    hax_hist = findobj('Tag','HistoPlot');

 

    nbins         = 26;     % # of bins in histogram - no need to retain in UserData

    ud.bufsiz     = 200;    % # values to hold in buffer

    ud.startDelay = 2400;   % # ticks to display as "startup values", omitted from histogram

    ud.inc        = 0;      % # of callback events to this function

    ud.buffer = zeros(1,ud.bufsiz);          % buffer data values before updating GUI

    ud.bins   = zeros(1,nbins);              % histogram bins

    ud.edges  = linspace(0, 2.^32, nbins+1); % histogram bin edges

    ud.hline  = get(hax_vals,'Children');    % HG handle to line plot

    ud.hbars  = get(hax_hist,'Children');    % HG handle to bar chart

   

    set(hax_vals,'xlim',[1 ud.startDelay], 'ylim',[0 2.^32]);

    set(hax_hist,'ylim',[0 1.5 ./ nbins]);

    set(ud.hline, 'xdata',1:ud.startDelay, ...

                  'ydata',zeros(1,ud.startDelay));

    set(ud.hbars, 'FaceVertexCData',1);

end

 

% Update every time data is received from HDL simulator:

%

ud.inc = ud.inc+1;                % increment function-call counter

cyc = 1+mod(ud.inc-1, ud.bufsiz); % cyclic counter, 1:bufsiz

ud.buffer(cyc) = mvl2dec(oport.dout);  % buffer scalar values from simulator

if cyc == ud.bufsiz,              % update GUI every n'th scalar received

    if ud.inc <= ud.startDelay,

        % Plot values of initial data

        if ishandle(ud.hline), % in case GUI closed

            ydata = get(ud.hline,'ydata');

            ydata( (ud.inc-ud.bufsiz+1) : ud.inc ) = ud.buffer;

            set(ud.hline, 'ydata',ydata);

        end

    else

        % Generate running histogram of remaining data

        if ishandle(ud.hbars),  % in case GUI closed

            tmpbins = histc(ud.buffer,ud.edges);

            ud.bins = ud.bins + tmpbins(1:end-1);    % last bin from histc is always 0

            xdata = get(ud.hbars,'xdata');  % xxx bug fix: xdata changes

            ydata = get(ud.hbars,'ydata');

            ydata(2:3,:) = [ud.bins; ud.bins]./sum(ud.bins);

            set(ud.hbars, 'ydata',ydata, 'xdata',xdata); % xxx bug fix: xdata changes

        end

    end

    drawnow;  % update GUI displays

end

 

% [EOF] modsimrand_plot.m

 

 





评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定