1
|
#!/usr/bin/perl -w
|
2
|
|
3
|
use strict;
|
4
|
|
5
|
sub pll_fvco($$$$) {
|
6
|
my ($fosc, $z, $x, $y) = @_;
|
7
|
|
8
|
return $fosc * ($z + ($x/$y));
|
9
|
}
|
10
|
|
11
|
sub pll_flo($$) {
|
12
|
my ($fvco, $r_num) = @_;
|
13
|
|
14
|
return $fvco / $r_num;
|
15
|
}
|
16
|
|
17
|
sub is_flo_valid($) {
|
18
|
my $flo = shift;
|
19
|
|
20
|
if ($flo < 64000000 || $flo > 1700000000) {
|
21
|
return 0;
|
22
|
}
|
23
|
|
24
|
return 1;
|
25
|
}
|
26
|
|
27
|
sub min_vco_mult($) {
|
28
|
my ($fosc) = @_;
|
29
|
return (2600000000 / $fosc);
|
30
|
}
|
31
|
|
32
|
sub max_vco_mult($) {
|
33
|
my ($fosc) = @_;
|
34
|
return (3900000000 / $fosc);
|
35
|
}
|
36
|
|
37
|
sub test_setting($$$$$) {
|
38
|
my ($fosc, $z, $x, $y, $r) = @_;
|
39
|
my $flo;
|
40
|
my $fvco = pll_fvco($fosc, $z, $x, $y);
|
41
|
|
42
|
if ($fvco < 2600000000 || $fvco > 3900000000) {
|
43
|
return;
|
44
|
}
|
45
|
|
46
|
$flo = pll_flo($fvco, $r);
|
47
|
if (is_flo_valid($flo)) {
|
48
|
printf("%010u Hz (Z=%u, X=%u, R=%u)\n", $flo, $z, $x, $r);
|
49
|
}
|
50
|
|
51
|
$r = $r * 2;
|
52
|
$flo = pll_flo($fvco, $r);
|
53
|
if (is_flo_valid($flo) && $flo < 300000000) {
|
54
|
printf("%010u Hz (Z=%u, X=%u, R=%u, TPM)\n", $flo, $z, $x, $r);
|
55
|
}
|
56
|
}
|
57
|
|
58
|
|
59
|
sub hr() {
|
60
|
printf("======================================================================\n");
|
61
|
}
|
62
|
|
63
|
my $fosc = 26000000;
|
64
|
my $y = 65535;
|
65
|
my @r_int_vals = (2,4,6,8,12,16,20,24);
|
66
|
|
67
|
|
68
|
my $min_vco_mult = min_vco_mult($fosc);
|
69
|
my $max_vco_mult = max_vco_mult($fosc);
|
70
|
|
71
|
printf("Fosc = %u, min_vco_mult=%u, max_vco_mult=%u\n", $fosc,
|
72
|
$min_vco_mult, $max_vco_mult);
|
73
|
|
74
|
for (my $z = $min_vco_mult; $z <= $max_vco_mult; $z++) {
|
75
|
for (my $x = 0; $x <= 0xffff; $x+= 1) {
|
76
|
foreach my $r (@r_int_vals) {
|
77
|
test_setting($fosc, $z, $x, $y, $r);
|
78
|
}
|
79
|
}
|
80
|
}
|
81
|
|
82
|
|