Raíz fraccionaria de decimales basada en algoritmo cordic y su implementación en FPGA
Tabla de contenido
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
5. Análisis de resultados de simulación
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 origen. Gira en el sentido de las agujas del reloj para obtener puntos .
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 ángulo de rotación de la iteración i +1 es:
es el ángulo de rotación en cada iteración. Cuando m =1, , es una ecuación seno; cuando m =0, , es una ecuación lineal; cuando m =-1, , es una ecuación hiperbólica.
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