3 // USRP - Universal Software Radio Peripheral
5 // Copyright (C) 2003 Matt Ettus
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.
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.
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
24 module duc(input clock,
39 wire [15:0] i_interp_out, q_interp_out;
42 wire strobe1, strobe2;
43 reg [3:0] strobe_ctr1,strobe_ctr2;
45 always @(posedge clock)
47 strobe_ctr2 <= #1 4'd0;
49 strobe_ctr2 <= #1 4'd0;
51 strobe_ctr2 <= #1 strobe_ctr2 + 4'd1;
53 always @(posedge clock)
55 strobe_ctr1 <= #1 4'd0;
57 strobe_ctr1 <= #1 4'd0;
59 strobe_ctr1 <= #1 strobe_ctr1 + 4'd1;
62 assign strobe2 = enable & ( strobe_ctr2 == rate2 );
63 assign strobe1 = strobe2 & ( strobe_ctr1 == rate1 );
65 assign strobe = strobe1;
67 function [2:0] log_ceil;
70 log_ceil = val[3] ? 3'd4 : val[2] ? 3'd3 : val[1] ? 3'd2 : 3'd1;
73 wire [2:0] shift1 = log_ceil(rate1);
74 wire [2:0] shift2 = log_ceil(rate2);
76 cordic #(.bitwidth(bw),.zwidth(zw),.stages(16))
77 cordic(.clock(clock), .reset(reset), .enable(enable),
78 .xi(i_interp_out), .yi(q_interp_out), .zi(phase[31:32-zw]),
79 .xo(i_out), .yo(q_out), .zo() );
81 cic_interp_2stage #(.bw(bw),.N(4))
82 interp_i(.clock(clock),.reset(reset),.enable(enable),
83 .strobe1(strobe1),.strobe2(strobe2),.strobe3(1'b1),.shift1(shift1),.shift2(shift2),
84 .signal_in(i_in),.signal_out(i_interp_out));
86 cic_interp_2stage #(.bw(bw),.N(4))
87 interp_q(.clock(clock),.reset(reset),.enable(enable),
88 .strobe1(strobe1),.strobe2(strobe2),.strobe3(1'b1),.shift1(shift1),.shift2(shift2),
89 .signal_in(q_in),.signal_out(q_interp_out));
91 phase_acc #(.resolution(32))
92 nco (.clk(clock),.reset(reset),.enable(enable),
93 .freq(freq),.phase(phase));