Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 1 ns / 1 ns
- module CORDIC_ABS
- #(
- parameter INPUT_WIDTH = 16,
- parameter OUTPUT_WIDTH = 16,
- parameter PHASE_WIDTH = 18
- )
- (
- input wire clk,
- input wire signed [INPUT_WIDTH - 1:0] X,
- input wire signed [INPUT_WIDTH - 1:0] Y,
- output wire [OUTPUT_WIDTH - 1: 0] abs
- );
- localparam WIDTH_XY = OUTPUT_WIDTH;
- localparam iterations = WIDTH_XY;
- wire signed [PHASE_WIDTH - 1:0] atan_table [iterations - 1:0];
- reg signed [PHASE_WIDTH - 1:0] z [iterations - 1:0];
- reg signed [WIDTH_XY - 1:0] x [iterations:0];
- reg signed [WIDTH_XY - 1:0] y [iterations:0];
- reg [$clog2(iterations + 1) - 1:0] counter_it = 0;
- integer i;
- assign abs = x[iterations];
- assign atan_table[ 0] = 18'b001000000000000000;
- assign atan_table[ 1] = 18'b000100101110010000;
- assign atan_table[ 2] = 18'b000010011111101101;
- assign atan_table[ 3] = 18'b000001010001000100;
- assign atan_table[ 4] = 18'b000000101000101100;
- assign atan_table[ 5] = 18'b000000010100010111;
- assign atan_table[ 6] = 18'b000000001010001100;
- assign atan_table[ 7] = 18'b000000000101000110;
- assign atan_table[ 8] = 18'b000000000010100011;
- assign atan_table[ 9] = 18'b000000000001010001;
- assign atan_table[ 10] = 18'b000000000000101001;
- assign atan_table[ 11] = 18'b000000000000010100;
- assign atan_table[ 12] = 18'b000000000000001010;
- assign atan_table[ 13] = 18'b000000000000000101;
- assign atan_table[ 14] = 18'b000000000000000011;
- assign atan_table[ 15] = 18'b000000000000000001;
- // Значения в таблице atan_table вычисляются этим способом.
- // К сожалению это не компилируется в квартусе и приходится считать заранее.
- /*
- initial begin
- for (i = 0; i < iterations; i = i + 1) begin
- atan_table[i] = ($atan(2.0 ** -i) / pi) * {1'b1, {PHASE_WIDTH - 1{1'b0}}};
- end
- end
- */
- always @(posedge clk) begin
- x[0] <= (X < 0) ? -X : X;
- y[0] <= (Y < 0) ? -Y : Y;
- z[0] <= 0;
- for (i = 0; i < iterations; i = i + 1) begin
- if (y[i] > 0) begin
- x[i + 1] <= x[i] + (y[i] >>> i);
- y[i + 1] <= y[i] - (x[i] >>> i);
- if (i < iterations - 1)
- z[i + 1] <= z[i] + atan_table[i];
- end else begin
- x[i + 1] <= x[i] - (y[i] >>> i);
- y[i + 1] <= y[i] + (x[i] >>> i);
- if (i < iterations - 1)
- z[i + 1] <= z[i] - atan_table[i];
- end
- end
- end
- endmodule
Add Comment
Please, Sign In to add comment