top_mmcme2.tcl 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. ##################################################################################################
  2. # This TCL script is used to do basic project setup and clarify the DRP settings
  3. #
  4. # XAPP888 TCL commands:
  5. # xapp888_create_project <> - Basic project setup. Adjust as needed
  6. # xapp888_help <> - Descriptions of added TCL commands
  7. #
  8. # XAPP888 TCL DRP Settings:
  9. # xapp888_drp_settings <CLKFBOUT_MULT> <DIVCLK_DIVIDE> <PHASE> <HIGH|LOW|high|low>
  10. # - Displays & Returns the ordered pairs of DRP addresses & Data
  11. #
  12. # xapp888_drp_clkout <DIVIDE> <Duty Cycle e.g. 0.5> <Phase e.g.11.25> <CLKOUT0 to CLKOUT6>
  13. # - Displays & Returns the ordered pairs of DRP addresses & Data
  14. #
  15. # xapp888_merge_drp_clkout <list>
  16. # - Returns the ordered DRP addresses/data merging fractional address 07 & 13
  17. #
  18. # Revision History:
  19. # 10/22/14 - Added TCL DRP commands
  20. # 3/17/16 - Added min/max duty cycle checks
  21. # 7/10/18 - Fixed duty cycles for divide > 64
  22. # 19 Sep 2018 - Add new lookup tables for CP RES LFHF
  23. # 05 Oct 2018 - Cosmetic updates to text.
  24. #
  25. ##################################################################################################
  26. proc xapp888_create_project {} {
  27. create_project xapp888_mmcme2 -force xapp888_mmcme2 -part xc7k325tffg900-2
  28. add_files -norecurse {mmcme2_drp_func.h mmcme2_drp.v top_mmcme2.v top_mmcme2.xdc}
  29. import_files -force -norecurse
  30. import_files -fileset sim_1 -norecurse {top_mmcme2_tb.v}
  31. update_compile_order -fileset sim_1
  32. }
  33. proc xapp888_merge_drp {list} {
  34. set count_07 0
  35. set merge_07 ""
  36. set count_13 0
  37. set merge_13 ""
  38. set drp_merged ""
  39. for {set i 0} { $i <= [expr [llength $list]/2] } {incr i} {
  40. if {[string match [lindex $list [expr $i*2]] 07]} {
  41. incr count_07; set merge_07 "$merge_07 [lindex $list [expr 2*$i + 1] ]"
  42. } elseif {[string match [lindex $list [expr $i*2]] 13]} {
  43. incr count_13; set merge_13 "$merge_13 [lindex $list [expr 2*$i + 1] ]"
  44. } else {
  45. set drp_merged "$drp_merged [lindex $list [expr $i * 2]] [lindex $list [expr $i * 2 + 1]]"
  46. }
  47. }
  48. if {[llength $merge_07] > 1 } {set drp_07_merged [format %x [expr 0x[lindex $merge_07 0] | 0x[lindex $merge_07 1]]]} else {set drp_07_merged [lindex $merge_07 0]}
  49. if {[llength $merge_13] > 1} {set drp_13_merged [format %x [expr 0x[lindex $merge_13 0] | 0x[lindex $merge_13 1]]]} else {set drp_13_merged [lindex $merge_13 0]}
  50. if {$count_07 >2} {
  51. puts "ERROR: Too many shared addresses for 07. Only the first 2 terms are being marged. $merge_07"
  52. } elseif {$count_07 > 0} {
  53. set drp_merged "$drp_merged 07 $drp_07_merged"
  54. }
  55. if {$count_13 >2} {
  56. puts "ERROR: Too many shared addresses for 13. Only the first 2 terms are being merged. $merge_13"
  57. } elseif {$count_13 > 0} {
  58. set drp_merged "$drp_merged 13 $drp_13_merged"
  59. }
  60. puts "$list has been changed to $drp_merged"
  61. return $drp_merged
  62. }
  63. proc xapp888_drp_clkout_frac {divide phase} {
  64. set divide_frac [expr fmod($divide, 1)]
  65. set divide_frac_8ths [scan [expr $divide_frac * 8] %d]
  66. set divide_int [scan [expr floor($divide)] %d]
  67. set even_part_high [scan [expr floor($divide_int / 2)] %d]
  68. set even_part_low $even_part_high
  69. set odd [expr $divide_int - $even_part_high - $even_part_low]
  70. set odd_and_frac [scan [expr 8 * $odd + $divide_frac_8ths] %d]
  71. if {$odd_and_frac <=9} {set lt_frac [expr $even_part_high - 1]} else {set lt_frac $even_part_high}
  72. if {$odd_and_frac <=8} {set ht_frac [expr $even_part_low - 1]} else {set ht_frac $even_part_low}
  73. set pmfall [scan [expr $odd * 4 + floor($divide_frac_8ths / 2)] %d]
  74. set pmrise 0
  75. set dt [scan [expr floor($phase * $divide / 360)] %d]
  76. set pmrise [scan [expr floor( 8 * (($phase * $divide /360 ) - $dt)+ 0.5 )] %d]
  77. set pmfall [scan [expr $pmfall + $pmrise] %d]
  78. if {$odd_and_frac <=9 && $odd_and_frac >=2 || $divide == 2.125} {set wf_fall 1} else {set wf_fall 0}
  79. if {$odd_and_frac <=8 && $odd_and_frac >=1} {set wf_rise 1} else {set wf_rise 0}
  80. set dt [scan [expr $dt + floor($pmrise / 8)] %d]
  81. set pmrise [scan [expr fmod($pmrise , 8)] %d]
  82. set pmfall [scan [expr fmod($pmfall , 8)] %d]
  83. set reg1 "[xapp888_dec2bin $pmrise 3]1[xapp888_dec2bin $ht_frac 6][xapp888_dec2bin $lt_frac 6]"
  84. set reg2 "0[xapp888_dec2bin $divide_frac_8ths 3]1[expr $wf_rise]0000[xapp888_dec2bin $dt 6]"
  85. set regshared "00[xapp888_dec2bin $pmfall 3][expr $wf_fall]"
  86. return "$reg1 $reg2 $regshared "
  87. }
  88. proc xapp888_drp_clkout {divide dutycycle phase clkout} {
  89. set clkout_lower [string tolower $clkout]
  90. switch -glob -- $clkout_lower {
  91. clkout0 { set daddr_reg1 08
  92. set daddr_reg2 09
  93. }
  94. clkout1 { set daddr_reg1 0A
  95. set daddr_reg2 0B
  96. }
  97. clkout2 { set daddr_reg1 0C
  98. set daddr_reg2 0D
  99. }
  100. clkout3 { set daddr_reg1 0E
  101. set daddr_reg2 0F
  102. }
  103. clkout4 { set daddr_reg1 10
  104. set daddr_reg2 11
  105. }
  106. clkout5 { set daddr_reg1 06
  107. set daddr_reg2 07
  108. }
  109. clkout6 { set daddr_reg1 12
  110. set daddr_reg2 13
  111. }
  112. }
  113. if {$phase < 0} {set phase [expr 360 + $phase]}
  114. # Calculate phase for PM and O counter.
  115. # Round counter phase setting up if => 0.5 to closes possible phase
  116. set phase_in_cycles [expr $phase / 360.0 * $divide]
  117. set phasecycles_dec [expr (8 * $phase_in_cycles)]
  118. set phasecycles_int [expr int($phasecycles_dec)]
  119. set phasecycles_rem [expr ($phasecycles_dec - $phasecycles_int )]
  120. if {$phasecycles_rem >= 0.5} {set phasecycles_int [expr ($phasecycles_int + 1)]}
  121. set phasecycles [expr int($phasecycles_int / 8)]
  122. set pmphasecycles [expr ($phasecycles_int - $phasecycles * 8)]
  123. # Duty cycle stuff
  124. if {$divide < 64} {
  125. set min_dc [expr 1.0 / $divide]
  126. set max_dc [expr ($divide - 0.5) / $divide]
  127. } else {
  128. set min_dc [expr ($divide - 64.0) / $divide]
  129. set max_dc [expr (64 + 0.5) / $divide]
  130. }
  131. if {$dutycycle < $min_dc} {puts "\n\tWARNING: Min duty cycle violation $dutycycle < $min_dc\n\t Changing dutycycle to $min_dc\n"; set dutycycle $min_dc}
  132. if {$dutycycle > $max_dc} {puts "\n\tWARNING: Max duty cycle is $dutycycle > $max_dc\n\t Changing dutycycle to $max_dc\n"; set dutycycle $max_dc}
  133. puts "Requested phase is: $phase; Given divide=$divide then phase increments in [format %f [expr 45.000/$divide ] ]; "
  134. #puts "DT will be $phasecycles, PM will be $pmphasecycles"
  135. #puts "Phase will be shifted by VCO period * $phasecycles.[expr 1000*$pmphasecycles / 8]"
  136. #puts "Phase will be shifted by [format %f [expr $phasecycles * 360.000 / $divide]] + [format %f [expr $pmphasecycles * 45.000 / $divide]] = [format %f [expr ( $phasecycles * 360.000 / $divide) + ($pmphasecycles * 45.000 / $divide) ] ]"
  137. puts "Requested Phase is: $phase; Actual: [format %f [expr ( $phasecycles * 360.000 / $divide) + ($pmphasecycles * 45.000 / $divide) ] ]; "
  138. #puts "[expr $pmphasecycles * 45 / $divide]"
  139. set ht [scan [expr int($dutycycle * [expr ($divide ) ])] %d]
  140. set lt [scan [expr $divide - $ht] %d]
  141. set even_high [scan [expr $divide / 2] %d]
  142. set odd [expr $divide - $even_high * 2]
  143. if {$divide == 1} {
  144. set drp_reg1 "[xapp888_bin2hex [binary scan [binary format I $pmphasecycles] B32 var;string range $var end-2 end]1000001000001]"
  145. set drp_reg2 "[xapp888_bin2hex 00000000[expr $odd]1[xapp888_dec2bin $phasecycles 6] ]"
  146. puts "DADDR_$daddr_reg1: $drp_reg1\t-[string toupper $clkout] Register 1"
  147. puts "DADDR_$daddr_reg2: $drp_reg2\t-[string toupper $clkout] Register 2"
  148. return "$daddr_reg1 $drp_reg1 $daddr_reg2 $drp_reg2"
  149. } elseif {[expr fmod($divide,1)] == 0 } {
  150. set drp_reg1 "[xapp888_bin2hex [binary scan [binary format I $pmphasecycles] B32 var;string range $var end-2 end]1[xapp888_dec2bin4ltht $ht][xapp888_dec2bin4ltht $lt]]"
  151. set drp_reg2 "[xapp888_bin2hex 00000000[expr $odd]0[xapp888_dec2bin $phasecycles 6] ]"
  152. puts "DADDR_$daddr_reg1: $drp_reg1\t-[string toupper $clkout] Register 1"
  153. puts "DADDR_$daddr_reg2: $drp_reg2\t-[string toupper $clkout] Register 2"
  154. return "$daddr_reg1 $drp_reg1 $daddr_reg2 $drp_reg2"
  155. } elseif {[string tolower $clkout] == "clkout0" } {
  156. set drp_frac_registers [xapp888_drp_clkout_frac $divide $phase ]
  157. set drp_reg1 [xapp888_bin2hex [lindex $drp_frac_registers 0]]
  158. set drp_reg2 [xapp888_bin2hex [lindex $drp_frac_registers 1]]
  159. set drp_regshared [xapp888_bin2hex [lindex $drp_frac_registers 2]0000000000]
  160. puts "DADDR_$daddr_reg2: $drp_reg2\t-[string toupper $clkout] Register 1"
  161. puts "DADDR_$daddr_reg1: $drp_reg1\t-[string toupper $clkout] Register 2"
  162. puts "DADDR_07: $drp_regshared\t-[string toupper $clkout] Register Shared with CLKOUT5"
  163. return "08 $drp_reg1 09 $drp_reg2 07 $drp_regshared"
  164. } else {puts "\nERROR: Fractional divide setting only supported for CLKOUT0. Output clock set to [string toupper $clkout] \n"
  165. }
  166. }
  167. proc xapp888_drp_calc_m {divide phase} {
  168. set phasecycles [expr int(($divide*$phase)/360)]
  169. set pmphase [expr ($phase - ($phasecycles *360)/$divide)]
  170. set pmphasecycles [scan [expr int(($pmphase *$divide)/ 45)] %d]
  171. set ht [scan [expr ($divide ) / 2] %d]
  172. set lt [scan [expr $divide - $ht] %d]
  173. set odd [expr $lt - $ht]
  174. set daddr_reg1 14
  175. set daddr_reg2 15
  176. set daddr_regshared 13
  177. if {$divide == 1} {
  178. set drp_reg1 "[xapp888_bin2hex [binary scan [binary format I $pmphasecycles] B32 var;string range $var end-2 end]1000001000001]"
  179. set drp_reg2 "[xapp888_bin2hex 00000000[expr $odd]1[xapp888_dec2bin $phasecycles 6] ]"
  180. puts "DADDR_$daddr_reg1: $drp_reg1\t-CLKFBOUT Register 1- "
  181. puts "DADDR_$daddr_reg2: $drp_reg2\t-CLKFBOUT Register 2- "
  182. return "$daddr_reg1 $drp_reg1 $daddr_reg2 $drp_reg2"
  183. } elseif {$divide >=64 } {
  184. puts "DADDR_14: ERROR: M must be 2 to 64\t-CLKFBOUT Register 2-"
  185. puts "DADDR_15: ERROR: M must be 2 to 64\t-CLKFBOUT Register 2-\tNOTE: The calculations are only for the non-fractional settings. CLKFBOUT must use an integer divide value for these DRP settings to work"
  186. return "14 ERROR 15 ERROR "
  187. } elseif {[expr fmod($divide,1)] > 0} {
  188. set drp_frac_registers [xapp888_drp_clkout_frac $divide $phase ]
  189. set drp_reg1 [xapp888_bin2hex [lindex $drp_frac_registers 0]]
  190. set drp_reg2 [xapp888_bin2hex [lindex $drp_frac_registers 1]]
  191. set drp_regshared [xapp888_bin2hex [lindex $drp_frac_registers 2]0000000000]
  192. puts "DADDR_$daddr_reg1: $drp_reg1\t-CLKFBOUT Register 1- "
  193. puts "DADDR_$daddr_reg2: $drp_reg2\t-CLKFBOUT Register 2- "
  194. puts "DADDR_$daddr_regshared: $drp_regshared\t-CLKFBOUT Register Shared with CLKOUT6- "
  195. return "$daddr_reg1 $drp_reg1 $daddr_reg2 $drp_reg2 13 $drp_regshared"
  196. } else {
  197. puts "DADDR_$daddr_reg1: [xapp888_bin2hex [binary scan [binary format I $pmphasecycles] B32 var;string range $var end-2 end]1[xapp888_dec2bin4ltht $ht][xapp888_dec2bin4ltht $lt]]\t-CLKFBOUT Register 1- "
  198. puts "DADDR_$daddr_reg2: [xapp888_bin2hex 00000000[expr $odd]0[binary scan [binary format I $phasecycles] B32 var;string range $var end-5 end] ]\t-CLKFBOUT Register 2- "
  199. return "$daddr_reg1 [xapp888_bin2hex [binary scan [binary format I $pmphasecycles] B32 var;string range $var end-2 end]1[xapp888_dec2bin4ltht $ht][xapp888_dec2bin4ltht $lt]] $daddr_reg2 [xapp888_bin2hex 00000000[expr $odd]0[binary scan [binary format I $phasecycles] B32 var;string range $var end-5 end] ]"
  200. }
  201. }
  202. proc xapp888_drp_calc_d {divide} {
  203. set ht [scan [expr ($divide ) / 2] %d]
  204. set lt [scan [expr $divide - $ht] %d]
  205. if {$divide == 1} {
  206. puts "DADDR_16: [xapp888_bin2hex 0001000001000001]\t-DIVCLK Register $divide-"
  207. return "16 [xapp888_bin2hex 0001000001000001]"
  208. } elseif { $divide > 19} {
  209. puts "DADDR_16: ERROR D must be 1 to 19"
  210. return "16 ERROR"
  211. } else {
  212. puts "DADDR_16: [xapp888_bin2hex 0000[xapp888_dec2bin4ltht $ht][xapp888_dec2bin4ltht $lt] ]\t-DIVCLK Register $divide-" }
  213. return "16 [xapp888_bin2hex 0000[xapp888_dec2bin4ltht $ht][xapp888_dec2bin4ltht $lt] ] "
  214. }
  215. proc xapp888_dec2bin4ltht {dec} {
  216. binary scan [binary format c $dec] B* bin
  217. string range $bin end-5 end
  218. }
  219. proc xapp888_cpres {div bw} {
  220. #CP_RES_LFHF
  221. set div [scan $div %d]
  222. set bw_lower [string tolower $bw]
  223. if {$bw_lower == "low" } then {
  224. switch -glob -- $div {
  225. 1 {set CP 0010 ; set RES 1111 ; set LFHF 00 }
  226. 2 {set CP 0010 ; set RES 1111 ; set LFHF 00 }
  227. 3 {set CP 0010 ; set RES 1111 ; set LFHF 00 }
  228. 4 {set CP 0010 ; set RES 1111 ; set LFHF 00 }
  229. 5 {set CP 0010 ; set RES 0111 ; set LFHF 00 }
  230. 6 {set CP 0010 ; set RES 1011 ; set LFHF 00 }
  231. 7 {set CP 0010 ; set RES 1101 ; set LFHF 00 }
  232. 8 {set CP 0010 ; set RES 0011 ; set LFHF 00 }
  233. 9 {set CP 0010 ; set RES 0101 ; set LFHF 00 }
  234. 10 {set CP 0010 ; set RES 0101 ; set LFHF 00 }
  235. 11 {set CP 0010 ; set RES 1001 ; set LFHF 00 }
  236. 12 {set CP 0010 ; set RES 1110 ; set LFHF 00 }
  237. 13 {set CP 0010 ; set RES 1110 ; set LFHF 00 }
  238. 14 {set CP 0010 ; set RES 1110 ; set LFHF 00 }
  239. 15 {set CP 0010 ; set RES 1110 ; set LFHF 00 }
  240. 16 {set CP 0010 ; set RES 0001 ; set LFHF 00 }
  241. 17 {set CP 0010 ; set RES 0001 ; set LFHF 00 }
  242. 18 {set CP 0010 ; set RES 0001 ; set LFHF 00 }
  243. 19 {set CP 0010 ; set RES 0110 ; set LFHF 00 }
  244. 20 {set CP 0010 ; set RES 0110 ; set LFHF 00 }
  245. 21 {set CP 0010 ; set RES 0110 ; set LFHF 00 }
  246. 22 {set CP 0010 ; set RES 0110 ; set LFHF 00 }
  247. 23 {set CP 0010 ; set RES 0110 ; set LFHF 00 }
  248. 24 {set CP 0010 ; set RES 0110 ; set LFHF 00 }
  249. 25 {set CP 0010 ; set RES 0110 ; set LFHF 00 }
  250. 26 {set CP 0010 ; set RES 1010 ; set LFHF 00 }
  251. 27 {set CP 0010 ; set RES 1010 ; set LFHF 00 }
  252. 28 {set CP 0010 ; set RES 1010 ; set LFHF 00 }
  253. 29 {set CP 0010 ; set RES 1010 ; set LFHF 00 }
  254. 30 {set CP 0010 ; set RES 1010 ; set LFHF 00 }
  255. 31 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  256. 32 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  257. 33 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  258. 34 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  259. 35 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  260. 36 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  261. 37 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  262. 38 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  263. 39 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  264. 40 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  265. 41 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  266. 42 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  267. 43 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  268. 44 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  269. 45 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  270. 46 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  271. 47 {set CP 0010 ; set RES 1100 ; set LFHF 00 }
  272. 48 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  273. 49 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  274. 50 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  275. 51 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  276. 52 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  277. 53 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  278. 54 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  279. 55 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  280. 56 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  281. 57 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  282. 58 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  283. 59 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  284. 60 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  285. 61 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  286. 62 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  287. 63 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  288. 64 {set CP 0010 ; set RES 0010 ; set LFHF 00 }
  289. }
  290. } elseif {$bw_lower == "low_ss"} then {
  291. switch -glob -- $div {
  292. 1 {set CP 0010 ; set RES 1111 ; set LFHF 11 }
  293. 2 {set CP 0010 ; set RES 1111 ; set LFHF 11 }
  294. 3 {set CP 0010 ; set RES 1111 ; set LFHF 11 }
  295. 4 {set CP 0010 ; set RES 1111 ; set LFHF 11 }
  296. 5 {set CP 0010 ; set RES 0111 ; set LFHF 11 }
  297. 6 {set CP 0010 ; set RES 1011 ; set LFHF 11 }
  298. 7 {set CP 0010 ; set RES 1101 ; set LFHF 11 }
  299. 8 {set CP 0010 ; set RES 0011 ; set LFHF 11 }
  300. 9 {set CP 0010 ; set RES 0101 ; set LFHF 11 }
  301. 10 {set CP 0010 ; set RES 0101 ; set LFHF 11 }
  302. 11 {set CP 0010 ; set RES 1001 ; set LFHF 11 }
  303. 12 {set CP 0010 ; set RES 1110 ; set LFHF 11 }
  304. 13 {set CP 0010 ; set RES 1110 ; set LFHF 11 }
  305. 14 {set CP 0010 ; set RES 1110 ; set LFHF 11 }
  306. 15 {set CP 0010 ; set RES 1110 ; set LFHF 11 }
  307. 16 {set CP 0010 ; set RES 0001 ; set LFHF 11 }
  308. 17 {set CP 0010 ; set RES 0001 ; set LFHF 11 }
  309. 18 {set CP 0010 ; set RES 0001 ; set LFHF 11 }
  310. 19 {set CP 0010 ; set RES 0110 ; set LFHF 11 }
  311. 20 {set CP 0010 ; set RES 0110 ; set LFHF 11 }
  312. 21 {set CP 0010 ; set RES 0110 ; set LFHF 11 }
  313. 22 {set CP 0010 ; set RES 0110 ; set LFHF 11 }
  314. 23 {set CP 0010 ; set RES 0110 ; set LFHF 11 }
  315. 24 {set CP 0010 ; set RES 0110 ; set LFHF 11 }
  316. 25 {set CP 0010 ; set RES 0110 ; set LFHF 11 }
  317. 26 {set CP 0010 ; set RES 1010 ; set LFHF 11 }
  318. 27 {set CP 0010 ; set RES 1010 ; set LFHF 11 }
  319. 28 {set CP 0010 ; set RES 1010 ; set LFHF 11 }
  320. 29 {set CP 0010 ; set RES 1010 ; set LFHF 11 }
  321. 30 {set CP 0010 ; set RES 1010 ; set LFHF 11 }
  322. 31 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  323. 32 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  324. 33 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  325. 34 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  326. 35 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  327. 36 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  328. 37 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  329. 38 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  330. 39 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  331. 40 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  332. 41 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  333. 42 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  334. 43 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  335. 44 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  336. 45 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  337. 46 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  338. 47 {set CP 0010 ; set RES 1100 ; set LFHF 11 }
  339. 48 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  340. 49 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  341. 50 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  342. 51 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  343. 52 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  344. 53 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  345. 54 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  346. 55 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  347. 56 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  348. 57 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  349. 58 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  350. 59 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  351. 60 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  352. 61 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  353. 62 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  354. 63 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  355. 64 {set CP 0010 ; set RES 0010 ; set LFHF 11 }
  356. }
  357. } elseif {$bw_lower == "high"} then {
  358. switch -glob -- $div {
  359. 1 {set CP 0010 ; set RES 1111 ; set LFHF 00 }
  360. 2 {set CP 0100 ; set RES 1111 ; set LFHF 00 }
  361. 3 {set CP 0101 ; set RES 1011 ; set LFHF 00 }
  362. 4 {set CP 0111 ; set RES 0111 ; set LFHF 00 }
  363. 5 {set CP 1101 ; set RES 0111 ; set LFHF 00 }
  364. 6 {set CP 1110 ; set RES 1011 ; set LFHF 00 }
  365. 7 {set CP 1110 ; set RES 1101 ; set LFHF 00 }
  366. 8 {set CP 1111 ; set RES 0011 ; set LFHF 00 }
  367. 9 {set CP 1110 ; set RES 0101 ; set LFHF 00 }
  368. 10 {set CP 1111 ; set RES 0101 ; set LFHF 00 }
  369. 11 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  370. 12 {set CP 1101 ; set RES 0001 ; set LFHF 00 }
  371. 13 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  372. 14 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  373. 15 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  374. 16 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  375. 17 {set CP 1111 ; set RES 0101 ; set LFHF 00 }
  376. 18 {set CP 1111 ; set RES 0101 ; set LFHF 00 }
  377. 19 {set CP 1100 ; set RES 0001 ; set LFHF 00 }
  378. 20 {set CP 1100 ; set RES 0001 ; set LFHF 00 }
  379. 21 {set CP 1100 ; set RES 0001 ; set LFHF 00 }
  380. 22 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  381. 23 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  382. 24 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  383. 25 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  384. 26 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  385. 27 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  386. 28 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  387. 29 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  388. 30 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  389. 31 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  390. 32 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  391. 33 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  392. 34 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  393. 35 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  394. 36 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  395. 37 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  396. 38 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  397. 39 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  398. 40 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  399. 41 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  400. 42 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  401. 43 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  402. 44 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  403. 45 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  404. 46 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  405. 47 {set CP 0111 ; set RES 0001 ; set LFHF 00 }
  406. 48 {set CP 0111 ; set RES 0001 ; set LFHF 00 }
  407. 49 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  408. 50 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  409. 51 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  410. 52 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  411. 53 {set CP 0110 ; set RES 0001 ; set LFHF 00 }
  412. 54 {set CP 0110 ; set RES 0001 ; set LFHF 00 }
  413. 55 {set CP 0101 ; set RES 0110 ; set LFHF 00 }
  414. 56 {set CP 0101 ; set RES 0110 ; set LFHF 00 }
  415. 57 {set CP 0101 ; set RES 0110 ; set LFHF 00 }
  416. 58 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  417. 59 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  418. 60 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  419. 61 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  420. 62 {set CP 0100 ; set RES 1010 ; set LFHF 00 }
  421. 63 {set CP 0011 ; set RES 1100 ; set LFHF 00 }
  422. 64 {set CP 0011 ; set RES 1100 ; set LFHF 00 }
  423. }
  424. } else {
  425. # OPTIMIZED
  426. switch -glob -- $div {
  427. 1 {set CP 0010 ; set RES 1111 ; set LFHF 00 }
  428. 2 {set CP 0100 ; set RES 1111 ; set LFHF 00 }
  429. 3 {set CP 0101 ; set RES 1011 ; set LFHF 00 }
  430. 4 {set CP 0111 ; set RES 0111 ; set LFHF 00 }
  431. 5 {set CP 1101 ; set RES 0111 ; set LFHF 00 }
  432. 6 {set CP 1110 ; set RES 1011 ; set LFHF 00 }
  433. 7 {set CP 1110 ; set RES 1101 ; set LFHF 00 }
  434. 8 {set CP 1111 ; set RES 0011 ; set LFHF 00 }
  435. 9 {set CP 1110 ; set RES 0101 ; set LFHF 00 }
  436. 10 {set CP 1111 ; set RES 0101 ; set LFHF 00 }
  437. 11 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  438. 12 {set CP 1101 ; set RES 0001 ; set LFHF 00 }
  439. 13 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  440. 14 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  441. 15 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  442. 16 {set CP 1111 ; set RES 1001 ; set LFHF 00 }
  443. 17 {set CP 1111 ; set RES 0101 ; set LFHF 00 }
  444. 18 {set CP 1111 ; set RES 0101 ; set LFHF 00 }
  445. 19 {set CP 1100 ; set RES 0001 ; set LFHF 00 }
  446. 20 {set CP 1100 ; set RES 0001 ; set LFHF 00 }
  447. 21 {set CP 1100 ; set RES 0001 ; set LFHF 00 }
  448. 22 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  449. 23 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  450. 24 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  451. 25 {set CP 0101 ; set RES 1100 ; set LFHF 00 }
  452. 26 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  453. 27 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  454. 28 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  455. 29 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  456. 30 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  457. 31 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  458. 32 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  459. 33 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  460. 34 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  461. 35 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  462. 36 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  463. 37 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  464. 38 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  465. 39 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  466. 40 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  467. 41 {set CP 0011 ; set RES 0100 ; set LFHF 00 }
  468. 42 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  469. 43 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  470. 44 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  471. 45 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  472. 46 {set CP 0010 ; set RES 1000 ; set LFHF 00 }
  473. 47 {set CP 0111 ; set RES 0001 ; set LFHF 00 }
  474. 48 {set CP 0111 ; set RES 0001 ; set LFHF 00 }
  475. 49 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  476. 50 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  477. 51 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  478. 52 {set CP 0100 ; set RES 1100 ; set LFHF 00 }
  479. 53 {set CP 0110 ; set RES 0001 ; set LFHF 00 }
  480. 54 {set CP 0110 ; set RES 0001 ; set LFHF 00 }
  481. 55 {set CP 0101 ; set RES 0110 ; set LFHF 00 }
  482. 56 {set CP 0101 ; set RES 0110 ; set LFHF 00 }
  483. 57 {set CP 0101 ; set RES 0110 ; set LFHF 00 }
  484. 58 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  485. 59 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  486. 60 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  487. 61 {set CP 0010 ; set RES 0100 ; set LFHF 00 }
  488. 62 {set CP 0100 ; set RES 1010 ; set LFHF 00 }
  489. 63 {set CP 0011 ; set RES 1100 ; set LFHF 00 }
  490. 64 {set CP 0011 ; set RES 1100 ; set LFHF 00 }
  491. }
  492. }
  493. puts "DADDR_4E: [xapp888_bin2hex "[string index $CP 0]00[string range $CP 1 2]00[string index $CP 3]00000000"]\t-Filter Register 1: M set to $div with $bw bandwidth-"
  494. puts "DADDR_4F: [xapp888_bin2hex "[string index $RES 0]00[string range $RES 1 2]00[string index $RES 3][string index $LFHF 0]00[string index $LFHF 1]0000"]\t-Filter Register 2: M set to $div with $bw bandwidth-"
  495. return "4F [xapp888_bin2hex "[string index $RES 0]00[string range $RES 1 2]00[string index $RES 3][string index $LFHF 0]00[string index $LFHF 1]0000"] 4E [xapp888_bin2hex "[string index $CP 0]00[string range $CP 1 2]00[string index $CP 3]00000000"]"
  496. }
  497. proc xapp888_locking {div} {
  498. # LockRefDly_LockFBDly_LockCnt_LockSatHigh_UnlockCnt
  499. set div [scan $div %d]
  500. switch -glob -- $div {
  501. 1 {set LockRefDly 00110 ; set LockFBDly 00110 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  502. 2 {set LockRefDly 00110 ; set LockFBDly 00110 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  503. 3 {set LockRefDly 01000 ; set LockFBDly 01000 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  504. 4 {set LockRefDly 01011 ; set LockFBDly 01011 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  505. 5 {set LockRefDly 01110 ; set LockFBDly 01110 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  506. 6 {set LockRefDly 10001 ; set LockFBDly 10001 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  507. 7 {set LockRefDly 10011 ; set LockFBDly 10011 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  508. 8 {set LockRefDly 10110 ; set LockFBDly 10110 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  509. 9 {set LockRefDly 11001 ; set LockFBDly 11001 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  510. 10 {set LockRefDly 11100 ; set LockFBDly 11100 ; set LockCnt 0111101000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  511. 11 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0110000100 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  512. 12 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0100111001 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  513. 13 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0111101110 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  514. 14 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0110111100 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  515. 15 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0110001010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  516. 16 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0101110001 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  517. 17 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0100111111 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  518. 18 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0100100110 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  519. 19 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0100001101 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  520. 20 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011110100 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  521. 21 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011011011 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  522. 22 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011000010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  523. 23 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0010101001 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  524. 24 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0010010000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  525. 25 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0010010000 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  526. 26 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0001110111 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  527. 27 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0001011110 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  528. 28 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0001011110 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  529. 29 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0001000101 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  530. 30 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0001000101 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  531. 31 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0000101100 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  532. 32 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0000101100 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  533. 33 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0000101100 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  534. 34 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0000010011 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  535. 35 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0000010011 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  536. 36 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0000010011 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  537. 37 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  538. 38 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  539. 39 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  540. 40 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  541. 41 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  542. 42 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  543. 43 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  544. 44 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  545. 45 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  546. 46 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  547. 47 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  548. 48 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  549. 49 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  550. 50 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  551. 51 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  552. 52 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  553. 53 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  554. 54 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  555. 55 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  556. 56 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  557. 57 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  558. 58 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  559. 59 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  560. 60 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  561. 61 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  562. 62 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  563. 63 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  564. 64 {set LockRefDly 11111 ; set LockFBDly 11111 ; set LockCnt 0011111010 ;set LockSatHigh 0111101001 ;set UnlockCnt 0000000001}
  565. }
  566. puts "DADDR_28: FFFF\t-Power register leaving all interpolators on - "
  567. puts "DADDR_18: [xapp888_bin2hex 000000$LockCnt]\t-Lock Register 1: for M set to $div -"
  568. puts "DADDR_19: [xapp888_bin2hex 0$LockFBDly$UnlockCnt]\t-Lock Register 2: for M set to $div"
  569. puts "DADDR_1A: [xapp888_bin2hex 0$LockRefDly$LockSatHigh]\t-Lock Register 3: for M set to $div"
  570. return "28 FFFF 18 [xapp888_bin2hex 000000$LockCnt] 19 [xapp888_bin2hex 0$LockFBDly$UnlockCnt] 1A [xapp888_bin2hex 0$LockRefDly$LockSatHigh]"
  571. }
  572. proc xapp888_bin2hex {bits} {
  573. set abits ""
  574. for {set i 0} {$i <= [expr 15 - [string length $bits]] } {incr i} {
  575. append abits 0}
  576. append abits "$bits"
  577. set binValue [binary format B16 $abits]
  578. binary scan $binValue H4 hex
  579. return $hex
  580. }
  581. proc xapp888_hex2bin {hex} {
  582. for {set i 0} { $i <= [string length $hex]} { incr i 1} {
  583. append convert2bin [xapp888_hex2bin_ [string range $hex $i $i] ]
  584. }
  585. return $convert2bin
  586. }
  587. proc xapp888_hex2bin_ {hex} {
  588. return [string map -nocase {
  589. 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111
  590. 8 1000 9 1001 a 1010 b 1011 c 1100 d 1101 e 1110 f 1111
  591. } $hex ]
  592. }
  593. proc xapp888_dec2hex {value} {
  594. # Creates a 16 bit hex number from a signed decimal number
  595. # Replace all non-decimal characters
  596. regsub -all {[^0-9\.\-]} $value {} newtemp
  597. set value [string trim $newtemp]
  598. if {$value < 65535 && $value >= 0} {
  599. set tempvalue [format "%#010X" [expr $value]]
  600. return [string range $tempvalue 6 9]
  601. } elseif {$value < 0} {
  602. puts "Unsigned value"
  603. return "0000"
  604. } else {
  605. puts "Violates 16 bit range"
  606. return "FFFF"
  607. }
  608. }
  609. proc xapp888_drp_settings {m d phase bw} {
  610. if {$phase < 0} {set phase [expr 360 + $phase]}
  611. set data_m [xapp888_drp_calc_m $m $phase]
  612. set data_d [xapp888_drp_calc_d $d]
  613. set data_cpres [xapp888_cpres $m $bw]
  614. set data_locking [xapp888_locking $m]
  615. return "$data_m $data_d $data_cpres $data_locking"
  616. }
  617. proc xapp888_dec2bin {dec bits} {return [binary scan [binary format I $dec] B32 var;string range $var end-[expr $bits-1] end]}
  618. proc xapp888_dec2bindt {dec} {
  619. return [string map { 0 000 1 001 2 010 3 011 4 100 5 101 6 110 7 111} $dec]
  620. }
  621. proc xapp888_help {} {
  622. puts "\n\n-----------------------------------------------------------------------------------------------\
  623. \nXAPP888 TCL commands:\
  624. \n xapp888_create_project <> - Basic project setup. Adjust as needed\
  625. \n xapp888_help <> - Descriptions of added TCL commands\
  626. \n\nXAPP888 TCL DRP Settings:\n The following TCL commands are being added to give example calculations\
  627. \n for drp programming values for MMCME2 (7 series). For other architectures care\
  628. \n should be taken due to VCO and programming addresses. This script can be altered\
  629. \n to adjust for those differences but exact settings should be reviewed.\
  630. \n\n Also please note that this is a subset of the full programming options.\
  631. \n Fine phase shifting and dynamic phase shifting is not directly supported by\
  632. \n these scripts.\
  633. \n\n xapp888_drp_settings <CLKFBOUT_MULT> <DIVCLK_DIVIDE> <PHASE> <BANDWIDTH>\
  634. \n - BANDWIDTH can be: LOW, LOW_SS, HIGH, OPTIMIZED (case insensitive). \
  635. \n - Displays & Returns the ordered pairs of DRP addresses & Data
  636. \n xapp888_drp_clkout <DIVIDE> <Duty Cycle e.g. 0.5> <Phase e.g.11.25> <CLKOUT0 to CLKOUT6> \
  637. \n - Displays & Returns the ordered pairs of DRP addresses & Data
  638. \n xapp888_merge_drp_clkout <list>\
  639. \n - Returns the ordered DRP addresses/data merging fractional address 07 & 13
  640. \n\n For Example:\
  641. \n\t xapp888_drp_settings <m> <d> <phase> <bw>;\
  642. \n\t xapp888_drp_clkout <div> <dc> <phase> clkout0;\
  643. \n\t xapp888_drp_clkout <div> <dc> <phase> clkout1;\
  644. \n\t xapp888_drp_clkout <div> <dc> <phase> clkout2;\
  645. \n\t xapp888_drp_clkout <div> <dc> <phase> clkout3;\
  646. \n\t xapp888_drp_clkout <div> <dc> <phase> clkout4;\
  647. \n\t xapp888_drp_clkout <div> <dc> <phase> clkout5;\
  648. \n\t xapp888_drp_clkout <div> <dc> <phase> clkout6;\
  649. \n\n To show how to use the xapp888_merg_drp command the following is an arbitrary example"
  650. puts { set drp "[xapp888_drp_settings 2.125 2 0 high]"}
  651. puts { set drp "$drp [xapp888_drp_clkout 3.75 0.5 90 clkout0]"}
  652. puts { for {set i 1} {$i <= 6} {incr i} {set drp "$drp [xapp888_drp_clkout 7 0.5 90 clkout$i]"} }
  653. puts { xapp888_merge_drp $drp}
  654. puts "-----------------------------------------------------------------------------------------------"
  655. }
  656. xapp888_help