FPGA教程系列-Vivado IP核Divider核解析及测试
除法器的IP核比较简单,所以把除法器的IP核跟仿真放到一起进行分析。

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 (检测除零错误) :是否启用除零检测逻辑。

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
需要注意的是除数与被除数的关系。
仿真分析:

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

被折叠的 条评论
为什么被折叠?



