Advertisement
Guest User

Untitled

a guest
Jan 5th, 2017
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module CORDIC_NCO
  2.   #(
  3.     parameter ACC_WIDTH = 32,
  4.     parameter PHASE_WIDTH = 18,
  5.     parameter OUTPUT_WIDTH = 16,
  6.     parameter X0 = 19895
  7.   )
  8.   (
  9.     input wire clk,
  10.     input wire [ACC_WIDTH - 1: 0] phase_incr,
  11.     output wire signed [OUTPUT_WIDTH - 1:0] Xout,
  12.     output wire signed [OUTPUT_WIDTH - 1:0] Yout
  13.   );
  14.  
  15.   localparam pi = 3.1415926535897932384626433832795;
  16.   localparam WIDTH_XY = OUTPUT_WIDTH;
  17.   localparam iterations = WIDTH_XY;
  18.  
  19.   reg signed [PHASE_WIDTH - 1:0] atan_table [iterations - 1:0];
  20.   reg signed [PHASE_WIDTH - 1:0] z [iterations - 1:0];
  21.   reg signed [WIDTH_XY - 1:0] x [iterations:0];
  22.   reg signed [WIDTH_XY - 1:0] y [iterations:0];
  23.   reg [ACC_WIDTH - 1:0] acc_phase = 0;
  24.  
  25.   wire signed [PHASE_WIDTH - 1:0] phase;
  26.  
  27.   integer i;
  28.  
  29.   assign phase = acc_phase[ACC_WIDTH - 1:ACC_WIDTH - PHASE_WIDTH];
  30.   assign Xout = x[iterations][WIDTH_XY - 1:WIDTH_XY - OUTPUT_WIDTH];
  31.   assign Yout = y[iterations][WIDTH_XY - 1:WIDTH_XY - OUTPUT_WIDTH];
  32.  
  33.   initial begin
  34.     for (i = 0; i < iterations - 1; i = i + 1) begin
  35.       atan_table[i] = ($atan(2.0 ** -i) / pi) * {1'b1, {PHASE_WIDTH - 1{1'b0}}};
  36.     end
  37.   end
  38.  
  39.   always @(posedge clk) begin
  40.     acc_phase <= acc_phase + phase_incr;
  41.   end
  42.  
  43.   always @(posedge clk) begin
  44.     case (phase[PHASE_WIDTH - 1:PHASE_WIDTH - 2])
  45.       2'b00, 2'b11: begin
  46.         x[0] <= X0;
  47.         y[0] <= 0;
  48.         z[0] <= phase;
  49.       end
  50.       2'b01: begin
  51.         x[0] <= 0;
  52.         y[0] <= X0;
  53.         z[0] <= {2'b00, phase[PHASE_WIDTH - 3:0]};
  54.       end
  55.       2'b10: begin
  56.         x[0] <= 0;
  57.         y[0] <= -X0;
  58.         z[0] <= {2'b11, phase[PHASE_WIDTH - 3:0]};
  59.       end
  60.     endcase
  61.     for (i = 0; i < iterations; i = i + 1) begin
  62.       if (z[i] > 0) begin
  63.         // * (2.0 ** -i)
  64.         x[i + 1] <= x[i] - (y[i] >>> i);
  65.         y[i + 1] <= y[i] + (x[i] >>> i);
  66.         if (i < iterations - 1)
  67.           z[i + 1] <= z[i] - atan_table[i];
  68.       end else begin
  69.         x[i + 1] <= x[i] + (y[i] >>> i);
  70.         y[i + 1] <= y[i] - (x[i] >>> i);
  71.         if (i < iterations - 1)
  72.           z[i + 1] <= z[i] + atan_table[i];
  73.       end
  74.     end
  75.   end
  76. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement