Imported Upstream version 3.2.2
[debian/gnuradio] / usrp / fpga / sdr_lib / cordic_stage.v
1 // -*- verilog -*-
2 //
3 //  USRP - Universal Software Radio Peripheral
4 //
5 //  Copyright (C) 2003 Matt Ettus
6 //
7 //  This program is free software; you can redistribute it and/or modify
8 //  it under the terms of the GNU General Public License as published by
9 //  the Free Software Foundation; either version 2 of the License, or
10 //  (at your option) any later version.
11 //
12 //  This program is distributed in the hope that it will be useful,
13 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 //  GNU General Public License for more details.
16 //
17 //  You should have received a copy of the GNU General Public License
18 //  along with this program; if not, write to the Free Software
19 //  Foundation, Inc., 51 Franklin Street, Boston, MA  02110-1301  USA
20 //
21
22 module cordic_stage( clock, reset, enable, xi,yi,zi,constant,xo,yo,zo);
23    parameter bitwidth = 16;
24    parameter zwidth = 16;
25    parameter shift = 1;
26    
27    input     clock;
28    input     reset;
29    input     enable;
30    input [bitwidth-1:0] xi,yi;
31    input [zwidth-1:0] zi;
32    input [zwidth-1:0] constant;
33    output [bitwidth-1:0] xo,yo;
34    output [zwidth-1:0] zo;
35    
36    wire z_is_pos = ~zi[zwidth-1];
37
38    reg [bitwidth-1:0]    xo,yo;
39    reg [zwidth-1:0] zo;
40    
41    always @(posedge clock)
42      if(reset)
43        begin
44           xo <= #1 0;
45           yo <= #1 0;
46           zo <= #1 0;
47        end
48      else if(enable)
49        begin
50           xo <= #1 z_is_pos ?   
51                 xi - {{shift+1{yi[bitwidth-1]}},yi[bitwidth-2:shift]} :
52                 xi + {{shift+1{yi[bitwidth-1]}},yi[bitwidth-2:shift]};
53           yo <= #1 z_is_pos ?   
54                 yi + {{shift+1{xi[bitwidth-1]}},xi[bitwidth-2:shift]} :
55                 yi - {{shift+1{xi[bitwidth-1]}},xi[bitwidth-2:shift]};
56           zo <= #1 z_is_pos ?   
57                 zi - constant :
58                 zi + constant;
59        end
60 endmodule