Vivado IP core suma y resta de punto flotante Punto flotante

Vivado IP core suma y resta 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 a partir de la suma y resta de números 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 suma y resta de números de punto flotante

        Para facilitar el análisis de los resultados de la simulación posterior, aquí enumeramos los ejemplos de suma y resta de coma flotante.Durante la simulación, use directamente los siguientes ejemplos para simular y verificar si los resultados de la simulación son correctos.

        ejemplo : Sea el número de punto flotante a=32'b1100_0000_1101_0011_0011_0011_0011_0011, es decir, a=-6.6, el número de punto flotante b=32'b0100_0001_0000_1100_1100_1100_1100_1100_1101, es decir, b=8.8, entonces a +b=32'b0100_0000_0000_1100_1100_1100_1100_1110, es decir, a+b=2,2000003 (la razón no es igual a 2,2, porque la propia representación en coma flotante tiene un problema de precisión), ab=32'b1100_0001_0111_0110_0110_0110_0110_0110, es decir, ab=-15,4.

2. Instrucciones de configuración

        Dado que esta vez se llama un núcleo de IP de punto flotante para lograr tanto la suma como la resta, debe haber una señal de control para controlar si se realiza la suma o la resta. Esta señal de control es de 6 bits en la hoja de datos, pero en realidad tiene 8 bits al generar el núcleo IP, y los dos bits superiores están configurados como 0 de forma predeterminada. La configuración específica se muestra en la Figura 1.

Figura 1 Descripción de la configuración de suma y resta

 

3. Pasos de configuración del núcleo de IP de punto flotante

         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 2.

Figura 2 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 3.

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

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

Figura 4  Configuración de la interfaz de Optimizaciones 

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

Figura 5  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.

4. Simulación

1. Código de nivel superior

Cree un módulo de nivel superior denominado float_add_sub 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 12:19:25
// Design Name: 
// Module Name: float_add_sub
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module float_add_sub(
     input clk,
     input a_tvalid,
     input [31:0] a_tdata,
     input b_tvalid,
     input [31:0] b_tdata,
     input operation_tvalid,
     input [7:0] operation_tdata,
     output result_tvalid,
     output [31:0] result_tdata
    );
    
    float_add_sub_ip float_add_sub_ip_u1(
      .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),
      .s_axis_operation_tvalid(operation_tvalid),
      .s_axis_operation_tdata(operation_tdata),
      .m_axis_result_tvalid(result_tvalid),
      .m_axis_result_tdata(result_tdata)
    );
    
endmodule

2. Código de simulación

Cree un módulo de simulación llamado float_add_sub_tb , que se usa 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 uiniversity
// Engineer: clg
// Create Date: 2022/07/23 12:34:59
// Design Name: 
// Module Name: float_add_sub_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//

module float_add_sub_tb();
     reg clk;
     reg a_tvalid;
     reg [31:0] a_tdata;
     reg b_tvalid;
     reg [31:0] b_tdata;
     reg operation_tvalid;
     reg [7:0] operation_tdata;
     wire result_tvalid;
     wire [31:0] result_tdata;

float_add_sub u1_float_add_sub(
      .clk(clk),
      .a_tvalid(a_tvalid),
      .a_tdata(a_tdata),
      .b_tvalid(b_tvalid),
      .b_tdata(b_tdata),
      .operation_tvalid(operation_tvalid),
      .operation_tdata(operation_tdata),
      .result_tvalid(result_tvalid),
      .result_tdata(result_tdata)
);
always #5 clk=~clk;
   
initial begin
    clk=1'b0;
#10;     a_tvalid<=1'b1;
            a_tdata<=32'b1100_0000_1101_0011_0011_0011_0011_0011;
            b_tvalid<=1'b1;
            b_tdata<=32'b0100_0001_0000_1100_1100_1100_1100_1101;    
            operation_tvalid<=1'b1;
            operation_tdata<=8'b0000_0000;        //加法
 #400;  a_tvalid<=1'b1;
            b_tvalid<=1'b1;
            operation_tvalid<=1'b1;
            operation_tdata<=8'b0000_0001;        //减法
end

always @(posedge clk) begin
        if (result_tvalid == 1'b1)  begin
            a_tvalid <=1'b0;
            b_tvalid<=1'b0;
           operation_tvalid <= 1'b0;
        end      
    end

endmodule

5. Análisis de simulación

        Los resultados de la simulación se muestran en la Figura 6. En comparación con los ejemplos de suma y resta de punto flotante enumerados anteriormente, se puede ver que el módulo ha implementado con éxito la suma y resta de números de punto flotante.

Figura 6 Resultados de la simulación

Resumir

 Esta vez presenté cómo usar el núcleo de IP de punto flotante en vivado para implementar la suma y resta de números de punto flotante.

Supongo que te gusta

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