| 1 |
2 |
dmsu |
|
| 2 |
|
|
/* random-walk filter with variable reset */
|
| 3 |
|
|
|
| 4 |
|
|
module variableresetrandomwalkfilter(MainClock, Lead, Lag, Positive, Negative);
|
| 5 |
|
|
input MainClock, Lead, Lag; // System Clock and Phase Comparator signals
|
| 6 |
|
|
output Positive, Negative; // "positive shift" and "negative shift" outputs
|
| 7 |
|
|
|
| 8 |
|
|
parameter N_FilterLength = 8;
|
| 9 |
|
|
parameter N_FilterResetValue = 8;
|
| 10 |
|
|
parameter N_FilterMaxValue = N_FilterResetValue;
|
| 11 |
|
|
|
| 12 |
|
|
/* 256=2_PWR_8(counter length). Use this value because unsigned arithmetic */
|
| 13 |
|
|
parameter N_FilterMinValue = 256 - N_FilterResetValue;
|
| 14 |
|
|
|
| 15 |
|
|
/* the counter length of reset scheme must be short */
|
| 16 |
|
|
parameter ResetterCounterLength = 4;
|
| 17 |
|
|
parameter ResetterCounterMaxValue = 3;
|
| 18 |
|
|
|
| 19 |
|
|
/* 16=2_PWR_4 */
|
| 20 |
|
|
parameter ResetterCounterMinValue = 16 - 3;
|
| 21 |
|
|
|
| 22 |
|
|
/* counter "N - RandomWalkFilter" */
|
| 23 |
|
|
reg [N_FilterLength-1 : 0] N_FilterCounter;
|
| 24 |
|
|
|
| 25 |
|
|
/* connections of "M - RandomWalkFilter" */
|
| 26 |
|
|
wire Up, Down;
|
| 27 |
|
|
randomwalkfilter inst_M_Filter(.MainClock(MainClock), .Lead(Lead), .Lag(Lag),
|
| 28 |
|
|
.Positive(Up), .Negative(Down));
|
| 29 |
|
|
defparam inst_M_Filter.FilterResetValue = 32; // length "M-RWF" = 32
|
| 30 |
|
|
|
| 31 |
|
|
/* Reset Scheme. This counter changes on "M-RWF" counter */
|
| 32 |
|
|
reg [ResetterCounterLength-1 : 0] ResetterCounter;
|
| 33 |
|
|
always @(posedge MainClock)
|
| 34 |
|
|
begin
|
| 35 |
|
|
if(Up)
|
| 36 |
|
|
begin
|
| 37 |
|
|
if((ResetterCounter < ResetterCounterMaxValue) || (ResetterCounter >= ResetterCounterMinValue))
|
| 38 |
|
|
ResetterCounter <= ResetterCounter + 1;
|
| 39 |
|
|
end
|
| 40 |
|
|
else if(Down)
|
| 41 |
|
|
begin
|
| 42 |
|
|
if((ResetterCounter <= ResetterCounterMaxValue) || (ResetterCounter > ResetterCounterMinValue))
|
| 43 |
|
|
ResetterCounter <= ResetterCounter - 1;
|
| 44 |
|
|
end
|
| 45 |
|
|
if((ResetterCounter > ResetterCounterMaxValue) && (ResetterCounter < ResetterCounterMinValue))
|
| 46 |
|
|
ResetterCounter <= 0;
|
| 47 |
|
|
end
|
| 48 |
|
|
|
| 49 |
|
|
/* Look-Up Table between ResetterCounter value and reset state of "N-RWF" */
|
| 50 |
|
|
reg [N_FilterLength-1 : 0] ResetterValue;
|
| 51 |
|
|
always @(1)
|
| 52 |
|
|
begin
|
| 53 |
|
|
case(ResetterCounter)
|
| 54 |
|
|
16 - 3: ResetterValue = 256 - 7;
|
| 55 |
|
|
16 - 2: ResetterValue = 256 - 6;
|
| 56 |
|
|
16 - 1: ResetterValue = 256 - 4;
|
| 57 |
|
|
0: ResetterValue = 0;
|
| 58 |
|
|
1: ResetterValue = 4;
|
| 59 |
|
|
2: ResetterValue = 6;
|
| 60 |
|
|
3: ResetterValue = 7;
|
| 61 |
|
|
default: ResetterValue = 0;
|
| 62 |
|
|
endcase
|
| 63 |
|
|
end
|
| 64 |
|
|
|
| 65 |
|
|
/* "N-RWF" Filter has different reset states */
|
| 66 |
|
|
/* in accordance ResetterCounter value */
|
| 67 |
|
|
always @(posedge MainClock)
|
| 68 |
|
|
begin
|
| 69 |
|
|
if((N_FilterCounter == N_FilterMaxValue) || (N_FilterCounter == N_FilterMinValue))
|
| 70 |
|
|
N_FilterCounter <= ResetterValue;
|
| 71 |
|
|
else
|
| 72 |
|
|
begin
|
| 73 |
|
|
if(Lead) N_FilterCounter <= N_FilterCounter + 1;
|
| 74 |
|
|
if(Lag) N_FilterCounter <= N_FilterCounter - 1;
|
| 75 |
|
|
end
|
| 76 |
|
|
end
|
| 77 |
|
|
|
| 78 |
|
|
/* making "Lead" and "Lag" signals when */
|
| 79 |
|
|
/* counter reached max or min levels */
|
| 80 |
|
|
reg Positive, Negative;
|
| 81 |
|
|
always @(posedge MainClock)
|
| 82 |
|
|
begin
|
| 83 |
|
|
Positive <= (N_FilterCounter == N_FilterMaxValue);
|
| 84 |
|
|
Negative <= (N_FilterCounter == N_FilterMinValue);
|
| 85 |
|
|
end
|
| 86 |
|
|
|
| 87 |
|
|
endmodule
|