首页 > 其他分享 >工具篇-modelsim独立仿真带有ISE IP核的文件

工具篇-modelsim独立仿真带有ISE IP核的文件

时间:2024-09-17 18:19:36浏览次数:11  
标签:std TX IP modelsim fifo logic txData ISE

概述

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

相关文章

  • 详解IPC(进程间通信)
    进程间通信(IPC,Inter-ProcessCommunication)是指在不同进程之间传递数据或信号的机制。由于进程之间的地址空间是独立的,IPC提供了一种在进程之间进行数据交换的方法。以下是几种常见的IPC机制:1.管道(Pipes)匿名管道匿名管道是单向的通信通道,通常用于具有亲缘关系的进程之间(如......
  • Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
    0前言在页面中,要实现数据更新的视图实时显示,纯JavaScrip需要手动编写代码来处理数据和视图之间的更新。而Vue提供了数据绑定的能力,使得数据和视图保持同步。我们通过一个实例来体验两者的差别。我们设计一个页面,在页面里提供一个文本框,用户可以在文本框输入内容,然后我们在文本框下......
  • IP地址判断-编译原理
    分析给定字符串是否是IP,我们先考虑IP地址如何构成a.b.c.d,其中\(a,b,c,d\)均为\(0\)到\(255\)之间的整数那么我们考虑设计代码框架,如果字符串是IP地址,返回True,否则返回Falseboolsolve(strings){}接下来考虑检查IP字符串的基本格式,包含以下规则所有字符均为阿拉伯数......
  • macOS Sequoia 15 发布,iPhone 镜像、密码应用程序、窗口平铺更新等带来全新体验
    macOSSequoia15.0(24A335)正式版ISO、IPSW、PKG下载2024年9月17日凌晨1点TimCook领导的Apple今天发布了macOS15Sequoia正式版,这是专为Mac运行的操作系统的最新版本。macOSSequoia是一个免费更新,可以在2018年及更高版本的MacBookPro、2020年及更高......
  • CMake构建学习笔记17-uriparser库的构建和使用
    在连续论述了几篇关于CMake如何使用的文章之后,笔者也是感觉被掏空了。接下来几篇就还是回到构建依赖库的问题上,容笔者花时间找到更好的主题来介绍更多关于CMake使用干货。如何有的读者自信已经很熟悉这方面的知识,可以进行跳过,在需要的时候再进行查阅。uriparser是一个严格遵循RFC......
  • Facebook直播限流是什么原因?是ip地址导致的吗
    随着社交媒体和直播行业的蓬勃发展,Facebook直播已成为众多企业和个人进行品牌推广、产品展示和互动交流的重要平台。然而,在享受直播带来的便利与效益的同时,不少用户也面临着直播限流的困扰。本文将探讨Facebook直播限流的原因,并提出相应的应对策略。一、理解Facebook直播限流......
  • Facebook直播限流是什么原因?是ip地址导致的吗
    随着社交媒体和直播行业的蓬勃发展,Facebook直播已成为众多企业和个人进行品牌推广、产品展示和互动交流的重要平台。然而,在享受直播带来的便利与效益的同时,不少用户也面临着直播限流的困扰。本文将探讨Facebook直播限流的原因,并提出相应的应对策略。一、理解Facebook直播限流......
  • consists of 和 comprises 词解
    来源TheMNISTdatasetconsistsof70,00028x28black-and-whiteimagesofhandwrittendigitsextractedfromtwoNISTdatabases.Adatapointcomprisesanimageanditslabel.分析comprises和consistsof的区别:以MNIST数据集为例这两个词在表示“组成”的意思......
  • Js高级总结1 JavaScript数据类型
    文章目录数据类型判断引用变量赋值问题js引擎如何管理内存对象函数生命周期回调函数前端立即执行函数(IIFE)闭包函数中的this数据类型1.1基本数据类型string:任意字符串number:任意数字null:nullboolean:true/falseundefined:undefined1.2对象类型object:任意对......
  • 【洛谷 P1048】[NOIP2005 普及组] 采药 题解(动态规划+01背包)
    [NOIP2005普及组]采药题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株......