参考:xilinx FPGA 除法器ip核(divider)的使用(VHDL&Vivado)_vivado除法器_坚持每天写程序的博客-CSDN博客
一、创建除法IP
vivado的除法器ip核有三种类型,跟ISE相比多了一个LuMult类型,总结来说就是
LuMult:使用了DSP切片、块RAM和少量的FPGA逻辑原语(寄存器和lut),所以和Radix2相比占用fpga资源更少;可以选择有符号或者无符号类型数据;但是位数有限,只能用于运算量小的时候,被除数位宽:2~17,除数位宽:2~11;只能选择余数模式
Radix2:使用FPGA逻辑原语(寄存器和LUTs);可以选择有符号或者无符号类型数据;被除数位宽:2~64,除数位宽:2~64;可以选择余数模式或者分数模式
High Radix:使用DSP切片和块ram;只能选择有符号类型(所以要扩展一位);被除数位宽:4~64,除数位宽:4~64;只能选择分数模式
时序控制有两种模式:
Non Blocking Mode:非阻塞模式
valid是数据输入有效信号(in),ready是数据已经输入的标志信号(out),也就是说只有当除数和被除数同时输入成功,才会进行运算,并且在计算完成后在valid有效时,输出结果。但是在图中的dout_valid第二次有效时,这次的除数是无效的,所以要避免这个情况。
Blocking Mode:阻塞模式
valid是数据输入有效信号(in),ready是数据已经输入的标志信号(out),但是在该模式下对于除数和被除数是否有效的判定是一样的,只是两个过程是独立的,相当于单独判断被除数和除数 是否有效,然后一次放到两个fifo当中,然后依次去计算。
二、避坑点
正常情况下,你ip配置跟上面一样但数据出来不对先看ip有没有更新,每次更改ip或者代码都要
要不生成bit文件后也没更新数据。
一般我们取输出有效信号时的值,后面的值都是错乱的
还有赛灵思的ip生成后是.vhd后缀的 不是.v的不过不影响我们verilog语言正常使用,例化如下:
div_gen_0 inst_div_gen_0 (
.aclk (aclk ), //: IN STD_LOGIC;
.s_axis_divisor_tvalid(s_axis_divisor_tvalid), //: IN STD_LOGIC;
.s_axis_divisor_tdata (s_axis_divisor_tdata ), // : IN STD_LOGIC_VECTOR
.s_axis_dividend_tvalid (s_axis_dividend_tvalid ), // : IN STD_LOGIC;
.s_axis_dividend_tdata(s_axis_dividend_tdata), // : IN STD_LOGIC_VECTOR
.m_axis_dout_tvalid(m_axis_dout_tvalid), // : OUT STD_LOGIC;
.m_axis_dout_tdata (m_axis_dout_tdata ) // : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
);