FPGA教程系列-Vivado IP核Divider核解析及测试

FPGA教程系列-Vivado IP核Divider核解析及测试

除法器的IP核比较简单,所以把除法器的IP核跟仿真放到一起进行分析。

image

Algorithm Type (算法类型): 这个下拉菜单决定了除法器内部使用的实现算法,直接影响性能(速度)资源消耗

  • Radix2 (基2算法) :通过一系列的移位和减法操作来逼近商,类似于手算长除法。资源占用最少,但延迟最高(需要多个时钟周期迭代)。
  • High Radix (高基数算法) :每次迭代处理更多的位(如4位或8位),从而减少总的迭代次数。速度比Radix2快,但资源消耗更多。
  • Newton-Raphson (牛顿-拉夫逊算法) :一种迭代算法,通过快速收敛的近似计算来得到倒数,再用乘法得到商。速度最快(延迟最低),但资源消耗最大,通常还需要一个乘法器IP核配合。

Operand Sign (操作数符号):

  • Signed (有符号) :被除数和除数都是有符号整数(使用二进制补码表示)。

  • Unsigned (无符号) :被除数和除数都是非负整数。

被除数通道

  • Dividend Width (被除数位宽) :设置被除数输入的位宽。

  • Has TLAST:是否在被除数数据流中启用 TLAST 信号。

  • Has TUSER:是否在被除数数据流中启用 TUSER 信号。

  • TUSER Width:设置 TUSER 信号的位宽。

除数通道

  • Divisor Width (除数位宽) :设置除数输入的位宽。

  • Has TLAST / Has TUSER / TUSER Width:与被除数通道中的对应选项完全相同,但作用于除数数据流。

输出通道

Remainder Type (余数类型): 这个选项决定了除法器如何输出“除不尽”的部分。

  • Remainder (标准余数) :输出传统的整数除法余数。例如,10 / 3 = 3​,余数是 1

  • Fractional Part (小数部分) :输出商的小数部分。例如,10 / 3 ≈ 3.333...​,IP核会输出 0.333... 的定点数表示。

  • Fractional Width (小数位宽) :当 Remainder Type​ 选择为 Fractional Part 时,此选项用于设置小数部分的精度。

  • Detect Divide-By-Zero (检测除零错误) :是否启用除零检测逻辑。

image

Clocks per Division:设置完成一次除法运算所需的时钟周期数。

  • 值越小(如1) ​:代表一个时钟周期就能完成一次除法,​吞吐量最高,但消耗的硬件资源也最多。
  • 值越大(如10) ​:代表需要多个时钟周期才能完成一次除法,​吞吐量降低​,但可以通过复用硬件资源来​节省面积

AXI4-Stream Options

Flow Control: 选择数据流控制模式。

  • Non Blocking (非阻塞) :无论下游模块是否准备好接收,IP核都会持续进行计算并输出结果。如果下游来不及接收,新数据会覆盖旧数据,可能导致数据丢失,但吞吐量最大
  • Blocking (阻塞) ​:只有当下游模块发出“准备好”信号时,IP核才开始一次新的计算。这种方式​保证数据不丢失,但会降低吞吐量。

Optimize Goal: 设置综合时的优化目标。

  • Performance (性能) :综合器会优先优化设计,使其能达到更高的运行频率,可能会消耗更多的资源。
  • Area (面积) ​:综合器会优先优化设计,使其​占用更少的逻辑资源,但可能会牺牲一些性能。
  • Balanced (平衡) :在性能和面积之间做一个折中。

Output has TREADY: 决定输出端口 M_AXIS_DOUT​ 是否包含 TREADY 信号。

  • 勾选​:输出接口变为完整的AXI4-Stream握手协议(TVALID​/TREADY​),支持背压,可以和 Blocking 模式配合使用。
  • 不勾选​:输出接口没有 TREADY​ 信号,IP核只管往外“推”数据,适用于 Non Blocking 模式或简单的流水线设计。

Output TLAST Behavior: 定义 TLAST​ 信号在输出端的行为。用于标记数据包的边界,与输入端的 Has TLAST 配合使用。

  • Null:不使用 TLAST 信号。
  • Assert Last Cycle​:在一次除法运算输出的最后一个有效数据周期,将 TLAST 信号置高。
  • Assert Every Cycle:每个输出数据周期都将 TLAST 信号置高。

Latency Options

Latency Configuration: 设置IP核延迟的配置方式。

  • Automatic (自动) :Vivado会根据您选择的算法、优化目标等参数,自动计算出最优的延迟值。
  • Manual (手动) :允许用户手动指定一个固定的延迟值。

Latency:显示或设置IP核的延迟。

Control Signals

ACLKEN:是否启用时钟使能信号。

ARESETN:是否启用异步复位信号。

Testbench


`timescale 1ns / 1ps
module divider_tb;
reg i_clk;
reg i_rst;
reg signed[15:0] i_dividend;
reg signed[15:0] i_divisor;
wire signed[15:0]o_C;
wire signed[15:0]o_R;  
 
wire [31 : 0] m_axis_dout_tdata;

div_gen_0 div_u (
  .aclk(i_clk),                                      // input wire aclk
  .aresetn(i_rst),                                // input wire aresetn
  .s_axis_divisor_tvalid(1),    // input wire s_axis_divisor_tvalid
  .s_axis_divisor_tdata(i_divisor),      // input wire [15 : 0] s_axis_divisor_tdata
  .s_axis_dividend_tvalid(1),  // input wire s_axis_dividend_tvalid
  .s_axis_dividend_tdata(i_dividend),    // input wire [15 : 0] s_axis_dividend_tdata
  .m_axis_dout_tvalid(),          // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata(m_axis_dout_tdata)            // output wire [31 : 0] m_axis_dout_tdata
);

assign o_R=m_axis_dout_tdata[15:0];
assign o_C=m_axis_dout_tdata[31:16];

initial
begin
i_clk = 1'b1;
i_rst = 1'b0;
#100
i_rst = 1'b1;
end
initial
begin
i_dividend = 16'd1234;
i_divisor  = 16'd10;
 
end
always #5 i_clk = ~i_clk;
endmodule

需要注意的是除数与被除数的关系。

仿真分析:

image

可以看到,延时复位以后,大概延时了200ns,才得到输出结果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值