基于Modelsim FLI接口的FPGA仿真技术
3、C语言对 VHDL设计的协同仿真
本文引用地址:https://www.eepw.com.cn/article/273718.htm3.1 构成框图
仿真文件的构成如图 3 所示,包括 HDL 文件和动态链接库(即 C 程序)。图中 C 程序对应的 VHDL 文件要负责声明对应的动态连接库文件名及初始化函数,另外还可以给出一些调用参数。动态链接库中用到的输入输出信号也要在对应的 VHDL 文件中声明。

图3 仿真文件构成示意图
例如,假定有一个DLL文件名为sim.dll,对应的初始化函数为sim_init,有输入信号in1,in2,输出信号 out1,out2,可以这样编写对应的 VHDL 文件 (sim.vhd):
library ieee;
use ieee.std_logic_1164.all;
entity sim is
port(
in1: in std_logic;
in2: in std_logic;
out1: out std_logic;
out2: out std_logic;
);
end entity sim;
architecture dll of sim is
attribute foreign : string;
attribute foreign of dll : architecture is "sim_init sim.dll”
begin
end;
仿真时,仿真器对顶层的 HDL 文件进行仿真,并根据各 VHDL 文件的动态链接库声明来调用、执行相应的动态链接库。
3.2 动态链接库的程序结构
modelsim 在仿真时,根据 VHDL 文件的声明,调用 DLL 文件(如 sim.dll)。在 VHDL文件中已经给出了调用文件(sim.dll)和初始化函数名(如 sim_init),modelsim根据这些信息,调用 sim.dll中的 sim_init 函数,完成初始化工作。初始化包括:
1. 初始化全局变量;
2. 设置 VHDL 输入输出信号与 C 程序变量的对应关系;
3. 设置输出信号的一些初始状态(mti_ScheduleDriver);
4. 设置在仿真器重新仿真(restart)和仿真器退出仿真(quit)等情况下执行的一些函
数(mti_AddRestartCB 和mti_AddQuitCB 等),如释放动态申请的内存等等;
5. 设置敏感表,给出在某些信号发生某些变化(如时钟上升沿等)时执行的函数。
6. 等等。
下面结合 3.1的例子(sim.vhd),给出C 程序的设计步骤。
1.包含头文件,包括 C程序常用的一些头文件和 Modelsim给出的外部语言接口头文件m ti.h。Modelsim给出的外部接口函数说明、类型定义等都在 mti.h 中。
2.定义自己的结构体,这一点主要是为了编程方便,例如输入输出信号对应的变量在各函数中基本上都会用到,可以把这些变量定义成一个结构,便于参数传递。例如,我们可以把 3.1 的 sim.vhd 输入输出信号对应的变量定义成结构:
typedef struct {
driverID out1;
driverID out2;
signalID in1;
signalID in2;
}PortStruct;
其中 driverID 表示输出信号对应的变量;signalID表示输入信号对应的变量。这样,这里定义的变量 out1, out2, in1, in2 就分别与 sim.vhd中的信号 out1, out2, in1, in2 对应。
fpga相关文章:fpga是什么
评论