Guest User

Untitled

a guest
Jan 25th, 2017
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1 ns / 1 ns
  2.  
  3. module CORDIC_ABS
  4.   #(
  5.     parameter INPUT_WIDTH = 16,
  6.     parameter OUTPUT_WIDTH = 16,
  7.     parameter PHASE_WIDTH = 18
  8.   )
  9.   (
  10.     input wire clk,
  11.     input wire signed [INPUT_WIDTH - 1:0] X,
  12.     input wire signed [INPUT_WIDTH - 1:0] Y,
  13.     output wire [OUTPUT_WIDTH - 1: 0] abs
  14.   );
  15.  
  16.   localparam WIDTH_XY = OUTPUT_WIDTH;
  17.   localparam iterations = WIDTH_XY;
  18.  
  19.   wire signed [PHASE_WIDTH - 1:0] atan_table [iterations - 1:0];
  20.  
  21.   reg signed [PHASE_WIDTH - 1:0] z [iterations - 1:0];
  22.   reg signed [WIDTH_XY - 1:0] x [iterations:0];
  23.   reg signed [WIDTH_XY - 1:0] y [iterations:0];
  24.   reg [$clog2(iterations + 1) - 1:0] counter_it = 0;
  25.  
  26.   integer i;
  27.  
  28.   assign abs = x[iterations];
  29.  
  30.   assign atan_table[          0] = 18'b001000000000000000;
  31.   assign atan_table[          1] = 18'b000100101110010000;
  32.   assign atan_table[          2] = 18'b000010011111101101;
  33.   assign atan_table[          3] = 18'b000001010001000100;
  34.   assign atan_table[          4] = 18'b000000101000101100;
  35.   assign atan_table[          5] = 18'b000000010100010111;
  36.   assign atan_table[          6] = 18'b000000001010001100;
  37.   assign atan_table[          7] = 18'b000000000101000110;
  38.   assign atan_table[          8] = 18'b000000000010100011;
  39.   assign atan_table[          9] = 18'b000000000001010001;
  40.   assign atan_table[         10] = 18'b000000000000101001;
  41.   assign atan_table[         11] = 18'b000000000000010100;
  42.   assign atan_table[         12] = 18'b000000000000001010;
  43.   assign atan_table[         13] = 18'b000000000000000101;
  44.   assign atan_table[         14] = 18'b000000000000000011;
  45.   assign atan_table[         15] = 18'b000000000000000001;
  46.  
  47.   // Значения в таблице atan_table вычисляются этим способом.
  48.   // К сожалению это не компилируется в квартусе и приходится считать заранее.
  49.   /*
  50.   initial begin
  51.     for (i = 0; i < iterations; i = i + 1) begin
  52.       atan_table[i] = ($atan(2.0 ** -i) / pi) * {1'b1, {PHASE_WIDTH - 1{1'b0}}};
  53.     end
  54.   end
  55.   */
  56.  
  57.   always @(posedge clk) begin
  58.     x[0] <= (X < 0) ? -X : X;
  59.     y[0] <= (Y < 0) ? -Y : Y;
  60.     z[0] <= 0;
  61.     for (i = 0; i < iterations; i = i + 1) begin
  62.       if (y[i] > 0) begin
  63.         x[i + 1] <= x[i] + (y[i] >>> i);
  64.         y[i + 1] <= y[i] - (x[i] >>> i);
  65.         if (i < iterations - 1)
  66.           z[i + 1] <= z[i] + atan_table[i];
  67.       end else begin
  68.         x[i + 1] <= x[i] - (y[i] >>> i);
  69.         y[i + 1] <= y[i] + (x[i] >>> i);
  70.         if (i < iterations - 1)
  71.           z[i + 1] <= z[i] - atan_table[i];
  72.       end
  73.     end
  74.   end
  75. endmodule
Add Comment
Please, Sign In to add comment