Vivado IP core multiplicación y división de punto flotante Punto flotante
Tabla de contenido
1. Ejemplo de multiplicación y división de números de punto flotante
2. Pasos de configuración del núcleo de IP de punto flotante
1. Configuración del multiplicador
prefacio
Con el desarrollo continuo del proceso de fabricación, la matriz de puertas lógicas programables de campo (FPGA) se está integrando cada vez más y su aplicación se está volviendo cada vez más extensa.Entre ellos, se debe usar algún procesamiento matemático IP al procesar señales digitales. nuclear. Recientemente, estoy estudiando la implementación de hardware FPGA de la investigación de tecnología antiinterferencia adaptativa del espacio aéreo, que inevitablemente utiliza algunos núcleos IP.Hoy, presentaré el núcleo IP de punto flotante en vivo en detalle desde la perspectiva de la multiplicación y división de punto flotante. Espero que sea útil para todos. El aprendizaje puede ayudar.
Consejo: El siguiente es el texto de este artículo, todos los cuales son originales del propio autor. No es fácil escribir un artículo. Espero que adjunte un enlace a este artículo cuando lo vuelva a publicar.
1. Ejemplo de multiplicación y división de números de punto flotante
Para facilitar el análisis de los resultados de la simulación posterior, aquí enumeramos los ejemplos de multiplicación y división de números de punto flotante.Durante la simulación, los siguientes ejemplos se utilizan directamente para la simulación para verificar si los resultados de la simulación son correctos.
ejemplo : Sea el número de coma flotante a=32'b1100_0000_1101_0011_0011_0011_0011_0011, es decir, a=-6.6, y el número de coma flotante b=32'b0100_0001_0000_1100_1100_1100_1100_1100_1101, es decir , b=8.8, luego a *b=32'b1100_0010_0110_1000_0101_0001_1110_1100, es decir, a *b=-58,08, a/b =32'b1011_1111_0100_0000_0000_0000_0000_0000, es decir, a/b=-0,75.
2. Pasos de configuración del núcleo de IP de punto flotante
1. Configuración del multiplicador
1. Primero configure la interfaz de selección de operación, como se muestra en la Figura 1.
2. Luego, configure la interfaz Precision of Inputs, como se muestra en la Figura 2.
3. Luego configure la interfaz de Optimizaciones , como se muestra en la Figura 3.
4. Finalmente, configure la interfaz Opciones de interfaz, como se muestra en la Figura 4.
Después de configurar las 4 interfaces anteriores, haga clic en el botón Aceptar en la esquina inferior derecha para generar el núcleo IP multiplicador .
2. Configuración del divisor
Busque Floating-point en vivado, y luego de encontrar el IP core, puede completar la configuración correspondiente de acuerdo con las siguientes operaciones.
1. Primero configure la interfaz de selección de operación, como se muestra en la Figura 5.
2. A continuación, configure la interfaz Precision of Inputs, como se muestra en la Figura 6.
3. Luego configure la interfaz de Optimizaciones, como se muestra en la Figura 7.
4. Finalmente, configure la interfaz Opciones de interfaz, como se muestra en la Figura 8.
Después de configurar las 4 interfaces anteriores, haga clic en el botón Aceptar en la esquina inferior derecha para generar el núcleo IP divisor.
3. Simulación
1. Código de nivel superior
Cree un módulo de nivel superior denominado float_mul_div para instanciar el núcleo IP recién generado.
el código se muestra a continuación:
`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
2. Código de simulación
Cree un módulo de simulación denominado float_mul_div_tb , que se utiliza para simular el núcleo de IP instanciado por el módulo de nivel superior en este momento.
el código se muestra a continuación:
`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
4. Análisis de resultados de simulación
Los resultados de la simulación se muestran en la Figura 9. En comparación con los ejemplos de multiplicación y división de punto flotante enumerados anteriormente, se puede ver que el módulo ha realizado con éxito la multiplicación y división de números de punto flotante.
Resumir
Esta vez presenté cómo usar el núcleo de IP de punto flotante en vivado para realizar la multiplicación y división de números de punto flotante.