VIVADO自定义IP核以及调用,还有遇到的有警告的问题[IP_Flow 19-315]和[IP_Flow 19-5661]

本文详细介绍了如何使用Vivado设计和封装自定义IP核。首先展示了一个数据比较器的RTL设计及仿真过程,然后演示了在Vivado中创建IP核工程并解决封装过程中出现的警告。最后,解释了如何在现有工程中调用自定义IP核进行测试,确保其功能正确性。
摘要由CSDN通过智能技术生成

        vivado的ip核应该比较常用的设计工具,但有时候官方的ip核设计的比较复杂而我们不需要如此多功能的ip核时,就可以我们自己去设计自己想要的ip核。

一、RTL设计

首先需要你提前设计好自己的模块,包括源文件,以及模块仿真。我的源设计如下

module mid_data(
    input clk ,rst_n,
    
    input [7:0] a,b,c,
    output reg [7:0] mid_data
    );
   wire  A,B,C; 
   wire  [2:0] state;
    assign A=(a>b)?1:0;
    assign B=(b>c)?1:0;
    assign C=(c>a)?1:0;
    assign   state={A,B,C};
  
always@(posedge clk)
    if(!rst_n)
    begin
       mid_data<=8'b0;
     end
       else case(state)
                3'd2,3'd5: begin  mid_data<=a;  end   
                3'd1,3'd6: begin  mid_data<=b;  end
                3'd0,3'd3,3'd4: begin  mid_data<=c;  end                
              default: begin mid_data<=mid_data; end 
             endcase         
endmodule

实现的是一个数据比较器,主要是在一个周期以内找出3个8bit数的中间数。下面是仿真激励代码

module mid_data_tb;
    reg clk,rst_n;
    
    reg [7:0] a,b,c;
    
    wire [7:0] mid_data;

mid_data i0(
    .clk(clk),
    .rst_n(rst_n),
    
    .a(a),
    .b(b),
    .c(c),
    .mid_data(mid_data)
    );
initial
begin
    clk=0;
    rst_n=0;
        a=0;
        b=0;
        c=0;
    #95
        rst_n=1;     
     #100
        a=1;
        b=15;
        c=21;
     #100
        a=30;
        b=10;
        c=20;
     #100
        a=15;
        b=12;
        c=26;
     #100
        a=13;
        b=13;
        c=20;
     #100
        a=15;
        b=14;
        c=14;
     #100
        a=50;
        b=50;
        c=50;
     #100
        a=15;
        b=12;
        c=26;   
     #200
     $stop;                
end    
always #5 clk=!clk;    
endmodule

代码的设计就到处结束,接下来开始ip封装

二、封装IP核

打开tool选择create and packape new ip,点击next,

         选择第一个继续点击next

         这里需要选择一个文件夹存放你的IP核封装文件,最好是新建一个文件夹,将你的所有自己设计的ip核放在这里,每个ip核单独一个文件,方便以后的工程调用。

         创建完了就点击next,然后是ok,最后是finished,接着就会生成一个专门的ip核封装工程和自定义窗口,

         在这里打绿色勾勾的地方我们不关注,都是一些基础配置,vivado已经自动配置好了,包括ip核它的库,源文件,适用的芯片系列。需要关注的是下面这个Ports and interfaces这个选项里面的两个黄色的警告。顺便说一句vivado这里可以自动识别匹配我们源文件中的端口。

产生的警告也可以在下面的messages提示里看到 ,其实忽略这两个警告也是可以的,但为了追求完美可以通过下面的方法来解决。

 先看第一个警告,[IP_Flow 19-315]bus Interface 'rst n " : Bus parameter POLARITY is ACTIVE_LOW but port ' rst_n is not*resetn - please double check the POLARITY setting

什么意思呢,英语比较差百度翻译直接翻译就是[IP_Flow 19-315]总线接口“rst n”:总线参数极性为ACTIVE_LOW,但端口“rst_n”不是*resetn-请仔细检查极性设置。

再翻译一下就是rst_n这个信号没有检测到用作低电平有效。首先说明我们的源文件设计是没有问题的,但是vivado就是检查出有警告,那么怎么解决呢,有两种方式:

1,更改源文件包括仿真文件中的“rst_n”这个信号的名字为“*resetn”例如全部改成“aresetn”,亲测有效。

2,有的小伙伴有很多的源文件那改起来就很麻烦,需要替换等操作,这里还有一个方法就是点击一下Ports and interfaces这个选项里面的"rst_n"在弹出的窗口中选择parameters,可以看到有个属性是ACTIVE_LOW,对就是这个直接改成ACTIVE_HIGH。警告接解决的,同时这里不会影响源文件的逻辑,后面通过仿真也可以看到是不影响逻辑的。

 接下来就是第二个警告,[IP Flow 19-5661] Bus Interface ' clk' does not have any bus interfaces associated with it 。直接翻译就是:总线接口“clk”没有与之关联的任何总线接口。

解决方式也很简单,添加总线接口,同样点击一下Ports and interfaces这个选项里面的"clk"在parameters当中给clk添加属性,选中ASSOXIATED_BUSIF,接着选中间的右移小箭头move

 然后就可以看到他出现在了右边的Overridden选项当中,最后在数数值当中写上你的时钟接口“clk”,就可以了。点击ok,然后就可以看到警告都消失了,出现了绿色的勾勾。

 最后选中最下面的Review and package选项,点击package IP,点击ok就完成了。

三、IP核调用

 接下来打开你自己的最开始的工程,然后点开IP核搜索界面就可以调用了,无论是在基础的源文件例化还是在bd工程中调用都可以。

 最后就是简单的测试,生成ip核过后,还需要改一下最开始上面测试激励文件的例化,只需要将mid_data改为mid_data_0即可

 然后最后出来的仿真结果没有问题,大功告成!

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
你可以使用VHDL来调用FIFO(First-In-First-Out)核。Vivado是Xilinx提供的一款综合软件,用于FPGA设计和开发。 要使用FIFO核,你需要按照以下步骤进行操作: 1. 打开Vivado并创建一个新工程。 2. 在“Flow Navigator”面板中选择“IP Integrator”。 3. 点击“Create Block Design”创建一个新的Block Design。 4. 在Block Design中,点击右键并选择“Add IP”。 5. 在IP Catalog中搜索FIFO核并选择适合你需求的版本。 6. 添加FIFO核后,双击它以打开配置界面。 7. 在配置界面中,你可以设置FIFO的大小、数据宽度、时钟频率等参数。根据你的需求进行配置。 8. 配置完成后,点击“OK”以保存设置。 9. 在Block Design中,你可以添加其他IP核自定义逻辑来与FIFO核进行交互。 10. 完成设计后,点击“Validate Design”确保没有错误。 11. 在“Flow Navigator”面板中选择“Generate Bitstream”以生成比特流文件。 12. 下载比特流文件到你的FPGA设备中。 在VHDL代码中调用FIFO核时,你需要实例化FIFO核,并根据核的接口定义来连接信号。以下是一个简单的示例: ```vhdl library ieee; use ieee.std_logic_1164.all; entity MyDesign is port ( -- 输入信号 input_data : in std_logic_vector(7 downto 0); input_valid : in std_logic; input_ready : out std_logic; -- 输出信号 output_data : out std_logic_vector(7 downto 0); output_valid : out std_logic; output_ready : in std_logic ); end entity MyDesign; architecture rtl of MyDesign is -- 实例化FIFO核 component fifo_core generic ( DATA_WIDTH : integer := 8; DEPTH : integer := 16 ); port ( clk : in std_logic; rst : in std_logic; din : in std_logic_vector(DATA_WIDTH-1 downto 0); wr_en : in std_logic; rd_en : in std_logic; dout : out std_logic_vector(DATA_WIDTH-1 downto 0); full : out std_logic; empty : out std_logic ); end component; -- 信号声明 signal fifo_clk : std_logic; signal fifo_rst : std_logic; signal fifo_din : std_logic_vector(7 downto 0); signal fifo_wr_en : std_logic; signal fifo_rd_en : std_logic; signal fifo_dout : std_logic_vector(7 downto 0); signal fifo_full : std_logic; signal fifo_empty : std_logic; begin -- 将输入信号连接到FIFO核的接口 fifo_clk <= clk; -- 将FIFO核的时钟连接到你的设计的时钟 fifo_rst <= rst; -- 将FIFO核的复位信号连接到你的设计的复位信号 fifo_din <= input_data; fifo_wr_en <= input_valid; input_ready <= not fifo_full; -- 将输出信号连接到FIFO核的接口 output_data <= fifo_dout; output_valid <= not fifo_empty; fifo_rd_en <= output_ready; -- 实例化FIFO核 fifo_inst : fifo_core generic map ( DATA_WIDTH => 8, DEPTH => 16 ) port map ( clk => fifo_clk, rst => fifo_rst, din => fifo_din, wr_en => fifo_wr_en, rd_en => fifo_rd_en, dout => fifo_dout, full => fifo_full, empty => fifo_empty ); end architecture rtl; ``` 以上示例展示了如何将输入信号和输出信号连接到FIFO核的接口。你需要根据你的设计需求进行适当的修改。 希望这些信息对你有所帮助!如果还有其他问题,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值