本课程目录
1.软件版本
2.FPGA浮点和定点仿真概述
3.FPGA浮点运算方式2
4.FPGA浮点运算方式3
5.视频操作步骤演示
6.参考
欢迎订阅
《★教程1:matlab入门100例》
《★教程2:fpga入门100例》
《★教程3:simulink入门60例》
《★教程4:FPGA/MATLAB/Simulink联合应用开发入门与进阶X例》
教程4·目录·
1.软件版本
vivado2019.2
2.FPGA浮点和定点仿真概述
FPGA作为一种灵活且高效的硬件实现方式,在数字信号处理、控制系统等领域得到了广泛应用。在FPGA上进行浮点设计和定点设计时,需要根据算法特点、资源消耗和性能要求等因素进行权衡。在一般的设计过程中,FPGA的数据都以二进制方式参与运算,其为定点格式。如果用使用FPGA来表示浮点来进行运算。一般有以下几种方式:
方法1:将小数数据进行量化,得到整数,然后再以定点方式进行运行。
方式2:将二进制数据,分割为符号位,整数位,小数位,比如一个二进制数据的位宽为24位,最高位表示符号位,使用次高7位来表示小数的整数部分,低16位来表示小数的小数部分。比如:24'b00000011_00100000_00000000表示为小数3.125,其中小数部分0.125其计算过程为2^14/2^17得到,2^14即上述小数部分二进制对应的整数,2^17即为1对应的整数。
24'b10000011_00100000_00000000表示为小数-3.125。
方式3:使用浮点运算IP核,如下图所示。
方式1,本质还是定点运算,在本课程中,我们重点学习下上面的方式2和方式3.
3.FPGA浮点运算方式2
订阅过《★教程2:fpga入门100例》的读者,可以用【FPGA教程案例26】在FPGA中通过verilog来实现小数的基础运算_verilog 中使用小数-CSDN博客中的步骤再复习下。
没有订阅过的读者,我们按如下的步骤做一次操作学习。
先编写verilog主程序如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/07/05 23:32:25
// Design Name:
// Module Name: tops
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tops(
input signed[23:0] x1,x2,
output signed[23:0]o_sum,
output signed[23:0]o_prod
);
assign o_sum=x1+x2;
wire signed[47:0]w_prod;
assign w_prod=x1*x2;
assign o_prod=w_prod[39:16];
endmodule
注意,加法计算可以直接相加得到。而乘法部分,我们需要分两个部分来看,首先是小数部分,16个位宽乘以16个位宽,将得到32个位宽的小数,因此,需要将最低的16个位宽去除。只保留高16位作为乘积的小数部分。而对于整数部分,8个位宽乘以8个位宽,将得到16个位宽的整数,这里,我们假设输入的整数较小,因此可以直接截取整数部分的低8位作为乘积的整数部分。因此,就有了程序中的assign o_prod=w_prod[39:16]的截取方法。
编写如下的testbench进行测试仿真:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/07/05 23:33:06
// Design Name:
// Module Name: test_tops
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module test_tops;
reg signed[23:0] x1,x2;
wire signed[23:0]o_sum;
wire signed[23:0]o_prod;
tops tops_u(
.x1 (x1),
.x2 (x2),
.o_sum (o_sum),
.o_prod (o_prod)
);
initial
begin
x1 = 24'd0;
x2 = 24'd0;
#100
x1 = 24'b00000010_1100000000000000;
x2 = 24'b00000011_0010000000000000;
end
endmodule
得到如下的仿真结果:
如上图仿真结果可知,我们假设输入的小数是
x1 = 24'b00000010_1100000000000000;
x2 = 24'b00000011_0010000000000000;
这两个小数对应的实际数值为2.75,和3.125,
其和o_sum为: 24'b00000101_1110000000000000;对应的实际数值为5.875,这说明小数加法计算正确。
其乘积o_prod为:24'b00001000_1001100000000000;对应的实际数值为8.5938,这说明小数乘法计算正确。通过对比,可以看到计算的正确性。
4.FPGA浮点运算方式3
这里,我们主要学习浮点运算IP核的使用方式。首先定义IP核配置:
然后我们选择乘法器作为案例,如下图所示:
这个界面是设置整数和小数部分的位宽。这里设置为单精度single。
然后写一个程序进行调用ip核,程序如下图所示:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/02/15 17:05:44
// Design Name:
// Module Name: tops_float
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tops_float(
input i_clk,
input signed[31:0] x1,x2,
output signed[31:0]o_prod
);
floating_point_0 your_instance_name (
.aclk(i_clk), // input wire aclk
.s_axis_a_tvalid(1'b1), // input wire s_axis_a_tvalid
.s_axis_a_tdata(x1), // input wire [31 : 0] s_axis_a_tdata
.s_axis_b_tvalid(1'b1), // input wire s_axis_b_tvalid
.s_axis_b_tdata(x2), // input wire [31 : 0] s_axis_b_tdata
.m_axis_result_tvalid(), // output wire m_axis_result_tvalid
.m_axis_result_tdata(o_prod) // output wire [31 : 0] m_axis_result_tdata
);
endmodule
定义testbench如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/02/15 17:07:22
// Design Name:
// Module Name: test_tops_float
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module test_tops_float;
reg i_clk;
reg signed[31:0] x1,x2;
wire signed[31:0]o_prod;
tops_float tops_float_u(
.i_clk (i_clk),
.x1 (x1),
.x2 (x2),
.o_prod (o_prod)
);
initial
begin
i_clk = 1'b1;
x1 = 32'd0;
x2 = 32'd0;
#100
x1 = 32'h3F000000;//0.5
x2 = 32'h4019999A;//2.4
end
always #5 i_clk=~i_clk;
endmodule
程序中,我们定义单精度0.5的十六进制=32'h3F000000,2.4的十六进制=32'h4019999A
仿真结果如下:
结果为3F99999A,即对应单精度1.2,说明结果正确。
5.视频操作步骤演示
如果上述操作有什么不熟悉的地方,也可以参考如下的视频教程完成课程学习。
B站:【教程4>第1章>第10节】FPGA浮点与定点设计应用_哔哩哔哩_bilibili
6.参考
[1]Li Shuo,李硕.基于FPGA的定点实数除法器设计[C]//2012云计算与信息技术应用学术会议.2012.
[2]王冬冬.基于FPGA的浮点运算器设计[D].大连海事大学,2009.DOI:CNKI:CDMD:2.2009.107781.文章来源:https://www.toymoban.com/news/detail-826042.html
【FPGA教程案例26】在FPGA中通过verilog来实现小数的基础运算_verilog 中使用小数-CSDN博客[3]【FPGA教程案例26】在FPGA中通过verilog来实现小数的基础运算_verilog 中使用小数-CSDN博客文章来源地址https://www.toymoban.com/news/detail-826042.html
到了这里,关于【教程4>第1章>第10节】FPGA浮点与定点设计应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!