From 1c55b4203842e7b0c483b95cf954ef990023ad07 Mon Sep 17 00:00:00 2001 From: Erik Strand <erik.strand@cba.mit.edu> Date: Wed, 29 Sep 2021 23:30:08 -0400 Subject: [PATCH] Add iCE40 FPGA --- GPIO/iCE40/.gitignore | 6 ++++ GPIO/iCE40/Makefile | 29 +++++++++++++++ GPIO/iCE40/README.md | 41 ++++++++++++++++++++++ GPIO/iCE40/icebreaker.pcf | 54 ++++++++++++++++++++++++++++ GPIO/iCE40/img/ring_12mhz.png | Bin 0 -> 5643 bytes GPIO/iCE40/img/ring_55mhz.png | Bin 0 -> 5457 bytes GPIO/iCE40/img/ring_60mhz.png | Bin 0 -> 5578 bytes GPIO/iCE40/img/ring_64mhz.png | Bin 0 -> 5256 bytes GPIO/iCE40/ring.v | 64 ++++++++++++++++++++++++++++++++++ index.html | 7 ++++ 10 files changed, 201 insertions(+) create mode 100644 GPIO/iCE40/.gitignore create mode 100644 GPIO/iCE40/Makefile create mode 100644 GPIO/iCE40/README.md create mode 100644 GPIO/iCE40/icebreaker.pcf create mode 100644 GPIO/iCE40/img/ring_12mhz.png create mode 100644 GPIO/iCE40/img/ring_55mhz.png create mode 100644 GPIO/iCE40/img/ring_60mhz.png create mode 100644 GPIO/iCE40/img/ring_64mhz.png create mode 100644 GPIO/iCE40/ring.v diff --git a/GPIO/iCE40/.gitignore b/GPIO/iCE40/.gitignore new file mode 100644 index 0000000..9bc6787 --- /dev/null +++ b/GPIO/iCE40/.gitignore @@ -0,0 +1,6 @@ +/*.asc +/*.bin +/*.json +/*.rpt +/*.nplog +/*.yslog diff --git a/GPIO/iCE40/Makefile b/GPIO/iCE40/Makefile new file mode 100644 index 0000000..44aaad5 --- /dev/null +++ b/GPIO/iCE40/Makefile @@ -0,0 +1,29 @@ +PROJ = ring + +all: $(PROJ).rpt $(PROJ).bin + +$(PROJ).json: $(PROJ).v + yosys -ql $(PROJ).yslog -p 'synth_ice40 -top top -json $@' $< + +$(PROJ).asc: $(PROJ).json icebreaker.pcf + nextpnr-ice40 -ql $(PROJ).nplog --up5k --package sg48 --freq 111 --asc $@ --pcf icebreaker.pcf --json $< + +$(PROJ).bin: $(PROJ).asc + icepack $< $@ + +$(PROJ).rpt: $(PROJ).asc + icetime -d up5k -c 111 -mtr $@ $< + +prog: $(PROJ).bin + iceprog $< + +sudo-prog: $(PROJ).bin + @echo 'Executing prog as root!!!' + sudo iceprog $< + +clean: + rm -f $(PROJ).yslog $(PROJ).nplog $(PROJ).json $(PROJ).asc $(PROJ).rpt $(PROJ).bin + rm -f $(PROJ)_tb $(PROJ)_tb.vcd $(PROJ)_syn.v $(PROJ)_syntb $(PROJ)_syntb.vcd + +.SECONDARY: +.PHONY: all prog clean diff --git a/GPIO/iCE40/README.md b/GPIO/iCE40/README.md new file mode 100644 index 0000000..08bc585 --- /dev/null +++ b/GPIO/iCE40/README.md @@ -0,0 +1,41 @@ +# iCE40 Ring Test + +## Dependencies + +- [IceStorm tools](https://github.com/YosysHQ/icestorm) +- [yosys](http://www.clifford.at/yosys/download.html) +- [nextpnr](https://github.com/YosysHQ/nextpnr) + +Install instructions for all of the above tools can be found on the [IceStorm +website](http://bygone.clairexen.net/icestorm/). + +## Building + +The default `make` target synthesizes the design and runs a timing analysis. The target `prog` +programs an available iCEBreaker via USB. + +## Results + +When clocking the FPGA at 24MHz, the resulting ring oscillation is still identifiable as a square +wave. + + + +By 111MHz, it's more of a triangle wave. But still stable and nearly rail to rail. This is the +fastest clock speed that `icetime` approves. + + + +Despite not passing the timing analysis, when the FPGA is clocked at 120MHz no problems seems to +occur. + + + +Even at 129MHz, stable ring oscillation can occur. I (Erik) thought that the first time I ran it I +got a chaotic, aperiodic signal. But I haven't been able to reproduce this so I might have made a +mistake. Still, I'll hold off on declaring this result official. + + + +At faster clock speeds things start to go wrong. Usually there's still a periodic ring oscillation, +just much slower than one would hope. diff --git a/GPIO/iCE40/icebreaker.pcf b/GPIO/iCE40/icebreaker.pcf new file mode 100644 index 0000000..03088f2 --- /dev/null +++ b/GPIO/iCE40/icebreaker.pcf @@ -0,0 +1,54 @@ +# 12 MHz clock +set_io -nowarn CLK_12MHZ 35 + +# RS232 +set_io -nowarn RX 6 +set_io -nowarn TX 9 + +# LEDs and Button +set_io -nowarn BTN_N 10 +set_io -nowarn LEDR_N 11 +set_io -nowarn LEDG_N 37 + +# RGB LED Driver +set_io -nowarn LED_RED_N 39 +set_io -nowarn LED_GRN_N 40 +set_io -nowarn LED_BLU_N 41 + +# SPI Flash +set_io -nowarn FLASH_SCK 15 +set_io -nowarn FLASH_SSB 16 +set_io -nowarn FLASH_IO0 14 +set_io -nowarn FLASH_IO1 17 +set_io -nowarn FLASH_IO2 12 +set_io -nowarn FLASH_IO3 13 + +# PMOD 1A +set_io -nowarn P1A1 4 +set_io -nowarn P1A2 2 +set_io -nowarn P1A3 47 +set_io -nowarn P1A4 45 +set_io -nowarn P1A7 3 +set_io -nowarn P1A8 48 +set_io -nowarn P1A9 46 +set_io -nowarn P1A10 44 + +# PMOD 1B +set_io -nowarn P1B1 43 +set_io -nowarn P1B2 38 +set_io -nowarn P1B3 34 +set_io -nowarn P1B4 31 +set_io -nowarn P1B7 42 +set_io -nowarn P1B8 36 +set_io -nowarn P1B9 32 +set_io -nowarn P1B10 28 + +# LEDs and Buttons (PMOD 2) +set_io -nowarn LED1 26 +set_io -nowarn LED2 27 +set_io -nowarn LED3 25 +set_io -nowarn LED4 23 +set_io -nowarn LED5 21 +set_io -nowarn BTN1 20 +set_io -nowarn BTN2 19 +set_io -nowarn BTN3 18 diff --git a/GPIO/iCE40/img/ring_12mhz.png b/GPIO/iCE40/img/ring_12mhz.png new file mode 100644 index 0000000000000000000000000000000000000000..32bfb41babac05c30731b593a01f29e03533c659 GIT binary patch literal 5643 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 E4}Ls%4FCWD literal 0 HcmV?d00001 diff --git a/GPIO/iCE40/img/ring_55mhz.png b/GPIO/iCE40/img/ring_55mhz.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6bed31b2ccb922130a8d2571b6d1d03940ce37 GIT binary patch literal 5457 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 PDFCKxc%w|)F5*7`MiwCI literal 0 HcmV?d00001 diff --git a/GPIO/iCE40/img/ring_60mhz.png b/GPIO/iCE40/img/ring_60mhz.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8e2b9d547b618a2279b6cfa5389df5b19faaac GIT binary patch literal 5578 zcmb`LbyQUEy2po+4ha#Y8;g<wRC0#yW{?)8Q>42?=}=mR29c0vMnXawhIVKK1Vn~r z9P*<6e#d*xy63FB*1iAiXYc)f*R!AZ`@H+z>$6{Isw<EY(-Q*#05T;-S#1CSXYum< z8zJ!WcxZ@20RUW2RFZ}0dSz{8Z@MqDQpn%_$W@S%l8|H^qM}H|$Hvu&n+l^k>VCij zA!H+pfV5zq9XZ7Cl2^tDL#j_s;r;=0e6*>mNeo4*G%sY?6YmtI4*7f}>+)0zr(8cC z1k|Osm~D78A79A0!{f7EiyH$}Iz101bim!!YJo4RUrTE5)nCfUqHyUADaevn5^ggp zjM$J}%-!EfbyzP`nMq+g7Nc5N@laT?9PXOdHE|FG1WVGH!g48dT0^}2dRDrcjaT<` zwki~VN`005Ko|U_`6Wd{XPZ4~O%nUGuXs;oVMfmproNfatR!i1;VWGqq^PkYDmk$g z$<#T|V(jBKiTfzdnw4OwBBIK;q9{&Y?dsh<E1L|A9e&B6n}6ZV;kOI&32fHwjZtua zjO@il)4Q8`lGuoe-3sxN&08`D7~`ll1Y_AviJ~CCY<6U&l|YA3HrLsmYA+;zEZRx0 z&?0h}7s%AYtkgLwplYZ11LaA(j<uF1hd(2y4>q;MFHzHm<%;HjHU`LR3*K5qm}|rI zrCwos9^#2!Tqx!%P_7S$OWeji#;xkg?eG(_{N!tjQ%~%sy*bQ-#LmS`=tDPcO3yNi zCh%1<5~<M<m&QY2?mh9Coh}=&C1d`&4j1h(`Ft|r0Ry+%^&#OaLabCaHW18vSG4R| z(ooii?b$ghDqDrT<s|htn%1L@8=4De0jiu-FJwjEWDvSpxqjQ+Oy;TfvBVN^hWDm~ zTO_VRV7)$wcOOKJsuFmr!>$6$m0EV}9?M7Jfxe5|j7vK{82AxQ31S46U$F|iajzpp zR18!XOvffa@T{2DCWtVwjZYOIV#|dzGs~f|Vj~f`)T@|**yYfCNFilHt1uBifB!F# z4qtOM7>*z-a>q1mhTg#?$c4hji=V>g1|cr}e4HW-XFxhZ^U46>`^OPX3#i{u#RCyi zwHrN!WaI3yA^`w-2n+`h69T>hxDn2pi=RgM<Rj@ujy%tXV~A_oE-i@_1t%^*fDA|m zcub8;4`{nZC<F-7BBZhlqGO{OU{$<vS@q9I2zX5YXPm+Y0LZT;qvBo`NGJ2E?$Pcc z7F!!-I5t$A6tfP`zDE9!Ouv-B3RzN@CKKT3456D<`VUDdIL84XX`VDlf&lP$qyV%D z{VM8DDmKLu9ILQL0->ztxW6MCAjtO5_^&ztZ4Ex8o$#kc_z-CTVC-K!DRfK_po{Ev zXiJuREe-wrFm)a|C0#xL@b334uYYzAFBl&nK<xRKF^lT|A?ZJi4hf_DWq3#!08sR& z5x-MG{;~s?h~t+nxI{Pr)zF`f`aS-uB_Uz-zg86?mHb~32uQ>KRmz{1IfjPyK2Wu~ z@`k6Hy1IR+=^&zoCh2g<z<jMU^k>n3l)rpzO#Z!Q@IC)~(oe6!W_)O$azja9<I0=- z%d4X^A+L=qokvuL=c2BdE5f!tF<y;pV-n13i~w!062{lrp8i=gyt`x03BBCm?{`pN zgrnVdDahe3l%$&~L(G{n9eRkF<7B&HPA)9WtltqHEH4#pOn{1d)slV14O1G(Q~Lu= zjx5D>E;XtBWt!~fV=FDK8p7?BQ~I>crgLZLqF#v{^z(-rbe6}7@+mZ@*bPS=M?czE zUo*Kk=^fb>A5@mk3|>kCq^3`J9gf7-T3RFvg9P7L#`5^f)dbd-k!e|@niDynvTlSM z*rb$0q_tM6WK8)kPPP(F?Q%u3Trc0iFW?_nZ{wX}T^cgq(rxkaUDJ5*rNCef5l2Jc zC7YmW+;6MwwmY-+N?4TLbRRgsjb2_RJ$WdI8c=a*Zt=JxkGYphe9N`mpWoqnE0%_> zL&vx<w`sx5<X$>ga>AhecOGQGV4Cc4H!}OFtpiCw_funN!}wX;7Az{cZbi<NukwD3 z7!j5au8V6x9xF!Lb*}nse!GdGpcvd=`+6J2!g9s;*686rUdqrto9$r@sgQ+07RuJ+ zUZK1NKbA!4<;XW-E3**hjXZq!qD(M9@9Em<Dd|SYE0W}RNiv0{*^RO%jq*ICVKHSR zt0uZfq7nHYmU*}8jtY$up4|=+TI<<C*P&QS_utZC5GUtOlI@$5pNa<4`@7CgKd=*f zunTyrh{Qe`S!b$o=$@t+h9OC%h=dP0-%iP6kB#h>*SbykBH%VG<c3zud%enW*7R8m zNk2Z1aNDN>g+)+WZSQ9XlD0~*3ZI^XJgGIUP+CxFqvC7Z`lylgtH9>`O_KbB^Q3GP z=Q%RoWyR~$RSmm_%+djLTN^kTDd`Lj$&<+%K$U}@HzEnAfm_ZZGm&TWtsQlwsJSws zhg4KMZ0`Mxw-+f0wk`0drv@XUj{BCH<|=}iVkc?VLkUi{5Rbo@pyiM3c=@U0$kmq> zfN?B-DIBL(!pAUjtyN;RhXLYK!_{;BCG?!syP}W2sxc7uWuB?v&05I!j#T(FR+2R# zzQYcB)a?B|j|Cy^ch0w$wZ47a=*~~l`3?oqcZIzjkMIHz46X+pBV-b)CPy_U`SB&F zQE$ZJW;dK_g7hZqshk8GRVyBWGaFcY56o6Yts0i?HdMX(3Tb_S{(gr0pJQ|xXJ?}* zVny`8`jwj}W!Z=zd}qj81j5d`a+2dpG0mKjrUtA`L0wrSUwA5>4&$9eHz9M6z&`)A z%+g@hS6O|Gw~C!=O|;eQn!lCqLX4y-gC3`_P`-1Iz7mWizSFsHuep2@kKD@A=UWSj zRXr9??LDs(AE@u9HuzjFN;LZ3^;VUGc17A(*}L$CI=97YmBcmBm)-4`)Mic5^<-4a zNn{FUJukZwmK<|2_XU@+sw_(5{Li09e*57mr*7X}L|Xjv<pNidd2X~MGkSBgrh=S} zRuxWpEEnfiH0ddqSE*T{DK0F&Zo_5tK5X<M9CJQV(@fwS*hPZwSN1qFTqvA9NtQh{ z#vt}~P3zbjKpj!woA>X(_0#v-JLF_``@y8fk&9)@+q>>0#&9)5%O&2qfzDlqYkz*h z|E7;^p?3J`Y5AC(zGp{#n%1U84<+c%w7~uRWtX_GKog8ZM;1CV-HrJ3ZmrBFf{I7{ z5OL_8gl?{NC-am_7=s5j!);uHp;5s{?jNaJnzwhLKaSw&VW^?T`wGkp!*GTRID)dg ztYM0Scp9H*0^fA5L&m7prw(;liG9!(DF67g=}U~=mrw!p=j8i+2G2iI!)<!0eLqA) zQQXtk^6o6`*S7U!I22319v_O9l`Q%ZHA5fS@jk+whp4T`z~j_whe*d==n6zm4@o{l zVH160Wv(TMq;=`6(ymX|M?=!{KTd2^Yn45`m(>z<9H1=|45d*!TQXVgg{-=5oMo6z zThbMv9O0c*Lc)dpcOW3#LY=mqyM{!y)m}}^$(egzV=VK13!g7l*jSST6)XdST2sf` zFmO(&l<;6`s(4RFH>m?*f@`It+whXE`_Ml5azjAOWej-JfyN^mWFH^+A7Nh>*d|o@ zDVJD&f=Jnx(Z%{j#n7o)8)#Wy;6_J4+D-c>#wxofh(B}jlr|Y}X@dtJg`D4kYGzud zIz4k#%Ln?nU)8xAjDGH<zb{}#8$8K4ZzAoHfnYQ_IuH(wE|}W&uA`xLpJa*HDmp@j z(ijrCrOG((W!Z$QqjrZVv*#CfCtI$uq*G<gLzzd*g6y)3mzSnJ?w5xF{hJPc=xrCR zH$G-!p)3P^5TmK;+s-Q=b-^FK{dfVPas6$BGmg==EMkG_&cp)ec<xS9A_6rca((bY zwLG6t{-J!|TRLK~kv)n|QxhTTRCy7HIsXd#Pfk*$voS@k;1_h|Ob~DJ?<jGbsQ|mJ zbNk?OyxNoeXhZ%`(fPV{+q2WsxcGAlL-ORfXmQ9AR%dE+qyB*(ivBQwL+Zi8F;T^w z?d4aBy2_Scd*<s9(k*HI+zmYCmD)kOlLee}ik+Q9I5<XxS8N*|1(3{J+Jktgk##~H zJpv95$~*d!#oz{p`8itX8ydXthpJtiy!hso`5%?&ACAZuJ(^n7kH-_kb0`2UF@Gfr z4QsDGat$|1T<hCLNL0(|eW%FK1G#mUi9-#VF(-w3KN?3&qmbiu<_%tTB`=xE!t_AX zbBpj^QjJ3csNs%>j`ysM!dvofbUbH{PD4;Lb6RRH+GlmSqi=da$KT87?&HHjc>{eE zUBtv3_Ex|%!(b0R{YUH=4|urd$Wr-X+aY|`Nw~qdsJHWzWfbYQAzp3G5oWyEa{!jS z@^+|tA1+!0?k_*q6O9aK5y{qZQK%d7Sb|hc>C?r#BGUKy!VQlnF#2_Z<HV858dV}) za34=*uI4rnNp0Eqi6eYi`qex?o)DF2bjg#<#AF5)U7|?I9G_P4s#kZ$TEA-Cb@<{_ zUL%qAuCN}`Zo$Z1gR{VH-;3pKT3p?upW$lYKI(fp?Y@b}^~1Kxn7OHPr3Wu(xbdan znQLS?K@A#naH<vXv3t1{?B-nQ4HfD~H^SUT3ccaJiE>;XW||@)A82oQ3?=&_(P<>y z*YZEs1@<KRTCW&qt95f)V2<89xEhcI456CG_tBYy*Wax5%w<+TsA_88XLQNy>Q=5_ z#NthFZJn8-Vm<xWW|K%>E5LPA2}GRaJQ6%V+qybS^tKp4{jBXr<{o~L|85iA-EnZF z+tV_{&D%JB;LL_}LXdEO6Yu-%fv9KY-8LLTQ5KWYo*$u><X5`ug*`f-w}-d-7X*p9 zaf4c0qQU*@_Dj!Rg<pWb@i<g_Hv(UhKm+h6zrT+q6||(GdFJlGU@`W-{r$MX=VK23 zva+19d8J!nBGk;v$!g8;FNM(SSjx@865msgy9oPyzb`S;2qgvwkC8p#q=ah`^tv~S zY;fJn=}gfvg`jzl_Xi)OJz+xbbt>RwrdmlEn%Eq0tAx0$Z?nE9ORdP(a#QK+RB(MU zJJe_`fW_g0H;>bT-O_lq8F%_@vOg(|Ori>p=q=CnXP&i#SFuVx+hH*(<~Wf~oqi0x z?SbzGV-xyUuL~O3aXe&zYPU69voT=c)_X)_CWG-^!m7saFhNK&e=I)I{WRilJ)9)Z z;{7D`wja)#CF8W`QIEI}g6qIS#|E>7JB{Z~JDIqO*zjPLlAxne@Nia#4WT_>$NDry zP1(|GS)l~-7FGPOcCrw!v2BaTZi+?rL`8ow#p0o}?h{i*{Al50sFsp)G*LNw+h}~A zL!FY+I;NC-$I6(ma*ICQJt>sUIdqrrTYv-+D(N+iL-7z(AVjy1>mqUH8(gPM<aFsC zU8su63>U*ZpW+R+kFRs{L%dgz@v72mJJ}p7E}nu@Z>lNJ#uhEm?^#XV6JH$dK3iDW zV2U3}1oi=D-@iYf1d<gm`CSqFa)2j(AF;;#2hiq)6iY~dqS4bR)?Ds?3n6`ZVCN84 zbLQWC^c!hDDJLM$=EDt=X3b(hUGl?&A^hMst<?o1m+;W$@)CDiXI+8gl8w4czd|DE zV=sY)vA7!CKjZgrNva&zr<Wc8xE02G^%5J$scjSzC;%{K#+oYt0p&6Vy+*aWxIbC% zWA<-eiaBI8e<&V(1ppHj=OOx=Nq^zpPUgP=(GRu%f$IMM04(M2?L&jcfcO%qjD2Lx zNP2zN-c`ANf&4S7{W5=6=`S)B`#)11E|G9s48>1CkNGS9Z$UjHnWQ#69cli_On~Fk zSOE@T@Z=>_|8<cU3brP`oQ_4J+-rhh?r5Isp6ayKX(FMYzp&zpkAZ6JiHZdtM8VvN zik$fyTu6-|vpl}h8AgPrmW+T6!x`=R+I~8!Il^<9?!fj~9{-LVp&uxALjFlTL%$6Y zB1+)@^!nw!&YN3~T~=>~Zvx4PklE5DC2S8~fHicq?pT};tuODF$u%LPo6xEdU)3?8 z!Hk>OJi)Ps%ocr9@x8SyUAYM+*|85#^zTYtBu)<2+6{d36%6F&U!5erLG1Rzdr7V+ zXk91KeB$m=Jec1-pK0zcR^+0%)#1SB>jg};L~K9q#+mhooaKikd18k1wVoU$_TY*K zQ33onHXY>sI7$si-xWF5_NJ})LN8SN>~q1i84W_Em&}-deqja!HCs231cBpKK85lz zJ`WF2mK(<vbt}6VvUo)>q8-ayDsy0M7R-0As1zKTU8M=@=X$V!Th~M67O>~ciQG3{ zZ+8h+KSxnB1;=%Y@*@cdw3@(?)paX_8?|yT?h)YmY%C<KBVOZ92MRo0Ng5m>FluBa z6e=j?LlV=Mb0e2>ws1vto`w&Z@CTa;7bSxEO%@zyzx3SrpgTX{9v1|b$$$g5bcLoD zX$XLGiZD>+&4p0#O|^^t9O+>77GPfriQCex=XEFOtbz|B#8mY(>wYGVud3Snp}Dgc z<$G(VhbwmpFfb6UR6O`ZCEQujlpq+bj=hH{h!@{(As$^kKdxU2yu(~$-`sWYEa|RQ z{oY#Okksdtn0w*)sm5#rv8Lp{*{7{LX(mnJ%4y?pX!rNWZeM|9N`@>op?AW75)^^B z)4ap`Ztpy=1oLs$jX$PHfBHDsicz{V*&6T)B1iVobv=@c3_~qxL#8pp6ZVom1Tv#Y bdQJcp%%izT>%zPIM+;DrQ<trfejM^&-O@xK literal 0 HcmV?d00001 diff --git a/GPIO/iCE40/img/ring_64mhz.png b/GPIO/iCE40/img/ring_64mhz.png new file mode 100644 index 0000000000000000000000000000000000000000..f91a302a7e93ff797e3b5ccdc0bc433dc69fd88d GIT binary patch literal 5256 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 literal 0 HcmV?d00001 diff --git a/GPIO/iCE40/ring.v b/GPIO/iCE40/ring.v new file mode 100644 index 0000000..4e4c830 --- /dev/null +++ b/GPIO/iCE40/ring.v @@ -0,0 +1,64 @@ +// Cause yosys to throw an error when we implicitly declare nets +`default_nettype none + +module top ( + input CLK_12MHZ, // system clock + output P1A1, + input P1A2, +); + wire clk; + wire clk_lock; + SB_PLL40_PAD #( + .FEEDBACK_PATH("SIMPLE"), + .PLLOUT_SELECT("GENCLK"), + .FILTER_RANGE(3'b001), + // == 24 MHz == (boring slow) + //.DIVR(4'b0000), + //.DIVF(7'b0111111), + //.DIVQ(3'b101) + // == 48 MHz == (getting interesting) + //.DIVR(4'b0000), + //.DIVF(7'b0111111), + //.DIVQ(3'b100), + // == 96 MHz == (knocks the socks off MCUs) + //.DIVR(4'b0000), + //.DIVF(7'b0111111), + //.DIVQ(3'b011) + // == 111 MHz == (fastest I can go while still passing timing tests) + //.DIVR(4'b0000), + //.DIVF(7'b1001001), + //.DIVQ(3'b011) + // == 120 MHz == (overclocked -- doesn't pass the icetime analysis, but seems stable) + .DIVR(4'b0000), + .DIVF(7'b1001111), + .DIVQ(3'b011) + // == 129 == + // (possibly unreliable -- once saw unstable oscillation, though it's worked since then) + //.DIVR(4'b0000), + //.DIVF(7'b1010101), + //.DIVQ(3'b011) + // == 141 == (breakdown -- resulting oscillation is stable but only 35.25MHz) + //.DIVR(4'b0000), + //.DIVF(7'b0101110), + //.DIVQ(3'b010) + // == 165 MHz == (breakdown -- resulting oscillation is stable but only 41.25MHz) + //.DIVR(4'b0000), + //.DIVF(7'b0110110), + //.DIVQ(3'b010) + ) clk_pll ( + .PACKAGEPIN(CLK_12MHZ), + .PLLOUTGLOBAL(clk), + .LOCK(clk_lock), + .RESETB(1'b1), + .BYPASS(1'b0) + ); + + always @(posedge clk or negedge clk_lock) begin + if (!clk_lock) begin + P1A1 <= 1'b0; + end else begin + P1A1 <= !P1A2; + end + end + +endmodule diff --git a/index.html b/index.html index 8725abd..dc2fe4b 100644 --- a/index.html +++ b/index.html @@ -39,6 +39,13 @@ The GPIO test measures how quickly pins can communicate with a processor core; t <th>date</th> </tr> +<tr> +<td>60.00</td> +<td>iCE40UP5K</td> +<td>iCEBreaker V1.0e, 120 MHz, <a href=GPIO/iCE40/ring.v>Verilog</a> (<a href=GPIO/iCE40/README.md>notes</a>)</td> +<td>September, 2021</td> +</tr> + <tr> <td>23.08</td> <td>IMXRT1062</td> -- GitLab