source: PlatformSupport/CustomPeripherals/pcores/radio_controller_axi_v3_00_d/hdl/verilog/radio_controller_TxTiming.v

Last change on this file was 2697, checked in by murphpo, 10 years ago

Added registers to txtiming outputs

File size: 4.4 KB
Line 
1module radio_controller_TxTiming
2(
3    input   clk,
4    input   reset,
5
6    input [0:1] clk_div,
7
8    input   sw_start,
9   
10    input [0:7] dly_GainRamp,
11    input [0:7] dly_TxEn,
12    input [0:7] dly_PHYStart,
13    input [0:7] dly_PowerAmpEn,
14   
15    input [0:5] gainRamp_TxGainTarget,
16    input [0:3] gainRamp_GainStep,
17    input [0:3] gainRamp_TimeStep,
18
19    output [0:5] gainRamp_TxGainOut,
20
21    output  reg TxEn,
22    output  reg PAEn,
23    output  reg PHYStart
24);
25
26    reg [0:11]  timing_counter_big;
27    reg [0: 7]  timing_counter;
28   
29    //clk_div = 0 -> Select 8 LSB for fastest processing ([4:11])
30    //clk_div = 3 -> Select 8 MSB for slowest processing ([1:8])
31   
32    wire TxEn_i;
33    wire PAEn_i;
34    wire PHYStart_i;
35
36    always @(posedge clk)
37    begin
38        TxEn <= TxEn_i;
39        PAEn <= PAEn_i;
40        PHYStart <= PHYStart_i;
41    end
42   
43    always @*
44    begin
45    case(clk_div)
46        2'b00: timing_counter <= timing_counter_big[3:10];
47        2'b01: timing_counter <= timing_counter_big[2:9];
48        2'b10: timing_counter <= timing_counter_big[1:8];
49        2'b11: timing_counter <= timing_counter_big[0:7];
50    endcase
51    end
52
53    //Enable the outputs when the timing counter has excedded the various control thresholds given by the dly_* inputs
54    //  A delay value of 254 will hold the corresponding output high forever
55    //  A delay value of 255 will hold the corresponding output low forever
56    assign TxEn_i =     (((timing_counter > dly_TxEn)       || dly_TxEn == 8'd254)      && dly_TxEn != 8'd255);
57    assign PAEn_i =     (((timing_counter > dly_PowerAmpEn) || dly_PowerAmpEn == 8'd254)&& dly_PowerAmpEn != 8'd255);
58    assign PHYStart_i = (((timing_counter > dly_PHYStart)   || dly_PHYStart == 8'd254)  && dly_PHYStart != 8'd255);;
59
60    //Instantiate a counter that starts when the software enables Tx mode and stops at its max value
61    // The counter used for timing is sliced from this big counter
62    always @( posedge clk )
63    begin
64        if(reset | ~sw_start)
65            timing_counter_big <= 0;
66        else if(sw_start & timing_counter < 255)
67            timing_counter_big <= timing_counter_big + 1;
68    end
69
70   
71    //Tx gain ramp logic
72    // Tx gain output starts at zero
73    // Once master counte reaches dly_GainRamp, Tx gain output begins incrementing
74    // Gain increments by gainRamp_GainStep every gainRamp_TimeStep cycles until reaching gainRamp_TxGainTarget
75    // Gain remains at gainRamp_TxGainTarget until Tx is disabled and process starts over
76    wire            GainRampEn;
77    wire    [0:6]   NewTxGain;
78    reg     [0:6]   TxGainAccum;
79    reg     [0:3]   GainRamp_clockEn_counter;
80
81    wire    [0:3]   gainRamp_TimeStep_safe;
82    wire    [0:3]   gainRamp_GainStep_safe;
83
84    //If user inputs are zero, force them to 1 to avoid stalling the logic below
85    // To bypass/disable the ramp, use 254/255 for dly_GainRamp
86    assign gainRamp_TimeStep_safe = (gainRamp_TimeStep == 0) ? 4'd1 : gainRamp_TimeStep;
87    assign gainRamp_GainStep_safe = (gainRamp_GainStep == 0) ? 4'd1 : gainRamp_GainStep;
88   
89    //Start the gain ramp after the specified delay
90    // A delay of 254 bypasses the ramp and holds the output gain at the target indefinitely
91    // A delay of 255 disables the remp and holds the output gain at 0
92    assign GainRampEn = (((timing_counter > dly_GainRamp)   || dly_GainRamp == 8'd254)  && dly_GainRamp != 8'd255);
93
94    //The output gain signal is the output of an accumulator, enabled after dly_RampGain clock cycles
95    //This signal is the input to the accumulator register. TxGainAccum has one extra MSB to ease overflow detection
96    assign NewTxGain = ( (TxGainAccum + gainRamp_GainStep_safe) > gainRamp_TxGainTarget) ? gainRamp_TxGainTarget : (TxGainAccum + gainRamp_GainStep_safe);
97
98    //The hw_TxGain output, which eventually connects to the radio's parallel gain control bus,
99    //  gets the 6 LSB of the internal accumulator value
100    assign gainRamp_TxGainOut = TxGainAccum[1:6];
101
102    //Instiantiates a counter which runs once the timing counter exceeds the threshold
103    //  for starting the ramping of Tx gains; the counter increments every (TxGain_rampTimeStep+1) cycles
104    always @( posedge clk )
105    begin
106        if(reset || (~sw_start) || (~GainRampEn))
107            TxGainAccum <= 0;
108        else if( GainRampEn & (GainRamp_clockEn_counter == gainRamp_TimeStep_safe))
109            TxGainAccum <= NewTxGain;
110    end
111   
112    //Instantiate a counter used to drive the clock enable of the gain ramp counter above
113    always @( posedge clk )
114    begin
115        if(reset || (~sw_start) || (~GainRampEn) || (GainRamp_clockEn_counter == gainRamp_TimeStep_safe))
116            GainRamp_clockEn_counter <= 0;
117        else
118            GainRamp_clockEn_counter <= GainRamp_clockEn_counter + 1;
119    end
120   
121   
122endmodule
Note: See TracBrowser for help on using the repository browser.