OpenCores
URL https://opencores.org/ocsvn/dpll-isdn/dpll-isdn/trunk

Subversion Repositories dpll-isdn

[/] [dpll-isdn/] [trunk/] [Sources/] [variableresetrandomwalkfilter.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.