From e00149bb621d9e9534af5c263ba4f881dfe27f0a Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Sun, 28 May 2023 16:03:39 +0100 Subject: [PATCH] Add saw2sin_poly.sv Polynomial approximation to sine Input 0-65535 represents 0-90 degrees Output 0-65535 represents 0-1 --- saw2sin_poly.sv | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 saw2sin_poly.sv diff --git a/saw2sin_poly.sv b/saw2sin_poly.sv new file mode 100644 index 0000000..3180e5d --- /dev/null +++ b/saw2sin_poly.sv @@ -0,0 +1,30 @@ +`default_nettype none + +module saw2sin_poly +( input var [15:0] i_saw +, output var [15:0] o_sin +); + +logic invert; +always_comb invert = i_saw[15]; + +logic reverse; +always_comb reverse = i_saw[14]; + +logic [15:0] qsaw; +always_comb qsaw = reverse + ? {~i_saw[13:0], 2'b01} // Reverse + : {i_saw[13:0], 2'b00}; // Normal + +logic [63:0] x_in, x_17; +always_comb x_in = {48'd0, qsaw}; +always_comb x_17 = 64'd131072 - x_in; + +logic [63:0] qsin; +always_comb qsin = (64'd262144 * x_in * x_17) / (64'd21474836480 - (x_in * x_17)); + +always_comb o_sin = invert + ? ~{1'b1, qsin[15:1]} + 1 // Invert + : {1'b1, qsin[15:1]}; // Normal + +endmodule