Raíz fraccionaria de decimales basada en algoritmo cordic y su implementación en FPGA

Raíz fraccionaria de decimales basada en algoritmo cordic y su implementación en FPGA

Tabla de contenido

prefacio

1. Derivación de la fórmula de rotación de coordenadas

2. Introducción al algoritmo cordic

Tres, configuración de núcleo de IP cordic 

4. Simulación

1. Código de nivel superior

2. Código de simulación

5. Análisis de resultados de simulación

Resumir

referencias


prefacio

        En realidad, muchos algoritmos incluyen operaciones de raíz cuadrada, y las implementaciones de hardware a menudo involucran operaciones de raíz cuadrada. Esta vez, presentaremos en detalle los principios básicos del uso del algoritmo cordic para implementar operaciones de raíz cuadrada y cómo usar el núcleo de IP cordic provisto. por Xilinx Para completar la operación de raíz cuadrada decimal sin signo.


Sugerencia: El siguiente es el texto principal de este artículo. No es fácil escribir un artículo. Espero que pueda ayudarlo. Adjunte un enlace al reimprimirlo.

1. Derivación de la fórmula de rotación de coordenadas

        Para comprender cómo implementar la operación de raíz cuadrada en el algoritmo cordic, primero debe conocer la fórmula de rotación de coordenadas.

        Como se muestra en la Figura 1, en el sistema de coordenadas bidimensional, hay un punto A(x,y), la longitud de la línea entre este y el origen es r, y el ángulo entre la línea y la dirección positiva del El eje x es , y se invierte alrededor del \alfaorigen. Gira en el sentido de las agujas del reloj \Thetapara obtener puntos un^{'}(x^{'},y^{'}).

Figura 1 Diagrama de rotación de coordenadas

 Sepa por la imagen:

x'=rcos(α+θ)=rcosαcosθ−rsinαsinθ (1.1)

y'=rsin(α+θ)=rsinαcosθ+rcosαsinθ (1.2)

x=rcosα (1.3)

y=rsenα (1.4)

Sustituyendo (1.3) y (1.4) en (1.1) y (1.2), podemos saber:

x'=xcosθ−ysinθ (1.5)

y'=xsenθ+ycosθ (1.6)

La composición de (1.5) y (1.6) es la fórmula de rotación de coordenadas, que se escribe en forma matricial:

 

 Nota: Después de editar en el editor de fórmulas de Word, hay caracteres ilegibles e incompatibilidad, por lo que se proporciona en forma de imagen.

Entonces, si gira en el sentido de las agujas del reloj, podemos ver en la fórmula (1.7) que solo necesitamos reemplazar θ con -θ para obtener:

 

2. Introducción al algoritmo cordic

         El algoritmo CORDIC fue propuesto por primera vez por Volder y tiene dos modos de cálculo: modo de rotación y modo de vectorización. Es un algoritmo iterativo, que puede realizar la transformación de coordenadas en cualquier ángulo solo a través de operaciones de cambio y operaciones de suma y resta. Suponiendo que las coordenadas ( x, y ) se giran un ángulo Ф para obtener las coordenadas ( x ', y '), entonces:
         Si el ángulo de rotación Ф está limitado  , de modo que tanФ = ± 2^{-yo} , entonces la operación de multiplicación introducida por tanФ se simplifica a una operación de desplazamiento. La rotación de cualquier ángulo se puede completar a través de una serie \phi = bronceado^{-1}(2^{-i})de iteraciones de rotación del ángulo, luego la rotación del ángulo i +1 se puede expresar como:
         donde, k_{i}=cos(tan^{-1}(2^{-i}))=\frac{1}{\sqrt{1+2^{-2i}}}, di = ±1. Si se elimina el término constante Ki , la ecuación iterativa (2) solo tiene operaciones de desplazamiento y suma y resta. El término constante puede compensarse en otra parte del sistema o usarse directamente como la ganancia del sistema. Cuando el número de iteraciones tiende a infinito, el término constante tiende a 0.6073 y su recíproco tiende a 1.6467.

        El ángulo de rotación de la iteración i +1 es:

        d{_{yo}}Determine la dirección de rotación (hacia la izquierda o hacia la derecha) para cada iteración, si z{_{yo}} < 0, d{_{yo}} = -1; de lo contrario d{_{yo}} = 1. Cuando z{_{i+1}} =0, la iteración finaliza y el valor final de la iteración en este momento es:

 

        El algoritmo CORDIC también se puede utilizar para cálculos de proyección, es decir, para proyectar el vector ( x, y ) en el eje x o el eje y , cuando se proyecta en el eje x , el método iterativo
El programa es:

        
        Si y_{yo}< 0, d{_{yo}}= 1; de lo contrario, d{_{yo}}= -1, cuando y_{yo+1}= 0, la iteración finaliza y el valor final de la iteración es:  
 
        Al extender las ecuaciones iterativas (2) y (5), el algoritmo CORDIC se puede usar para calcular ecuaciones lineales y ecuaciones hiperbólicas, y las ecuaciones extendidas son:

         e_{yo}es el ángulo de rotación en cada iteración. Cuando m =1, e_{i}=bronceado^{-1}(2^{-i}), es una ecuación seno; cuando m =0, e_{i}=2^{-i}, es una ecuación lineal; cuando m =-1, e_{i}=tanh^{-1}(2^{-i}), es una ecuación hiperbólica.

        Para la operación de raíz cuadrada, se usa la ecuación hiperbólica, y el modo de iteración es el modo de proyección, y el valor final de la iteración es:
d{_{yo}}La selección de        la dirección en la iteración es, si y_{yo}< 0, d{_{yo}}=1; en caso contrario, d{_{yo}}= -1.
        Si desea la raíz cuadrada del valor a , solo necesita asignar x_{0} y y_{0} respectivamente como: x_{0}=a+1/4,y_{0}=a-1/4, que se puede sustituir en la fórmula (8) x_{n}=\raíz cuadrada{\alfa}.
 

Tres, configuración de núcleo de IP cordic

4. Simulación

1. Código de nivel superior

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/09/01 20:52:25
// Design Name: 
// Module Name: square_root
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//

module square_root(
    input clk,                   
    input rst_n,
    input data_in_valid,
    input [31:0] data_in,
    output data_out_valid,
    output [31:0] data_out 
    );
    
cordic_square u1_cordic_square(     //ip核例化
    .aclk(clk), 
    .aresetn(rst_n), 
    .s_axis_cartesian_tvalid(data_in_valid), 
    .s_axis_cartesian_tdata(data_in),
    .m_axis_dout_tvalid(data_out_valid), 
    .m_axis_dout_tdata(data_out)
    );
    
endmodule

2.仿真代码

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/09/01 21:07:29
// Design Name: 
// Module Name: square_root_tb
// Project Name: 
// Target Devices: 2017.4
// Tool Versions: 
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//

module square_root_tb();
reg clk;
reg rst_n;
reg data_in_valid;
reg [31:0] data_in;
wire data_out_valid;
wire [31:0] data_out;

square_root u1_square_root(
    .clk(clk),
    .rst_n(rst_n),
    .data_in_valid(data_in_valid),
    .data_in(data_in),
    .data_out_valid(data_out_valid),
    .data_out(data_out) 
    );

initial begin
        clk=1'b1;rst_n=1'b1;data_in_valid=1'b0;data_in=32'b0;
#10  rst_n=1'b0;
#10  rst_n=1'b1;
#10  data_in_valid=1'b1;data_in=32'b0_001_0000_0000_0000_0000_0000_0000_0000;
#10  data_in_valid=1'b1;data_in=32'b0_111_0000_0000_0000_0000_0000_0000_0000;

end
always #5 clk=!clk;
endmodule

5. Análisis de resultados de simulación

         Como se muestra en la figura anterior, habrá un retraso de 32 ciclos de reloj desde la entrada de datos hasta la salida de datos (relacionado con la longitud de los bits de datos). se muestra el resultado binario como El número de punto fijo, y lo que muestra es en realidad la mitad del valor real (esta operación es correcta, y el error aquí es completamente un error múltiple causado por la conveniencia de la visualización). , los datos en la operación de raíz cuadrada de este núcleo de IP no son Para un número de punto fijo real, su primer dígito se cuenta como 0 antes del punto decimal, y su formato se muestra en la siguiente figura:

         Por lo tanto, la entrada de la simulación en la figura es 0.4375*2=0.875, y la salida es 0.467707173200324*2= 0.93541434346 400648. Utilizo una calculadora para obtener el resultado de que la raíz cuadrada de 0.875 es 0.93541434346 693485346. En comparación, el La precisión de 32 bits es bastante alta. Alcanza el dígito 11 después del punto decimal. En el uso real, puede configurar el número de dígitos de los datos de cálculo de acuerdo con la precisión requerida.

Resumir

        Lo anterior es la prescripción del algoritmo cordic introducido esta vez.

referencias

Uso del algoritmo CORDIC para calcular la raíz cuadrada y su implementación en FPGA

Supongo que te gusta

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