Vivado IP核之浮点数乘除法 Floating-point
目录
随着制造工艺的不断发展,现场可编程逻辑门阵列(FPGA)的集成度越来越高,应用也越来越广,其中在对数字信号进行处理时必然要用到一些数学处理类的IP核。最近正在研究空域自适应抗干扰技术研究的FPGA硬件实现,其中不免要用到一些IP核,今天就从浮点数乘除法出发详细介绍一下vivado当中的Floating-point这个IP核吧,希望对各位的学习能起到一定的帮助作用。
提示:以下是本篇文章正文内容,均为作者本人原创,写文章实属不易,希望各位在转载时附上本文链接。
为了后面仿真便于分析结果,在此我们就列举浮点数乘除法的例子,仿真时直接用下面的例子进行仿真,来验证仿真结果是否正确。
example:设浮点数a=32'b1100_0000_1101_0011_0011_0011_0011_0011,即a=-6.6,浮点数b=32'b0100_0001_0000_1100_1100_1100_1100_1101,即b=8.8,则a*b=32'b1100_0010_0110_1000_0101_0001_1110_1100,即a*b=-58.08,a/b=32'b1011_1111_0100_0000_0000_0000_0000_0000,即a/b=-0.75。
1.首先配置Operation Selection界面,如图1所示。
2.其次配置Precision of Inputs界面,如图2所示。
3.然后配置Optimizations界面,如图3所示。
4.最后配置Interface Options界面,如图4所示。
以上4个界面都配置完成后即可点击右下角OK按钮生成乘法器IP核。
在vivado中搜索Floating-point,找到该IP核后即可按照以下操作完成相应的配置。
1.首先配置Operation Selection界面,如图5所示。
2.其次配置Precision of Inputs界面,如图6所示。
3.然后配置Optimizations界面,如图7所示。
4.最后配置Interface Options界面,如图8所示。
以上4个界面都配置完成后即可点击右下角OK按钮生成除法器IP核。
建立一个顶层模块,命名为float_mul_div,用来例化刚才生成的IP核。
代码如下:
`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/23 16:40:34
// Design Name:
// Module Name: float_mul_div
// Project Name:
// Target Devices:
// Tool Versions: 2017.4
// Description:
// Dependencies:
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//
//
module float_mul_div(
input clk,
input a_tvalid,
input [31:0] a_tdata,
input b_tvalid,
input [31:0] b_tdata,
output mul_result_tvalid,
output [31:0] mul_result_tdata,
output div_result_tvalid,
output [31:0] div_result_tdata
);
float_multiply u1_float_multiply( //乘法器
.aclk(clk),
.s_axis_a_tvalid(a_tvalid),
.s_axis_a_tdata(a_tdata),
.s_axis_b_tvalid(b_tvalid),
.s_axis_b_tdata(b_tdata),
.m_axis_result_tvalid(mul_result_tvalid),
.m_axis_result_tdata(mul_result_tdata)
);
float_divide u1_float_divide( //除法器
.aclk(clk),
.s_axis_a_tvalid(a_tvalid),
.s_axis_a_tdata(a_tdata),
.s_axis_b_tvalid(b_tvalid),
.s_axis_b_tdata(b_tdata),
.m_axis_result_tvalid(div_result_tvalid),
.m_axis_result_tdata(div_result_tdata)
);
endmodule
建立一个仿真模块,命名为float_mul_div_tb,用来仿真刚才顶层模块例化的IP核。
代码如下:
`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/23 17:03:52
// Design Name:
// Module Name: float_mul_div_tb
// Project Name:
// Target Devices:
// Tool Versions: 2017.4
// Description:
// Dependencies:
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//
//
module float_mul_div_tb();
reg clk;
reg a_tvalid;
reg [31:0] a_tdata;
reg b_tvalid;
reg [31:0] b_tdata;
wire mul_result_tvalid;
wire [31:0] mul_result_tdata;
wire div_result_tvalid;
wire [31:0] div_result_tdata;
float_mul_div u1_float_mul_div(
.clk(clk),
.a_tvalid(a_tvalid),
.a_tdata(a_tdata),
.b_tvalid(b_tvalid),
.b_tdata(b_tdata),
.mul_result_tvalid(mul_result_tvalid),
.mul_result_tdata(mul_result_tdata),
.div_result_tvalid(div_result_tvalid),
.div_result_tdata(div_result_tdata)
);
always #5 clk=~clk;
initial begin
clk=1'b0;
#15; a_tvalid<=1'b1;
a_tdata<=32'b1100_0000_1101_0011_0011_0011_0011_0011; //-6.6
b_tvalid<=1'b1;
b_tdata<=32'b0100_0001_0000_1100_1100_1100_1100_1101; //8.8
end
endmodule
仿真结果如图9所示,对比前面所列举浮点数乘除法的例子,可知该模块成功实现了浮点数的乘除法。
本次介绍了怎么使用vivado中的Floating-point IP核实现浮点数的乘除法。
我正在尝试使用正则表达式验证美元金额:^[0-9]+\.[0-9]{2}$这工作正常,但每当用户提交表单并且美元金额以0(零)结尾时,ruby(或rails?)将0砍掉。所以500.00变成500.0,因此正则表达式验证失败。有没有办法让ruby/rails保持用户输入的格式,而不管尾随零? 最佳答案 我假设您的美元金额是小数类型。因此,用户在字段中输入的任何值在保存到数据库之前都会从字符串转换为适当的类型。验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式并不是真正合适的验证过滤器。不过,您有几种可能性可以解决这个问
有没有人用ruby解决这个问题:假设我们有:a=8.1999999我们想将它四舍五入为2位小数,即8.20,然后乘以1,000,000得到8,200,000我们是这样做的;(a.round(2)*1000000).to_i但是我们得到的是8199999,为什么?奇怪的是,如果我们乘以1000、100000或10000000而不是1000000,我们会得到正确的结果。有人知道为什么吗?我们正在使用ruby1.9.2并尝试使用1.9.3。谢谢! 最佳答案 每当你在计算中得到时髦的数字时使用bigdecimalrequire'bi
据我了解,Ruby(1.9.2)float的精度为15位十进制数字。因此,我希望将floatx舍入到小数点后15位将等于x。对于此计算,情况并非如此。x=(0.33*10)x==x.round(15)#=>false顺便说一句,四舍五入到16位返回true。你能给我解释一下吗? 最佳答案 部分问题是0.33在底层格式中没有精确的表示,因为它不能用一系列1/2n项来表示。因此,当它乘以10时,乘以的数字与0.33略有不同。就此而言,3.3也没有精确表示。第一部分当数字没有精确的10进制表示时,在转换尾数中有信息的最低有效位时会有余数。
我正在尝试编写Ruby代码来检查我发现的特定消息上的椭圆曲线数字签名算法(ECDSA)签名here.问题是我不知道如何将公钥的八位字节字符串转换为OpenSSL::PKey::EC::Point目的。如果我用C写这个,我会把八位字节字符串传递给OpenSSL的o2i_ECPublicKey,它做的事情接近我想要的,实际上被referenceimplementation使用.但是,我搜索了sourcecodeofRuby(MRI)而且它不包含对o2i_ECPublicKey的调用,所以我不知道如何在不编写C扩展的情况下使用Ruby中的该函数。这是十六进制的八位字节字符串。它只是一个0x0
有人可以解释为什么在这里乘以100得到的结果不太准确,而两次乘以10得到的结果更准确吗?±%scLoadingdevelopmentenvironment(Rails3.0.1)>>129.95*10012994.999999999998>>129.95*101299.5>>129.95*10*1012995.0 最佳答案 如果您使用限制为53位有效位的double二进制手动进行计算,您将看到发生了什么:129.95=1.0000001111100110011001100110011001100110011001100110x2^7
我在概念上遇到了困难。基本上,我需要接受一些任意的唯一字符串,并能够将其转换为规范化的浮点值。输出浮点值是什么并不重要,只要相同的字符串输入总是产生相同的规范化浮点输出即可。所以这是一个哈希算法,对吗?我熟悉SHA1或MD5,这似乎类似于密码散列,正确密码的结果相同。但是我相信那些方法会输出字符串。我没有得到的是如何将SHA1或MD5的结果转换为一致的浮点值。#Goaldefstring_to_float(seed_string)#...endstring_to_float('abc-123')#=>0.15789string_to_float('abc-123')#=>0.15789
在一个变量中存储了这个值:$10.00我需要得到这个10.00我已尝试将此值转换为float:new_price='%.2f'%(price.to_f)但我只得到0.0。这有什么问题?我也试过了price=price.stripprice[0]=""new_price='%.2f'%(price.to_f)但即使这样也没有帮助我......哪里有问题?谢谢 最佳答案 您需要先删除$。整个事情是这样的:'%.2f'%'$10.00'.delete("$").to_f或'%.2f'%'$10.00'[1..-1].to_f如果你喜欢密度
我正在编写一些涉及查找给定矩阵的特征向量的代码,令我惊讶的是Ruby在简单情况下会产生一些不合理的结果。例如,以下矩阵具有与特征值1关联的特征向量:>m=Matrix[[0r,1/2r,1/2r,1/3r],[0r,0r,1/4r,1/3r],[0r,1/4r,0r,1/3r],[1r,1/4r,1/4r,0r]]Ruby很好地找到了特征值,但是特征向量爆炸了:>m.eigen.eigenvalues[2]=>1.0000000000000009m.eigen.eigenvectors[2]=>Vector[5.957702309312754e+15,5.957702309312748
有没有一种方法可以简单地检查字符串值是否是有效的浮点值。如果字符串不是数值,则对字符串调用to_f会将其转换为0.0。使用Float()会在传递一个更接近我想要的无效浮点字符串时引发异常,但我不想处理捕获异常。我真正想要的是像nan这样的方法?它确实存在于Float类中,但这无济于事,因为如果不将非数字字符串更改为0.0(使用to_f),则无法将其转换为float。"a".to_f=>0.0"a".to_f.nan?=>falseFloat("a")=>ArgumentError:invalidvalueforFloat():"a"对此是否有简单的解决方案,或者我是否需要编写代码来检查
我正在尝试根据一些具有x、y和z值的数据绘制散点图。我的代码和NVD3网站上的例子是一样的,http://nvd3.org/ghpages/scatter.html,除了我还计算了z值。比方说z=x+y。我不想更改半径值,而是想通过在两种颜色之间插值来设置颜色。所有点都显示在图表上,但我不知道如何为单个点设置颜色,只能为系列设置颜色。为简单起见,我首先尝试将点设置为静态颜色,如下所示:[{"key":"XPlusY","values":[{"x":0,"y":0,"z":0,"color":"#ff0000"},...]但这不起作用,所以我想我需要在javascript中执行此操作。我