vivado 除法器ip核的使用

本文介绍除法器IP核的配置方法,包括不同算法类型的选择、位宽设置及余数模式,并提供24bit/16bit除法器的Verilog测试代码与仿真结果,适用于FPGA设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据手册pg-151 Divider Generator v5.1

LUTMult
This is recommended for operand widths less than or equal to 12 bits
This implementation uses DSP slices, block RAM and a small amount of FPGA logic primitives (registers and LUTs).
Radix-2
This is recommended for operand widths less than around 16 bits or for applications requiring high throughput。
The Radix2 solution does not use DSP or block RAM primitives, so this implementation is recommended when these primitives are needed elsewhere.

High Radix.
High Radix division with prescaling. This is recommended for operand
widths greater than around 16 bits. This implementation uses DSP slices and block
RAMs.

具体用法见ip除法器手册

通过catalog产生一个除法器ip核
在这里插入图片描述
我这里使用24bit / 16 bit
在这里插入图片描述
其中常用的关键选项配置解释如下:

**Algorithm Type:**选择不同的算法模式,其中Radix2为常用的模式,LutMult当时数较小的时候使用,High Radix是当数很大的时候使用。常用的是Radix2,此处也是选择的为Radix2.
Dividend Width:被除数的位数。
Divisor Width:除数的位数。
Remainder Type:选择余数的模式。
有两种模式:Remainder:余数,以及Fractional分数模式。
Remainder模式的余数模式位数固定,由系统根据除数自动设定。
而选择Fractional Width模式,则可以在Fractional Width那一栏选择自己想要的余数位数。
常用模式为Remainder模式。本文也应选则Remainder模式。

时钟延迟可以手动设置和默认的自动设置。
在这里插入图片描述
所以我们在写verilog代码时,我们设置的位数,需要根据在设置界面左侧的电路显示的位数为准才可以。
假设我们要13bit/5bit时,系统会自动拓展为16bit/8bit
综上也就是说,当我们在使用除法的IP核时,我们可以先将除数与被除数的位数拓宽为8的整数倍的位数,如23→24,6→8等,即输出的位数要与除法IP核的位数相同,才能得到正确的结果。

附录测试代码:
我自己做的测试顶,也有ip自带的tb可用来仿真,可以右键选择set as top来进行仿真。 时钟频率可以通过改变其中参数来设置。
在这里插入图片描述
module tb;
reg clk;
reg s_axis_divisor_tvalid;
reg [15:0] s_axis_divisor_tdata;
reg s_axis_dividend_tvalid;
reg [23:0] s_axis_dividend_tdata;
wire m_axis_dout_tvalid;
wire [39:0] m_axis_dout_tdata;
wire [23:0] c;

always #3.125 clk = ~clk;         //  延迟可变,来改变频率

initial
    begin
        clk = 0;
        s_axis_divisor_tvalid = 0;
        s_axis_dividend_tvalid = 0;
        s_axis_divisor_tdata = 0;
        s_axis_dividend_tdata = 0;
        #1000 s_axis_divisor_tvalid = 1;
        #0    s_axis_dividend_tvalid = 1;
        #0    s_axis_divisor_tdata = 2;    //除数
        #0    s_axis_dividend_tdata = 24;  //被除数
        #6.25   s_axis_divisor_tvalid = 0;
        #0    s_axis_dividend_tvalid = 0;
        
      forever
             begin #100000 
                        s_axis_divisor_tvalid = 1;
                        s_axis_dividend_tvalid = 1;
            s_axis_dividend_tdata=s_axis_dividend_tdata+20;
                       #6.25 s_axis_divisor_tvalid = 0;
                       #0    s_axis_dividend_tvalid = 0;
            end  
        
    end

math_div div_gen_0(
 .aclk                    (clk),
 .s_axis_divisor_tvalid   (s_axis_divisor_tvalid),
 .s_axis_divisor_tdata    (s_axis_divisor_tdata),
 .s_axis_dividend_tvalid  (s_axis_dividend_tvalid),
 .s_axis_dividend_tdata   (s_axis_dividend_tdata),
 .m_axis_dout_tvalid      (m_axis_dout_tvalid),
 .m_axis_dout_tdata       (m_axis_dout_tdata)
);     
assign  c=m_axis_dout_tdata[39:16];      //c 就是得到的结果 ,低位为余数值,所以c取高24位
 //assign 余数=m_axis_dout_tdata[15:0]; 

endmodule

//我自己使用的160mhz时钟频率来进行测试
///自带 div ip的延迟为5-25个时钟周期 24bit/16bit

//me use 6 clock cycle

仿真结果;
在这里插入图片描述
可以看到我的仿真结果正确,且时钟延迟周期都为6
在这里插入图片描述
s_axis_divisor_tdata //除数
s_axis_dividend_tdata //被除数
测试时钟为160Mhz如图所示
在这里插入图片描述

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值