概述
ISE 是由 Xilinx 公司开发的一款集成开发环境,主要用于 Xilinx FPGA 和 CPLD(复杂可编程逻辑设备)的设计。ISE 提供了从设计编写、设计综合、时序分析、到最后的设备编程等一系列设计步骤的支持。
ModelSim 是由 Mentor Graphics(现为 Siemens 业务部门)开发的一款硬件仿真工具,用于仿真和验证数字设计(包括FPGA和ASIC设计)。ModelSim 支持多种硬件描述语言,包括 VHDL、Verilog 和 SystemVerilog,是行业中广泛使用的仿真平台之一。
通常我们喜欢使用Modelsim作为仿真工具,但其本身并未集成Xilinx提供的IP核,如当我们需要用到ISE中提供的FIFO,RAM等IP时,Modelsim则无法识别。注意ModelSim仿真XilinxIP核"是指单独运行ModelSim 进行仿真,而不是从Xilinx ISE 中调用ModelSim进行IP核的仿真。
本文即介绍了如何将Xilinx ISE的IP库编译到Modelsim中,使它可以独立仿真。
一、编译Xilinx的IP核
1、编译IP核
这里我们默认已经安装了Modelsim软件和ISE软件。那么在电脑的开始菜单中会找到Simulation Library Compilation Wizard工具。
(64位ISE低版本对win8及以上系统兼容性不好,会导致打开工程或add source失败,本次编译也不会成功,因此建议安装32位的版本)
管理员身份运行,选择Modelsim、下面是Modelsim的启动路径,一般它会自动找到,如果没找到就手动选一下,即Modelsim的安装路径。点击next。
接着在下图中选择第一项:Both VHDL and Verilog。点击next。
选择你需要用的器件,全选的话编译时间会长,性能不是很差的电脑时间也不会太久,建议全选。继续next。
这里默认,不用动,继续next。
红框的目录是编译好的IP核存放的地址,它默认放进了ISE的安装路径里,编译好后他会在ISE安装文件中产生两个叫verilog和VHDL的文件夹。
建议在Modelsim安装路径下新建一个文件夹存放他们,方便日后管理。点击next,有的版本可能是Launch Compile Process,就开始编译了,需要编译几分钟。
编译结束后,可能会报一些编译错误,不影响使用,直接完成即可。编译IP核到此结束。进行下一步。
2、更改配置文件
进入到刚才设置的IP核编译文件路径(即上图设置的文件路径),找到文件名为modelsim.ini的文件。
这里部分教程显示的操作是:
打开,选中如下图所示,从secureip这一行开始,到[DefineOptionset]之前这一段的内容,复制。
然后在modelsim安装的根目录录下找到同样文件名的modelsim.ini的文件,右键文件属性去掉只读属性,然后打开它,找到
vital2000 = $MODEL_TECH/…/vital2000这一行,
在它下面另起一行,将刚才复制的内容粘贴到这里,
本人的实际操作中并未找到[DefineOptionset],因此IP核编译文件路径中的modelsim.ini文件,我只复制了下面这几行,到[vcom]截止,可能是我使用的版本比较低,结果仍然是成功的。其他操作和上面相同,将其复制到Modelsim安装目录下的modesim.ini文件的
vital2000 = $MODEL_TECH/…/vital2000行下面。
注意粘贴之前修改该文件的只读属性,而后在改回来。
打开modelsim软件,会发现Library里面多了很多文件,这样就配置成功了。
二、仿真示例
下面产生一个FIFO演示如何进行仿真。
首先打开Xilinx ISE软件。File->new projiect。项目名称我就叫了fifo_test,路径放在了D:\FPGA_PRJ\fifo_test\ise_prj中。next。
语言我选择了VHDL,其他配置默认。next。
next。
next。
Finish。
点击器件,右键,选择new source。
File name我命名成了fifo,选择IP(Coregen & Architecture Wizard)
在Memories里面找到FIFOs,选择Fifo Generator,next,Finish。
点击Finish后会弹出fifo的配置界面,按照自己的需求配置fifo,如你想要缓存的数据位宽,以及fifo的深度,配置好后,点击Finish。ISE会开始生成这个IP,这需要稍等一会。
生成结束后,底下会显示生成成功,并且器件下面会多出一个fifo。
在Library中的work下,可以看到产生的fifo代码,有.vhd和.v两种语言。
同样的,在我们设置的工程文件夹内,也可以找到对应的文件,这个.vhd文件后面需要添加到modelsim工程中去。(因为我选用的语言是VHDL,因此关注这个.vhd文件,如果是verilog语言,则关注的是.v文件)
现在我们再写一个模块,这个模块的功能将传入的数据先缓存到fifo中,当检测到fifo非空时,读取fifo中的数据并转发出去。新的.vhd文件可以在ISE中new source产生,也可以在modelsim中产生,也可以用记事本直接修改后缀,这里我直接在ISE中新建一个(点击器件,右键new source)。并命名为TX。注意要选择对应的格式,VHDL Module/Verilog Module,ISE生成它会自动写好一部分代码。
写好代码后,点击保存(不要用ctrl+s),会发现左边产生的fifo跑到了TX.vhd文件下面,因为这个fifo是TX.vhd的一个组件。(示例代码放在文章最后)
然后,我们再写一个Test bench文件,在ISE中,同样new source,文件名为TX_TB,类型选择VHDL Test Bench(也可以选择正常的Module,选Test Bench他会自动生成一些相关的代码)。
如果选了Test Bench,点击next后会让你选择测试的source,选择TX(fifo只是一个组件,我们的输入信号是要传给TX文件的)
next->finish。可以发现,选择Test Bench,它会帮我们写好很多代码。
写好代码后,我们再工程目录下就可以找到这三个.vhd文件。
然后使用Modelsim进行仿真。
打开Modelsim软件,新建一个工程,File->new->project,工程名称我依然取了fifo_test,工程路径放到了D:\FPGA_PRJ\fifo_test\modelsim_prj中(不要和ISE的那个工程混了),其他的不需要修改。点击OK。
选择add exising file,找到刚刚ISE工程下的fifo.vhd,TX.vhd,TX_TB.vhd,把他们添加进来。
左边可以看到这三个文件,右键,选择compile->compile all,编译通过就会打上绿√,
在Library里的work下会有这三个文件,右击tx_tb,选择simulate。
可以看到,仿真通过了。
TX.vhd代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity TX is
port (
rst : in STD_LOGIC ;
clk : in STD_LOGIC ;
txData_i : in STD_LOGIC_VECTOR (7 downto 0) ;
txData_i_v : in STD_LOGIC ;
txData_o : out STD_LOGIC_VECTOR (7 downto 0) ;
txData_o_v : out STD_LOGIC -- This signal indicates valid output data
);
end TX;
architecture Behavioral of TX is
component fifo
port (
clk : in std_logic ;
rst : in std_logic ;
din : in std_logic_vector(7 downto 0) ;
wr_en : in std_logic ;
rd_en : in std_logic ;
dout : out std_logic_vector(7 downto 0) ;
empty : out std_logic ;
full : out std_logic
);
end component;
signal s_dataReg : std_logic_vector(7 downto 0) := (others => '0');
signal s_fifo_wr_en : STD_LOGIC := '0';
signal s_fifo_rd_en : STD_LOGIC := '0';
signal s_fifo_empty : STD_LOGIC;
signal s_fifo_full : STD_LOGIC;
begin
fifo_inst : fifo
port map (
clk => clk,
rst => rst,
din => s_dataReg,
wr_en => s_fifo_wr_en,
rd_en => s_fifo_rd_en,
dout => txData_o,
empty => s_fifo_empty,
full => s_fifo_full
);
process (clk, rst)
begin
if (rst = '1') then
s_fifo_wr_en <= '0';
s_fifo_rd_en <= '0';
txData_o_v <= '0';
elsif (clk'event and clk = '1') then
if (txData_i_v = '1') then
s_fifo_wr_en <= '1';
s_dataReg <= txData_i;
else
s_fifo_wr_en <= '0';
end if;
if (s_fifo_empty = '0') then
s_fifo_rd_en <= '1';
txData_o_v <= '1';
else
s_fifo_rd_en <= '0';
txData_o_v <= '0';
end if;
end if;
end process;
end Behavioral;
TX_TB代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
ENTITY TX_TB IS
END TX_TB;
ARCHITECTURE behavior OF TX_TB IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT TX
PORT(
rst : IN std_logic;
clk : IN std_logic;
txData_i : IN std_logic_vector(7 downto 0);
txData_i_v : IN std_logic;
txData_o : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
SIGNAL rst : std_logic := '0';
SIGNAL clk : std_logic := '0';
SIGNAL txData_i_v : std_logic := '0';
SIGNAL txData_i : std_logic_vector(7 downto 0) := (others=>'0');
--Outputs
SIGNAL txData_o : std_logic_vector(7 downto 0);
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: TX PORT MAP(
rst => rst,
clk => clk,
txData_i => txData_i,
txData_i_v => txData_i_v,
txData_o => txData_o
);
-- 产生时钟信号
clk_proc : process
begin
clk <= '1';
wait for 10 ns;
clk <= '0';
wait for 10 ns;
end process;
-- 产生激励信号
stim_proc : process
begin
-- 复位信号初始为‘1’
rst <= '1';
wait for 100 ns;
rst <= '0';
wait until rising_edge(clk);
txData_i_v <= '1';
txData_i <= "10101010";
wait for 20 ns;
wait until rising_edge(clk);
txData_i_v <= '0';
txData_i <= "00000000";
wait for 200 ns;
wait until rising_edge(clk);
txData_i_v <= '1';
txData_i <= "10101010";
wait for 20 ns;
wait until rising_edge(clk);
txData_i_v <= '0';
txData_i <= "00000000";
wait;
END PROCESS;
END;
标签:std,TX,IP,modelsim,fifo,logic,txData,ISE From: https://blog.csdn.net/qq_39631801/article/details/142174585