Vivado IP core multiplicación y división de punto flotante Punto flotante

Vivado IP core multiplicación y división de punto flotante Punto flotante


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.

Figura 1 Configuración de la interfaz de selección de operación

 2. Luego, configure la interfaz Precision of Inputs, como se muestra en la Figura 2.

Figura 2  Configuración de la interfaz de Precisión de Entradas  

  3. Luego configure la interfaz de Optimizaciones , como se muestra en la Figura 3.

Figura 3  Configuración de la interfaz de Optimizaciones  

 4. Finalmente, configure la interfaz Opciones de interfaz, como se muestra en la Figura 4.

Figura 4  Configuración de interfaz de opciones de interfaz  

  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.

Figura 5 Configuración de la interfaz de selección de operación

  2. A continuación, configure la interfaz Precision of Inputs, como se muestra en la Figura 6.

Figura 6  Configuración de la interfaz de Precisión de Entradas  

 3. Luego configure la interfaz de Optimizaciones, como se muestra en la Figura 7.

Figura 7  Configuración de la interfaz de Optimizaciones  

 4. Finalmente, configure la interfaz Opciones de interfaz, como se muestra en la Figura 8.

Figura 8  Configuración de la interfaz Opciones de interfaz  

 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.

Figura 9 Resultados de la simulación

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.

Supongo que te gusta

Origin blog.csdn.net/m0_66360845/article/details/125952492
Recomendado
Clasificación