Xilinx的Floating Point IP核使用(求对数、求指数)

一、floating point 变量

        Floating Point 变量是用于表示实数的数据类型,允许包含小数,进行小数运算。浮点数用于处理器处理更高精度数值计算。浮点数的表示采用IEEE 754标准。

 1  floating point 变量转换十进制规则

        以32bit的 浮点数为例:

        

第1位表示             符号位

第2-9位表示          指数位

第10-32位表示      小数部分位数

在线进制转换-IEE754浮点数16进制转换 这里给出可以进行换算验证的网址。

具体的换算办法,先说

正数:

0 10000000 100_0000_0000_0000_0000_0000 (16进制:40400000)

符号位:0

指数位:10000000

小数位:100_0000_0000_0000_0000_0000

将指数减去偏置127, 10000000-0111_1111=1

2^1  =2  如果减去偏置后是n,那么获得2的n次方

小数:用二进制的计算规则  计算为 0.5。

所以结果是 :  2^1*1.5  =3

负数:

1 100_0001_0010_0000_0000_0000_0000_0000(C1200000)

符号位:1

指数位:10000010

小数位:010_0000_0000_0000_0000_0000

将指数减去偏置127,10000010-0111_1111=3

2^3  =8  

小数:用二进制的计算规则  计算为 0.25。

所以结果是 :  2^3*1.25  =10

符号位为1,所以结果为-10

二、Vivado Floating Point IP核配置

这个IP核可意识先浮点数许多种运算,设置

本文以 Fixed to float(定点数转浮点数) Exponential(指数运算) Logarithm(对数运算)Float to fixed(浮点数转定点数) 为例,所有界面都除了选择

除了红色方框内的部分要设置,其余都保持默认,设置TUSER 标出数据的位置为方便大家观察对应位置数据是否计算正确。

三、Verilog代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/01/21 19:59:50
// Design Name: 
// Module Name: IP_TEST
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module IP_TEST(
		input		wire			sys_clk		,
		input 		wire			rst_n		,
		
		input		wire	signed [31:0]	data		,
		input		wire			data_valid	,
		
		output		wire			m_axis_result_tvalid,
		output		wire	[31:0]		m_axis_result_tdata,
		output		wire	[9:0]			m_axis_result_tuser
		

    );
	
//****************************************Fixed_to_float**********************************//
wire Fixed_to_float_s_axis_a_tready;
reg [9:0]   Fixed_to_float_s_axis_a_tuser;
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
Fixed_to_float_s_axis_a_tuser<='d0;
else if(data_valid)
Fixed_to_float_s_axis_a_tuser<=Fixed_to_float_s_axis_a_tuser+1'b1;
else
Fixed_to_float_s_axis_a_tuser<='d0;

wire			   Fixed_to_float_axis_result_tvalid    ;

wire signed [31:0] Fixed_to_float_axis_result_tdata	 ;
wire [9:0]  	   Fixed_to_float_axis_result_tuser	 ;
wire exp_s_axis_a_tready;
Fixed_to_float Fixed_to_float_inst (
  .aclk(sys_clk),                                  // input wire aclk
  .s_axis_a_tvalid(data_valid),            // input wire s_axis_a_tvalid
  .s_axis_a_tready(Fixed_to_float_s_axis_a_tready),            // output wire s_axis_a_tready
  .s_axis_a_tdata(data),              // input wire [31 : 0] s_axis_a_tdata
  .s_axis_a_tuser(Fixed_to_float_s_axis_a_tuser),              // input wire [9 : 0] s_axis_a_tuser
  .m_axis_result_tvalid(Fixed_to_float_axis_result_tvalid),  // output wire m_axis_result_tvalid
  .m_axis_result_tready(exp_s_axis_a_tready),  // input wire m_axis_result_tready
  .m_axis_result_tdata( Fixed_to_float_axis_result_tdata	),    // output wire [31 : 0] m_axis_result_tdata
  .m_axis_result_tuser( Fixed_to_float_axis_result_tuser	)    // output wire [9 : 0] m_axis_result_tuser
);
//****************************************exp**********************************//


wire    exp_axis_result_tvalid;
wire [31:0]   exp_axis_result_tdata;
wire  [9:0]  exp_axis_result_tuser;
wire          log_axis_a_tready;

exp exp_inst (
  .aclk(sys_clk),                                  // input wire aclk
  .s_axis_a_tvalid(Fixed_to_float_axis_result_tvalid),            // input wire s_axis_a_tvalid
  .s_axis_a_tready(exp_s_axis_a_tready),            // output wire s_axis_a_tready
  .s_axis_a_tdata(Fixed_to_float_axis_result_tdata),              // input wire [31 : 0] s_axis_a_tdata
  .s_axis_a_tuser(Fixed_to_float_axis_result_tuser),              // input wire [9 : 0] s_axis_a_tuser
  .m_axis_result_tvalid(exp_axis_result_tvalid),  // output wire m_axis_result_tvalid
  .m_axis_result_tready(log_axis_a_tready),  // input wire m_axis_result_tready
  .m_axis_result_tdata (exp_axis_result_tdata),    // output wire [31 : 0] m_axis_result_tdata
  .m_axis_result_tuser(exp_axis_result_tuser)    // output wire [9 : 0] m_axis_result_tuser
);

//****************************************log**********************************//

wire  		  log_axis_result_tvalid;
wire signed [31:0]   log_axis_result_tdata;
wire    [9:0]      log_axis_result_tuser;
wire  				Float_to_fixed_s_axis_a_tready;

log log_inst (
  .aclk(sys_clk),                                  // input wire aclk
  .s_axis_a_tvalid(exp_axis_result_tvalid),            // input wire s_axis_a_tvalid
  .s_axis_a_tready(log_axis_a_tready),            // output wire s_axis_a_tready
  .s_axis_a_tdata(exp_axis_result_tdata),              // input wire [31 : 0] s_axis_a_tdata
  .s_axis_a_tuser(exp_axis_result_tuser),              // input wire s_axis_a_tlast
  .m_axis_result_tvalid(log_axis_result_tvalid),  // output wire m_axis_result_tvalid
  .m_axis_result_tready(Float_to_fixed_s_axis_a_tready),  // input wire m_axis_result_tready
  .m_axis_result_tdata(log_axis_result_tdata),    // output wire [31 : 0] m_axis_result_tdata
  .m_axis_result_tuser(log_axis_result_tuser)    // output wire m_axis_result_tlast
);








//****************************************Float_to_fixed**********************************//






Float_to_fixed Float_to_fixed_inst (
  .aclk(sys_clk),                                  // input wire aclk
  .s_axis_a_tvalid(log_axis_result_tvalid),            // input wire s_axis_a_tvalid
  .s_axis_a_tready(Float_to_fixed_s_axis_a_tready),            // output wire s_axis_a_tready
  .s_axis_a_tdata(log_axis_result_tdata),              // input wire [31 : 0] s_axis_a_tdata
  .s_axis_a_tuser(log_axis_result_tuser),              // input wire [9 : 0] s_axis_a_tuser
  .m_axis_result_tvalid(m_axis_result_tvalid),  // output wire m_axis_result_tvalid
  .m_axis_result_tready(1'b1),  // input wire m_axis_result_tready
  .m_axis_result_tdata (m_axis_result_tdata),    // output wire [31 : 0] m_axis_result_tdata
  .m_axis_result_tuser (m_axis_result_tuser)    // output wire [9 : 0] m_axis_result_tuser
);
endmodule

四、仿真激励代码(tb文件)

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/01/21 20:06:05
// Design Name: 
// Module Name: tb_IP_TEST
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_IP_TEST(

    );
	
	
	
	
//reg   define
reg             sys_clk;
reg             sys_rst_n;




//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************//
//初始化系统时钟、全局复位和输入信号
initial begin
        sys_clk    = 1'b1;
        sys_rst_n <= 1'b0;

        #20;
        sys_rst_n <= 1'b1;
end

always #10 sys_clk = ~sys_clk;




reg signed [31:0]  data;
reg   		data_valid;
reg  [7:0] 		data_valid_cnt;
reg	  [31:0]	cnt;
always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
cnt<='d0;
else
cnt<=cnt+1'b1;

always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
data_valid<=1'b0;
else if(data_valid_cnt>='d50)
data_valid<=1'b0;
else if(cnt=='d1000)
data_valid<=1'b1;
else
data_valid<=data_valid;


always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
data_valid_cnt<='d0;
else if(data_valid==1'b1)
data_valid_cnt<=data_valid_cnt+1'b1;
else
data_valid_cnt<='d0;

//data
always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
data<=-32'd10;
else if(data_valid==1'b1)
data<=data+1;
else
data<=data;

wire  [31:0] m_axis_result_tdata;
wire		m_axis_result_tvalid;
wire  [9:0]  m_axis_result_tuser;
IP_TEST  IP_TEST_inst(
		.sys_clk				(sys_clk),
		.rst_n					(sys_rst_n),
		.data					(data),
		.data_valid				(data_valid),

		.m_axis_result_tvalid	(m_axis_result_tvalid),
		.m_axis_result_tdata    (m_axis_result_tdata),
		.m_axis_result_tuser	(m_axis_result_tuser)

    );

	
endmodule

五、仿真结果

我们可以观察进行Fixed to float(定点数转浮点数) Exponential(指数运算) Logarithm(对数运算)Float to fixed(浮点数转定点数) 一系列操作后数据不变,验证通过。具体每个环节数据是怎么样的,大家自己观察,用在线进制转换-IEE754浮点数16进制转换  网站,验证计算是否正确。

  • 34
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xilinx floating-point ip是指xilinx公司开发的用于浮点数数据处理的IP核。它可以实现浮点数的转换、 #### 引用[.reference_title] - *1* [十三、Xilinx floating-point IP 使用说明](https://blog.csdn.net/weixin_41838250/article/details/125874095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【教程】Xilinx FPGA里面的AXI DMA IP核的简单用法(以读写Floating-point IP核数据为例)](https://blog.csdn.net/ZLK1214/article/details/113144766)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [fp23fftk:最新的Xilinx FPGA的浮点正向反向快速傅立叶变换(FFT)IP内核(源语言-VHDL)](https://download.csdn.net/download/weixin_42102713/14990566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值