From 94cb7ea67bed704ba47a3a8ebc4d042c4ad2572e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 26 Mar 2024 17:46:38 +0000 Subject: [PATCH] Deploy alchitry/alchitry.github.io to alchitry/alchitry.github.io:gh-pages --- 404.html | 461 ++++++ CNAME | 1 + alchitry-labs/index.html | 535 +++++++ alchitry.svg | 226 +++ apple-touch-icon.png | Bin 0 -> 9957 bytes atom.xml | 564 +++++++ boards/au/index.html | 545 +++++++ boards/br/index.html | 551 +++++++ boards/cu/index.html | 551 +++++++ boards/ft/index.html | 545 +++++++ boards/index.html | 612 ++++++++ boards/io/index.html | 551 +++++++ boards/page/1/index.html | 6 + css/override.css | 32 + css/styles.css | 1330 +++++++++++++++++ elasticlunr.min.js | 10 + favicon.svg | 167 +++ favicon_16.png | Bin 0 -> 682 bytes favicon_32.png | Bin 0 -> 1574 bytes index.html | 672 +++++++++ .../index.html | 619 ++++++++ news/alchitry-labs-v2-cli/index.html | 649 ++++++++ news/alchitry-labs-v2-update-1/index.html | 635 ++++++++ news/alchitry-labs-v2-update-2/index.html | 641 ++++++++ news/alchitry-labs-v2-update-3/index.html | 605 ++++++++ news/alchitry-labs-v2/index.html | 632 ++++++++ news/alchitry-loader-v2/index.html | 587 ++++++++ news/atom.xml | 544 +++++++ news/index.html | 787 ++++++++++ news/lucid-v2-update-1/index.html | 620 ++++++++ news/lucid-v2-update-2/index.html | 690 +++++++++ news/lucid-v2/index.html | 661 ++++++++ news/page/1/index.html | 6 + robots.txt | 4 + search_index.en.js | 1 + sitemap.xml | 305 ++++ tags/index.html | 492 ++++++ tags/page/1/index.html | 6 + tutorials/background/addition/index.html | 556 +++++++ .../background/combinational-logic/index.html | 556 +++++++ tutorials/background/digital-logic/index.html | 550 +++++++ tutorials/background/encodings/index.html | 556 +++++++ .../how-does-an-fpga-work/index.html | 556 +++++++ tutorials/background/index.html | 694 +++++++++ tutorials/background/multiplexers/index.html | 556 +++++++ tutorials/background/page/1/index.html | 6 + tutorials/background/subtraction/index.html | 550 +++++++ .../background/what-is-an-fpga/index.html | 556 +++++++ tutorials/index.html | 531 +++++++ tutorials/lucid-1-vs-2/index.html | 543 +++++++ tutorials/lucid_v1/components/index.html | 556 +++++++ tutorials/lucid_v1/ddr3-memory/index.html | 550 +++++++ .../lucid_v1/hello-your-name-here/index.html | 556 +++++++ tutorials/lucid_v1/index.html | 676 +++++++++ tutorials/lucid_v1/io-element/index.html | 556 +++++++ .../lucid_v1/mojo/analog-inputs/index.html | 561 +++++++ tutorials/lucid_v1/mojo/basic-cpu/index.html | 561 +++++++ tutorials/lucid_v1/mojo/camera/index.html | 561 +++++++ tutorials/lucid_v1/mojo/components/index.html | 561 +++++++ .../lucid_v1/mojo/external-io/index.html | 561 +++++++ tutorials/lucid_v1/mojo/hdmi/index.html | 561 +++++++ .../mojo/hello-your-name-here/index.html | 561 +++++++ tutorials/lucid_v1/mojo/index.html | 749 ++++++++++ tutorials/lucid_v1/mojo/io-shield/index.html | 561 +++++++ tutorials/lucid_v1/mojo/page/1/index.html | 6 + tutorials/lucid_v1/mojo/page/2/index.html | 629 ++++++++ .../mojo/register-interface/index.html | 561 +++++++ .../lucid_v1/mojo/roms-and-fsms/index.html | 561 +++++++ tutorials/lucid_v1/mojo/sdram/index.html | 561 +++++++ tutorials/lucid_v1/mojo/servos/index.html | 561 +++++++ .../lucid_v1/mojo/sound-locating/index.html | 555 +++++++ .../mojo/synchronous-logic/index.html | 561 +++++++ .../mojo/your-first-fpga-project/index.html | 555 +++++++ tutorials/lucid_v1/page/1/index.html | 6 + tutorials/lucid_v1/roms-and-fsms/index.html | 556 +++++++ .../lucid_v1/synchronous-logic/index.html | 556 +++++++ .../your-first-fpga-project/index.html | 878 +++++++++++ tutorials/page/1/index.html | 6 + tutorials/projects/clock-clock/index.html | 556 +++++++ tutorials/projects/gpu/index.html | 550 +++++++ tutorials/projects/hexapod/index.html | 550 +++++++ tutorials/projects/index.html | 574 +++++++ tutorials/projects/page/1/index.html | 6 + tutorials/setup/icecube2/index.html | 556 +++++++ tutorials/setup/index.html | 586 ++++++++ tutorials/setup/ise/index.html | 550 +++++++ tutorials/setup/page/1/index.html | 6 + tutorials/setup/vivado/index.html | 550 +++++++ .../creating-a-vivado-project/index.html | 550 +++++++ tutorials/verilog/index.html | 551 +++++++ .../verilog/mojo/analog-inputs/index.html | 561 +++++++ .../mojo/asynchronous-serial/index.html | 561 +++++++ .../verilog/mojo/avr-interface/index.html | 561 +++++++ .../mojo/creating-an-ise-project/index.html | 555 +++++++ .../mojo/embedded-processors/index.html | 555 +++++++ tutorials/verilog/mojo/external-io/index.html | 561 +++++++ .../mojo/finite-state-machines/index.html | 561 +++++++ tutorials/verilog/mojo/fpga-timing/index.html | 561 +++++++ tutorials/verilog/mojo/hello-world/index.html | 561 +++++++ tutorials/verilog/mojo/index.html | 750 ++++++++++ .../verilog/mojo/memory-mapping/index.html | 561 +++++++ .../metastability-and-debouncing/index.html | 561 +++++++ tutorials/verilog/mojo/page/1/index.html | 6 + tutorials/verilog/mojo/page/2/index.html | 702 +++++++++ .../mojo/pulse-width-modulation/index.html | 561 +++++++ tutorials/verilog/mojo/sdram/index.html | 561 +++++++ .../serial-peripheral-interface/index.html | 561 +++++++ tutorials/verilog/mojo/servos/index.html | 561 +++++++ .../verilog/mojo/synchronous-logic/index.html | 561 +++++++ .../mojo/using-core-generator/index.html | 561 +++++++ .../mojo/writing-test-benches/index.html | 561 +++++++ tutorials/verilog/page/1/index.html | 6 + .../verilog/verilog-operators/index.html | 550 +++++++ 113 files changed, 54421 insertions(+) create mode 100644 404.html create mode 100644 CNAME create mode 100644 alchitry-labs/index.html create mode 100755 alchitry.svg create mode 100644 apple-touch-icon.png create mode 100644 atom.xml create mode 100644 boards/au/index.html create mode 100644 boards/br/index.html create mode 100644 boards/cu/index.html create mode 100644 boards/ft/index.html create mode 100644 boards/index.html create mode 100644 boards/io/index.html create mode 100644 boards/page/1/index.html create mode 100644 css/override.css create mode 100644 css/styles.css create mode 100644 elasticlunr.min.js create mode 100755 favicon.svg create mode 100644 favicon_16.png create mode 100644 favicon_32.png create mode 100644 index.html create mode 100644 news/alchitry-labs-v2-0-5-simulations/index.html create mode 100644 news/alchitry-labs-v2-cli/index.html create mode 100644 news/alchitry-labs-v2-update-1/index.html create mode 100644 news/alchitry-labs-v2-update-2/index.html create mode 100644 news/alchitry-labs-v2-update-3/index.html create mode 100644 news/alchitry-labs-v2/index.html create mode 100644 news/alchitry-loader-v2/index.html create mode 100644 news/atom.xml create mode 100644 news/index.html create mode 100644 news/lucid-v2-update-1/index.html create mode 100644 news/lucid-v2-update-2/index.html create mode 100644 news/lucid-v2/index.html create mode 100644 news/page/1/index.html create mode 100644 robots.txt create mode 100644 search_index.en.js create mode 100644 sitemap.xml create mode 100644 tags/index.html create mode 100644 tags/page/1/index.html create mode 100644 tutorials/background/addition/index.html create mode 100644 tutorials/background/combinational-logic/index.html create mode 100644 tutorials/background/digital-logic/index.html create mode 100644 tutorials/background/encodings/index.html create mode 100644 tutorials/background/how-does-an-fpga-work/index.html create mode 100644 tutorials/background/index.html create mode 100644 tutorials/background/multiplexers/index.html create mode 100644 tutorials/background/page/1/index.html create mode 100644 tutorials/background/subtraction/index.html create mode 100644 tutorials/background/what-is-an-fpga/index.html create mode 100644 tutorials/index.html create mode 100644 tutorials/lucid-1-vs-2/index.html create mode 100644 tutorials/lucid_v1/components/index.html create mode 100644 tutorials/lucid_v1/ddr3-memory/index.html create mode 100644 tutorials/lucid_v1/hello-your-name-here/index.html create mode 100644 tutorials/lucid_v1/index.html create mode 100644 tutorials/lucid_v1/io-element/index.html create mode 100644 tutorials/lucid_v1/mojo/analog-inputs/index.html create mode 100644 tutorials/lucid_v1/mojo/basic-cpu/index.html create mode 100644 tutorials/lucid_v1/mojo/camera/index.html create mode 100644 tutorials/lucid_v1/mojo/components/index.html create mode 100644 tutorials/lucid_v1/mojo/external-io/index.html create mode 100644 tutorials/lucid_v1/mojo/hdmi/index.html create mode 100644 tutorials/lucid_v1/mojo/hello-your-name-here/index.html create mode 100644 tutorials/lucid_v1/mojo/index.html create mode 100644 tutorials/lucid_v1/mojo/io-shield/index.html create mode 100644 tutorials/lucid_v1/mojo/page/1/index.html create mode 100644 tutorials/lucid_v1/mojo/page/2/index.html create mode 100644 tutorials/lucid_v1/mojo/register-interface/index.html create mode 100644 tutorials/lucid_v1/mojo/roms-and-fsms/index.html create mode 100644 tutorials/lucid_v1/mojo/sdram/index.html create mode 100644 tutorials/lucid_v1/mojo/servos/index.html create mode 100644 tutorials/lucid_v1/mojo/sound-locating/index.html create mode 100644 tutorials/lucid_v1/mojo/synchronous-logic/index.html create mode 100644 tutorials/lucid_v1/mojo/your-first-fpga-project/index.html create mode 100644 tutorials/lucid_v1/page/1/index.html create mode 100644 tutorials/lucid_v1/roms-and-fsms/index.html create mode 100644 tutorials/lucid_v1/synchronous-logic/index.html create mode 100644 tutorials/lucid_v1/your-first-fpga-project/index.html create mode 100644 tutorials/page/1/index.html create mode 100644 tutorials/projects/clock-clock/index.html create mode 100644 tutorials/projects/gpu/index.html create mode 100644 tutorials/projects/hexapod/index.html create mode 100644 tutorials/projects/index.html create mode 100644 tutorials/projects/page/1/index.html create mode 100644 tutorials/setup/icecube2/index.html create mode 100644 tutorials/setup/index.html create mode 100644 tutorials/setup/ise/index.html create mode 100644 tutorials/setup/page/1/index.html create mode 100644 tutorials/setup/vivado/index.html create mode 100644 tutorials/verilog/creating-a-vivado-project/index.html create mode 100644 tutorials/verilog/index.html create mode 100644 tutorials/verilog/mojo/analog-inputs/index.html create mode 100644 tutorials/verilog/mojo/asynchronous-serial/index.html create mode 100644 tutorials/verilog/mojo/avr-interface/index.html create mode 100644 tutorials/verilog/mojo/creating-an-ise-project/index.html create mode 100644 tutorials/verilog/mojo/embedded-processors/index.html create mode 100644 tutorials/verilog/mojo/external-io/index.html create mode 100644 tutorials/verilog/mojo/finite-state-machines/index.html create mode 100644 tutorials/verilog/mojo/fpga-timing/index.html create mode 100644 tutorials/verilog/mojo/hello-world/index.html create mode 100644 tutorials/verilog/mojo/index.html create mode 100644 tutorials/verilog/mojo/memory-mapping/index.html create mode 100644 tutorials/verilog/mojo/metastability-and-debouncing/index.html create mode 100644 tutorials/verilog/mojo/page/1/index.html create mode 100644 tutorials/verilog/mojo/page/2/index.html create mode 100644 tutorials/verilog/mojo/pulse-width-modulation/index.html create mode 100644 tutorials/verilog/mojo/sdram/index.html create mode 100644 tutorials/verilog/mojo/serial-peripheral-interface/index.html create mode 100644 tutorials/verilog/mojo/servos/index.html create mode 100644 tutorials/verilog/mojo/synchronous-logic/index.html create mode 100644 tutorials/verilog/mojo/using-core-generator/index.html create mode 100644 tutorials/verilog/mojo/writing-test-benches/index.html create mode 100644 tutorials/verilog/page/1/index.html create mode 100644 tutorials/verilog/verilog-operators/index.html diff --git a/404.html b/404.html new file mode 100644 index 0000000..f9daacd --- /dev/null +++ b/404.html @@ -0,0 +1,461 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ × + +
+ + +
+ +
404
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..6bd4468 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +alchitry.com \ No newline at end of file diff --git a/alchitry-labs/index.html b/alchitry-labs/index.html new file mode 100644 index 0000000..4751311 --- /dev/null +++ b/alchitry-labs/index.html @@ -0,0 +1,535 @@ + + + + + + + + +Alchitry Labs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ × + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/alchitry.svg b/alchitry.svg new file mode 100755 index 0000000..bae92f3 --- /dev/null +++ b/alchitry.svg @@ -0,0 +1,226 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..42fc5bebb47bc558b5bbb4795a92f8800e13d6a3 GIT binary patch literal 9957 zcmW++2RK{r7mmGZQ(J9nZ)y}3)TUIG+7)~6Q6g4swQ7%`)U2&WsXby-wO7s9)E@u) z`{#LXZgO*<`<$HbocFxvJztcLmI@(0Ej|bYB2;}1egmBA|2uH8fp^&vY+>Mp=lc4+ z2MC1T^WTAH{5gjJxJcuvWaz2q0`c^*aJL5e`1tVKIXie*S-4vBySUqA9m>#xKujQ2 zu!6pC_Cb!Hul~$+f5%aK9Y-?OYo>iROp;!#*M?*vT;)TDrj-O$`c4I2*LHkHy=v;l zm6d$l>juW<4KQ99bRU-uy3b?|b7YpsO|}+Z_!Jz>#+-p{PtHKPizMIr<;ngf4_X{!dm6ny3Pgj*bq~M;n_<>n&!mC#8rP-YPeX{kwOO za9F#h<$;-Uw}Y?7Y$xv~LUR8OC_%rus>kC$N`xJu5`#r4r;_|Zcr zK=WlzdLl1~&Dli+zOdP4a7Ek9h`;7D%E>?Q4xlTXkPOLiVMo+}&g~Z{EEhqIBoj8? zt@kU~p#@;4P!`p4lKNiDiPSG&5;ze!Xt7Et8fnQ4KP=LbCPQ9z9&YXr_H-1^mPX@% z8zYA|{c$_*OHaV{5G^!c?UJbxpC2ET?CHq)F&hYRagZ{g&Pe_*C_(6UeiRKz3hk<4 zcvET!856~&;uPAYpn+$URCEFoC!6pF$tj_BjWA*I;EfDFa?(m1*TQ-1@T7DSQ4uo& z^BgAJ7_`4-PTKXI$ZilXJHjQ(7B+to1}lA9&!(yfx0NMz0ttR_3P4ao7`u>W=!OL5 zi9=hMO8WRl)w4d>$7xKsS@y;>apQvMV*DN2OU^z%4RLlvy6ii(wZg0-kA1tIjOfRL z2;>7-Ncy#bF2yC9?W?Gz!1ffg1X5S(q@h>usX$!2a3BqmiBEHJ;AIs& z8`I>N$~8)O6Qi_0{VjQ3+}EPU&=XjO=PWmzQ2mAjya;e|ShfZZwx<`usy1v=4bA)A zxJ5~sJa`c7Nle-+awf%+G~M`3h|hV?n4*{8x#?C9q&U;aPK}9vI9A!Sr06KPx2O1p z!MRJWDZR$rik>ZA%VM@xwR(2t&{Img%;~kFkv@SYxSL(|hF0FJ!3i(T#<{dJC)9CV zY>z7neY_)!+)mZGLe5dYzj=IIGpQ&5Zi@qb)e!fsu=iX&YR3X%ip8YqWDK*`X~7_` zZoIDW*huyMdr^N|L5@`(#Eq&Ve+| zgq{Rz{&Jz>?BtsXJ|wUHX3*WHQ^<;Vfq_Hxp%Yma98`usZ!5~7udmOmJi?}m92aQ_ zve@tI_UB!&dS%CM(fgA8H)B~|$D zj)3c*$b;YTfQyEiRo{GN!bMHs&tB{*tww8U)yGw5TrB&j5!>ubO5DNVYUzHGP(_Q5 zcg(2do zrW-E@q%Vbw>X5K}h>*gSuY~xRvCH(fK(3_|Onz0bMj}RIya&Yvu zcVx#rCEDkz=8(C5Pj-UU)0!hrzE#1iulL!PxSg*=~g-{h@bWQB6@E?d89 z(|vW@ley{dhTW%>1#PccQ1j_j9I1@M0Mn`wzxcIiA3Sa>?>C;!%*KnmiFLK}jzpEWOgAl; z3|UT1O~7+GlI^^|Q{fE(kvU1CK=KvG0W2yk+8sjrY5%o)ijD}1`bpG90FlS1XqjgD7y7apuxiI~O#BdBv=`M;0W!)eBiQ`YUX4AAcmBo}U zMyiKtxj4T(dEzQC?Fo;=CHb-e!7p<-3}^mx+;LXk6DFr>g$6aB~FV`tmHr-4^a z9~{U5decmaG9-48aAkx^6dsRaK6U326-74W4?VeOE!Y^ku7ET$&ylD2fUJZmS(w0%P52dz;vvpg&yt`T_m!MS!C{X z$%wLlb7(2{Krp|*&08@cQcdb>f(T)VIX9NbX@l*G@2ou3!+!AaW~M8u$Fr$g-B<4W zdjvFOSQs>^m`TQ1yQSj)l>JbC`3tR zsr~DwS=rgKa-@9>7GmLV-n>CH;xQK+BuB#x_T2?N@If66^R%?2>m2Q-D+b?mbjM*# z8cNi{Jb-;s%bV_+Z@ACJxY}f&^x4{mp({BJ;m@zR*4u26uGOh17G4XU{ev+LI6JW{ z6bsVENeFwCpU7@+Z(D5+rP^naQWUBrD0_Q1&O^ZXvLXo>$8H zPr~ORm`cjZ$_`|rDVPT{o26bK9HNHAjHEX3@$uWvQC|6_rM7}bgTEbUbv4zzy)QcZ zaN05X0Ot6)Mn#cT@^AefyDiIUz>k=Sh|B@I87mz_0KMnt=0Y>9UM>{l*xA`piw;~y zUjtMq@bUhVu^$etI4scgGIm8m`w}{Qj+S3*U9{5~0k78wa58rSeEhJAiVAgyeOb($ z)Ko7lk*26Nlf9%bUn1MuWb(Yko#w-6L}aXxSeAF2@iEK|)>qHotl6{eo_<{xQH^C5PD`r`t<5iR zvZ^5cG(a$a;OzqwFF=rfDgw%J!C^1EKqM2cP>1#qGDDYC^zXzyEzpz{aMuv%WT zpY$HvqyOIbZ@OReCSaw%!04pO56O?>G7*bm0Rvq@vKM{)&fKe!HP=r2hBBv!z1K<8 z7@bY>q5L=^mpX%tgmLCSrm4-yL`nbYbdv$!?EX+ooV)jEw4lfRR_fNLBgD!F|v_=Ip>cU+T*n#%XJyHUuWE``kNm-D0BpEZ>}8q=7(@L=3_OsfUimq~toL zrnzXPl%gUIw_LVhvCYj*<$Qy2H#fJ;d@%&AYSNzZP74(+?L_o1^HP@rF;UC#%+Cc( zU~O=GM8p%K$Zn!({FbsZHF8nt`T04=yWl1^Y(mEi~T>?=;&x) z>(NiTx4WRp$;sn~+ap#^P8BCTeNJZPf}i1sQzhDB(BG-Cg=plQT0L|wZ6RS{m<^hE z>CMfOch_UVeSA%eh{oskT@JHVl`aJY1O!VUBa@R62qS9CbnJGpvGc$uWM>isP=7-3%Sv*DsnlgB> zXuG=$F9)8DaP+p>j4>_-Ki)@M9xjja1>6<#xi$MJ2>)ERX=8(cO23l>nARmrkaTkL zTQb~Xh~WO}WFuYNiPrmYad&D9RnRrj{`-UV;eV$UEpIdv z4GoPisfdkEZb z(nH=cklxcBQ=I<;-IPP#Vp5CRl04kZc8JgUe>xrH^xaH-NAXT0p`(meK(n!{;!-B4 zO~1$EQ62Vo``G_h2t(P-Sq1Uq0ka)9b|2N*%iR@X**^Qixrq)~XDrYYYC({fTti$` zLP9^G#3GbcC4RO4S@8K-{*E;RDIYd1Ze~U`2Lh!p#uKZNDT?TmL5{jn{y6T_e68eLZ65eSwibmC7CTpbMYrq%uFLRPLP>q`489cCw=RHR`{ zfkfu4GZ`xl-7^z2irrNEK zTi$Z>!Q1qi^utB6FksooVV{Hfa2!To5FiKWwPAx6-TE1>?vH|x&ZxMJKC|skmbP0Y zd+B2tcPXo>;V=7bGsMz}^x3q_23(lW*V}P%b0_g>Yr9!I$XYkIS?M{8AEk}0T|BjK zm^$;)r26Ai?&qgMwcOhAq<#MO0=oaFrhD7#^z`(*`7iW(mz8CkcH8bv_j{eo#|Xa{ zS{Rb$(Mrr;ZN_p9zni1+cig$>{WGXE3g4Y7DXg#8Zwz#8A$Pg2e`2S4diWy(7t_-T zH5dKh6Oi2x(zRUeSdeYSHd$!4zTJpZt!X~lGO?!4K1|_jGOF}lkK+99I47JpyE{`( zwH*BT=^S|GZk95R%@b@z)uosSQzDWHNzs8<(T11pq^O?~ zh(CL~aj!*%f<%7OLqZ?TXhWcj8aPP*s<{NEucK8atvZH=@U`wpiCwhk0s{R%Ki%H_ z3|0??KSjT4IrQ3i+CmQM%{esY_R0ko7b3blnEt|p<9D^0fU)zWh-t2V{K-2pmwCz2 z&Yk7oaV|u(fm#(HvD>;f$%*LU%>Ark4{Ita;f28So1EOU?nvUxU9`c$!6F&cMDzDo2T`rudR)*E9M`DuQQJN}GO5J@|%8QCH9e!8*N@P|H zJVeY?o5`J{W{FX=)sa)XW|t*cC&9KPjcd$1Fc{1uN6O0|9eVe!CH!+z60GC?z-3@) z==8nI<>8X=eoep5hY!5Q%OW%39rr~~WZz^m-d!s;H9BiF&l43A{qbA$Xml}hrZi1A ztlFu;O`(VhLkZMb-3qa)@w5l$08n61VHgs0e^an#vy=`voJB%{icZ2AY;A4*+A#*S z4N$3v>b2Wb63>H26()R3DPa+jlZ4>A!a+(po_AF}dfKwZSImTiuB&5BX5g&m@rT9C z^VljU_Q0g0Iq^2h8hR(nz#(^f-rs8*m2SSl9`p|lGqEm2nXa`O;7IW9WXg};0csB= zF`~SQwXg*0#QJ*C^TQ?M6VrqFhVGq-!Wyf7qHJlOQ5U+mAFWHYa$ef`%BNiaz5odd zzj-PaS)drX9w)IZztHGJi4qjq8p})g;j!Iykmll7LR8vUak446*EQu+;f`wx`{|KL zc+&Uv=-mMu@_jB`uCm_zNL6;!P$^{&lfqaj(C0&ffOn>a4<7aS5*|w@6MEr|lVO~TRC(Gp1g{|>T zgRZTqf^Hh=aMD{1{c(zYp6*o2_{;C>;-i$03jT*Kz1NIBM9j}4v+Zv?GG9( zdKRCGdY9T(&Z2ZZFQAX1&CVYtRX8ObXLkBRAC{Ndqt)P8wWF{@7!s0It`Sb6)j-iJ9m z#enQ3&oM=Y!pFrl>+WQ$A-9dx8Pg8#Gl?F*-p~&V!|}kK5h+gimUFw|Hk|B;29J|0cqvZ8DxH zDmPAV!ta{q*EFWYe;xCp#P8#{BL9!eeSic|=K% zHQfUR=m8EpJG<}sgbJlB)AQ%g(=gK>mVa60b7oTCn$qr<_=kqMk(-;hb%bEDni{7+y18Ualx)H=cxYI z%~7f>@2^SbiL>EaR5Rmm`>}-G{x_sb+cJ5YMoBI!jqbTlFLCnccXro%W1`DdK&#HlzHFh1dIWo*o)dlE6$dCWps7ksT5ogsw+z#{}HDTo; zL0##B=qT&ll!imKCp4N|i&DNE9Zr zEf&ttoqDTLrwBe%bV+)oprBXT3u4xI`zUveIXNkZ7kk zS~iYw2=IG&k_Qxj_h8#rz~f!9+DR6b7mqQMLW6NCDx&S19#;MhKFlR0K1@jfq12RE zVhb1@Oy;Zs=r#0+QY~|`NL#^}H?0_?bzMfTl}=+8bY1ND9%vo_P}%YdoIxve{F@=5 z#)B0Y+*hZ46QfJn%vX*N2<7JoJ3ZOoHg^^#^gt^QBrVP=Iq93|m#I5Io$Oe2BUObw zS}E?8x+gkb+V{XoqnWV)H-@oc1yz%{v&hPR3a`e0iDjazyM}%o#Kni7(i=m?Q^lPj z<5xRdlS$0|Jv`s0f`wKqj1-Oa*1vH8U8t%9Sx2WAsJs03DVLh1Gxana=ah*LzRtlTuf7PDFQt;b%|k**6yPqRuC-!h z@?5aYz^H2hpAYho0EwWNwdlpEETeBp=6gL}FGiRJZQmCkO@AY=t*f&}RhxA%+KiR8 z{GATZ^u&5;C;YZ}c$3?5>oL5i2yzNU-2fveOYAebWz^Nflob8*lgHaxp*cd6Le7&x zaqZyBhRpB2P21X@vyH#-hMxfnm4eFirxN_?9^qi5ikc@Qp4(o!s9lm}cI>1L$#eLQ z9*e#3-B|TvIf84HaJgu!&U*N1_RCL3jgFH=sMCpTx#%+Gg0u%g(MO9(q4}tBLkw=If?^WKs~Iysq$Tb)w4G zt#60T4u$=$LPL9tY}(vx-W&FQIH(we&ZjRfegNvwQ0^2uc4&FjfY0P-qr1`g5u`_^ zi}o?EQT^+a0<8?;UX-Dqn8gV5NAZn~EbsV>${#RGyAzKElj8 zWW5Me3sq1}`u=e+>HGX&oQ}&TOQzlBF9jSpFz%F;l+^{7O_#i^tQaB&DPM*!bXQmF z%LQ+*Hg}?-?rvd5(`(9y8GtEFTHXG7~tAp+*wK*O;5U9IhY zis0(B=Im-#k?MF)pXc=EkDHT#^p*x+Xu;=lm-|a)ncEIFNqyp$w_C#|%VV!dFg3Cz zbsHc4i*CEAudZ2}F*CS2E@(%Btg4gAAbq=-Mdv2V;3~yPB5E1m@3SY>7u1UUwaheH zz_`Fi9T4=oDD2cFnA2x|4k>rj4Y&~ z!GP>rdMvh{M)wEcTNQHjH?CvZxkPhmEfzsLX+14Raa?tN!Hez~_W2z9@`H60%*$3= zckO?}Q$9}5adzy7zCyXdF@j0jYmUS%GSVh*f&N>P#r z`0P$%VPHQwmiqazsiwDehLx~76$HYD{I?gNE5w*3uwi!LQpR;v-t%Do?L{`bdRph2 zj&)5E8*UdXczQqfvx3q%>4X7`e{x1JBho9gyDOZ)ZPvtRkbfr|z{Gb<{&vMsKZlL> z+I^hiLE$m+HQOk-(#p&o?Eu!Ez=};m-WlzYJojKkA-4if8pYiU;H5+vrf)W4mGRVw_+}cnR+9-lQTL3@d#(a^#Q?sEiHs0Q#&j?85|anQgbBm8N1TA#$f6yvy7p$uEgFUbhyl`HmTrb< zC={jU6%e@mG5IpKjS06aP3Hp_8w~qDk#DXPk1dKC;2~z8{-rv;PhgaF1!NxO$?VeA zz4B^6B93sJn=Dq>HCbvqkc63={5RnG(8+9U@Yc|9hXY}p?k5e})IVW{taXJq-(M_P z4?DLWG#b?S1u!l8qbj4VW1c?$+KNln3rv$aH7m)VgyrLen^Lh2S!{`cx{{-mA^@3< z`2OZ!%=Cd}Qj22|Y0q=j$=3=buUcH$KAOZ!rTdB4i@Qfr^D*@Z?dh)3j6P{d4-v#| zNt@NFGm!^h-Jq%q?FzG=s=R$m3FrotHMc@%(xBxh{SDphwt{DcaGiC}tdR&xp1`eV z6UV>anSBZ`E9IuY(4> z*sfQ9FbP49c>Ek3ZSFu65HA>%xyB zE>f|>>gaqlXhy<P;DkZ9c>e+H0ACX`Y+uZ5tMbg$&ed zzDH^nl;wx0FPLg@B2@C%#ocK~`g)O%IIAJ%Pn#m}XRu6gL^?*0tZ1S<&q9^|G9$Xd}aJ{mVBJCss@GXKXcW7*Ej1@sM-onI3 zN(Ei{T2hkW=s-iX)4--W2RgKXylwhv&#(J@N6Nm5w>dW>Qi0rC z(2)b73sRnOenHj%ZpcS5A>u$)z%Ckk{l#LQc_xGlC>AYo7+F5k$Vt%?mX9LAw7`O* z;H7fVg#1^^(_HeFTkH)O`=8-DWl^t5^!X^)0Wu8xEtcbKvn7!37YHOTF(g+BELY~FFKIWSx3bo`>CTSw zY>7e!@{qYabr7Z4YE&-$8d7(2&)gkJtf4UYy< z;KOwOdP*h05x(LTE?j-%m<$}}{_Q^yh%QVJr0xX`$Wh#w24u*aW?wR8r#JP}ko{vo zg{|+pr<9X&;RH4)iOmEADx5HU_Z4AXGxCU$s*S1ChlZ8~Y*7QLDrteMUYW!G2bhNx AHvj+t literal 0 HcmV?d00001 diff --git a/atom.xml b/atom.xml new file mode 100644 index 0000000..68f0246 --- /dev/null +++ b/atom.xml @@ -0,0 +1,564 @@ + + + + + + Zola + 2024-02-07T00:00:00+00:00 + https://alchitry.com/atom.xml + + Lucid V1 to V2 + 2024-02-07T00:00:00+00:00 + 2024-02-07T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/tutorials/lucid-1-vs-2/ + + <p>TODO</p> + + + + + Alchitry Labs V2.0.5 - Simulations + 2024-02-06T00:00:00+00:00 + 2024-02-06T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/ + + <p><a href="https://alchitry.com/Alchitry-Labs-V2/download.html">Version 2.0.5-Preview</a> of Alchitry Labs is now available. It now supports simulating the main Alchitry boards as well as the Io Element.</p> + + + + + Alchitry Labs V2 - Update 3 + 2024-01-15T00:00:00+00:00 + 2024-01-15T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-update-3/ + + <p>Simulations are now supported!</p> +<p><img src="https://cdn.alchitry.com/labs-v2/alchitry-labs-2.0.4-preview.png" alt="Alchitry Labs 2.0.4 PREVIEW" /></p> +<h2 id="test-benches">Test Benches<a class="anchor" aria-hidden="true" href="#test-benches" hidden="">#</a> +</h2> +<p>The new update, <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">2.0.4-PREVIEW</a>, now has the first draft of the +simulation GUI.</p> +<p>To run a simulation you need to first create a test bench.</p> +<p>I've covered these before when you could first run them from the command line so make sure +to <a href="https://alchitry.com/news/lucid-v2-update-2/">check that out</a> if you haven't already.</p> +<p>There's been an addition to the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$print</span></code> function though. You can still pass it a signal directly for the old behavior, +but you can now pass in a formatting string followed by the values to use.</p> +<p>This is similar to something like <code class="language-lucid" data-lang="lucid"><span>printf</span></code> in C/C++.</p> +<p>The function call looks something like <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$print</span><span style="color:#ed4343;">(</span><span style="color:#bfbf0a;">&quot;my value is %d&quot;</span><span style="color:#ed4343;">,</span><span> mySig</span><span style="color:#ed4343;">)</span></code> where <code class="language-lucid" data-lang="lucid"><span>mySig</span></code> is the signal to print in decimal +where the %d is.</p> +<p>The format options are <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%d&quot;</span></code> for decimal, <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%b&quot;</span></code> for binary, <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%h&quot;</span></code> for hexadecimal, and <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%nf&quot;</span></code> for fixed point where +n is the number of fixed fractional bits (for example <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%2f&quot;</span></code>).</p> +<h2 id="run-the-test">Run the Test<a class="anchor" aria-hidden="true" href="#run-the-test" hidden="">#</a> +</h2> +<p>In the code editor, when it detects a test, there is an arrow in the left hand gutter on the line where the test was +declared. You can click this arrow to run that test.</p> +<p>Alternatively, clicking the bug icon in the toolbar will run every test.</p> +<p>The results of the test are printed to the console and a new tab is opened displaying the resulting values captured at +each <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code>.</p> +<p>The waveform viewer is currently pretty basic but its enough to start messing with it.</p> +<p>You can use the mouse wheel to zoom and click/drag to pan around.</p> +<p>The values at your cursor are show as an overlay.</p> + + + + + Alchitry Labs V2 - Update 2 + 2024-01-04T00:00:00+00:00 + 2024-01-04T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-update-2/ + + <p>It's been a while since I've posted an update and a lot has happened. Most of the work I've been putting into Alchitry Labs has been for the new GUI.</p> +<p><img src="https://cdn.alchitry.com/labs-v2/alchitry-labs-2.0.3-preview.png" alt="Alchitry Labs 2.0.3 PREVIEW" /></p> +<p>As I've mentioned in a previous blog post, this time around I'm using <a href="https://www.jetbrains.com/lp/compose-multiplatform/">Compose Multiplatform</a> for creating the UI instead of the now very old <a href="https://www.eclipse.org/swt/">SWT</a>.</p> +<p>Compose is fundamentally different from SWT and allows for a lot more freedom in creating a beautiful UI. However, since Compose for desktop is so new, there are some growing pains I've had to overcome.</p> +<h2 id="code-editor">Code Editor<a class="anchor" aria-hidden="true" href="#code-editor" hidden="">#</a> +</h2> +<p>One of the first things I did when starting the Alchitry Labs rewrite was to see if I could make a text editor perform well with Compose. The built in <code>TextField</code> widget is fine for small text fields but falls apart for something as complicated as a code editor.</p> +<p>Compose exposes various levels of abstraction you can dig into depending on what you want to accomplish. I jumped a few layers down and created my own code editor composable. </p> +<p>The most important difference between my code editor and the built in <code>TextField</code> is that my code computes the layout of each line individually instead of the entire block of text. The big upside to this is that when text is being edited I only need to compute the lines that change instead of every single line.</p> +<p>This makes editing text fast no matter how big the file is.</p> +<p>There was a lot of complexity added to make this work but the payoff was worth it.</p> +<p>In addition to performance, I was able to add some additional features that are nice to have for the code editor, such as the line numbers in the gutter. These are even flexible so I can potentially later add stuff like icons if needed.</p> +<p><code>TextField</code> also doesn't provide any way to draw a background color behind text so I had to add this custom. This allows for highlighting the token the cursor is on as well as all matching tokens. </p> +<h2 id="tabs">Tabs<a class="anchor" aria-hidden="true" href="#tabs" hidden="">#</a> +</h2> +<p>The next major UI hurdle was making the editor tabs work. I already had written a sash composable that would allow me to split a section into left and right or top and bottom resize-able areas (I needed it already for the main layout). However, I wanted to make splitting the editor be as easy as dragging a dropping the tab to where you want it.</p> +<p>Again, compose gives you plenty of tools to do this and I had already done something similar for a different project that I was able to steal most of the code from. With some modifications I ended up where it is now where you can not only drag and drop the tabs to rearrange them but drag them top any side of the window to split it.</p> +<p>This is definitely a step up from the previous version that requires you to split then window then drag the tab over.</p> +<h2 id="project-tree">Project Tree<a class="anchor" aria-hidden="true" href="#project-tree" hidden="">#</a> +</h2> +<p>This is something that still needs some work, but one of the new features is that file names in the tree are color coded based on their state (yellow = has warnings, red = has errors).</p> +<p>This was possible because the way projects/files are checked for errors is fundamentally different than before.</p> +<p>When a file is changed, an error check is queued. The error check first parses all the project files for errors like syntax errors. Then starting from the top module, the project is parsed as a tree through the module instances.</p> +<p>This allows for a thorough check of the modules using actual parameter values. </p> +<p>Some of this could be improved in the future such as caching some of the results for files that haven't changed, but even as it is now it is quite fast.</p> +<p>It currently doesn't fully check modules that fall outside the project tree (in other words, modules that are in the project but not used). I'll add this in a later update.</p> +<h2 id="labs-and-loader">Labs and Loader<a class="anchor" aria-hidden="true" href="#labs-and-loader" hidden="">#</a> +</h2> +<p>Alchitry Labs and the Alchitry Loader now share one executable/launcher. This was done because it isn't possible to create two launchers with one installer on macOS.</p> +<p>Instead, when you open Alchitry Labs, it'll open whatever you were using last.</p> +<p>To switch between Labs and the Loader, you simply click the Alchitry logo in the top left and choose &quot;Switch to X&quot;</p> +<p>I have a feeling that most people are using either one or the other and don't often switch between the two. If this isn't you, let me know on the <a href="https://github.com/alchitry/LucidParserV2/discussions">discussion page</a>.</p> +<h2 id="test-it-out">Test It Out<a class="anchor" aria-hidden="true" href="#test-it-out" hidden="">#</a> +</h2> +<p>There is still a lot of features missing, but if you would like you can download the <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">latest version here</a>.</p> +<p>Everything should be there to make a simple project, build, and load it to any of the Alchitry boards.</p> +<p>This also means you should be able to use this to build projects for the Alchitry Cu on a Mac.</p> +<h2 id="next-steps">Next Steps<a class="anchor" aria-hidden="true" href="#next-steps" hidden="">#</a> +</h2> +<p>The code editor needs many quality of life improvements such as auto indenting/formatting, auto-complete, support for Verilog, error checking for ACF files, support for Xilinx and Lattice constraint files, context menus (right click), and I'm sure endless more.</p> +<p>I need to also add in the component library, port the project templates to Lucid V2, and add back in support the Vivado's IP catalog.</p> +<p>I also need to build the front end for running simulations. All the code is there to actually run it, there just isn't currently a way to conveniently start it or view the results. This will likely be my first next step.</p> + + + + + Alchitry Labs V2 - Update 1 + 2023-10-13T00:00:00+00:00 + 2023-10-13T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-update-1/ + + <p>Today was the first time I built a .bin file from Alchitry Labs V2!</p> +<p>Before we get too far ahead, there is a lot more to cover.</p> +<p>In the last release, I use the Compose Multiplatform Gradle plugin to create <a href="https://github.com/JetBrains/compose-multiplatform/blob/master/tutorials/Native_distributions_and_local_execution/README.md">native distributions</a>. +At first, this seemed like an awesome solution. However, it has one fatal flaw.</p> +<p>The plugin requires you to build each target on its respective platform. That means if you want to build for Windows, you need to be on Windows. If you want to build for an ARM based Mac, you need to have an ARM based Mac.</p> +<p>This requirement was the same issue I had before with the original Alchitry Labs but it wasn't that bad since I only ever built for Windows and Linux X64. I was able to do everything from Linux using a Window VM.</p> +<p>This time around, I want to add support for more systems. Alchitry Labs runs on a JVM (Java Virtual Machine) so in theory it should run in a ton of places with minimal work.</p> +<p>I'm hoping to target everything that Compose supports, Windows x64, Linux x64, Linux ARM, Mac x64, and Mac ARM.</p> +<p>When looking for solutions to this, I came across <a href="https://www.hydraulic.dev/">Conveyor</a> which seems to be almost everything I was looking for. Best of all, it is free for open source projects like Alchitry Labs!</p> +<p>Conveyor lets you build for every target from a single system. It also deals with code signing and pushing updates.</p> +<p>The only downside right now is that it doesn't support Linux AArch64 (ARM). I became a paid subscriber to get this feature onto the dev's radar and I was told it will likely make it into the next major release.</p> +<p>Now that I have this all setup, I can run a single command that builds my project, creates update packages, creates an update website, and pushes it all to GitHub.</p> +<p>You can now download the latest version from the <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">GitHub page here</a></p> +<p>I'm currently just self signing everything. This only really matters for Windows and Macs where you'll see more security warnings when trying to install it.</p> +<p>I'll likely get everything officially signed for the next release. For the Window's release, this means that it'll be available from the Microsoft Store.</p> +<p>The Linux version is now packaged as a deb which makes installation so much easier! Installing the deb also adds an update site so that when updates for Alchitry Labs are available they show up in the package manager with everything else.</p> +<h2 id="mac-support">Mac Support<a class="anchor" aria-hidden="true" href="#mac-support" hidden="">#</a> +</h2> +<p>As I've mentioned above, the new releases have Mac versions.</p> +<p>Before you get too excited, no, you still can't run Vivado or iceCube 2 on a Mac. This means that you still can't build FPGA projects using the proprietary tools.</p> +<p>So why bother supporting Macs? First, many people run the build tools inside of virtual machines inside a Mac. USB devices don't always play nicely going across the VM layer so by having native support for the Alchitry Loader, we can avoid that issue.</p> +<p>The Mac versions of the loader are already working!</p> +<p>Second, there are open source tools that <em>can</em> run on a Mac. I'm hoping to bundle these with a later release of Alchitry Labs so that you will be able to develop for the Alchitry Cu natively on a Mac.</p> +<h2 id="the-new-verilog-converter">The New Verilog Converter<a class="anchor" aria-hidden="true" href="#the-new-verilog-converter" hidden="">#</a> +</h2> +<p>The biggest update to the Alchitry Labs V2 codebase is the Verilog converter.</p> +<p>Continuing with the full rewrite, the new converter is much cleaner than the old one. The original converter was one of the first things I wrote back when the IDE was the &quot;Mojo IDE.&quot;</p> +<p>Back then, the converted was responsible for everything. Given some Lucid text, it had to spit out a Verilog version.</p> +<p>The new converted is instead given a fully parsed Lucid module instance. A lot of the complicated tasks are already done in the previous stage such as dealing with signal indexing, declarations, etc.</p> +<p>This, along with better coding practices, has made the new converter about 40% of the size of the original! I'm pretty excited for it.</p> +<h2 id="acf-parser">ACF Parser<a class="anchor" aria-hidden="true" href="#acf-parser" hidden="">#</a> +</h2> +<p>With a Lucid-&gt;Verilog translator working, the next step was to add support for constraint files.</p> +<p>The Alchitry Constraint File format is super simple and adding a parser for it wasn't too complicated.</p> +<p>I ended up modifying the format a bit from V1 though. </p> +<p>Keeping with the change to Lucid, semicolons are now optional. Also, clock statements are considered a special type of pin statement so you don't need to specify both for a single pin.</p> +<p>It now checks that the names of the ports and pins are valid. Wildly, I apparently never checked the pin names properly for V1 so they would just show up as &quot;null&quot; in the converted constraint file and cause silent issues.</p> +<p>For now, I just have an ACF-&gt;XDC converter (XDC is the Xilinx format).</p> +<h2 id="test-build">Test Build<a class="anchor" aria-hidden="true" href="#test-build" hidden="">#</a> +</h2> +<p>With all the pieces in place, I was able to get a test build running.</p> +<p>Once a project is open, calling <code>Project.build()</code> simply builds the entire project!</p> +<p>This only works for the Au/Au+ right now as I still have to port the Cu builders but it is a big milestone!</p> +<p>Building Au projects is accessible from the command line interface now.</p> +<p>If you want to check out the progress, see <a href="https://github.com/alchitry/Alchitry-Labs-V2">the GitHub page</a>.</p> +<p>You can install the <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">latest version here</a>.</p> + + + + + Alchitry Loader V2 + 2023-09-18T00:00:00+00:00 + 2023-09-18T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-loader-v2/ + + <p>The Alchitry Loader portion of the Alchitry Labs V2 rewrite is mostly done!</p> +<p><img src="https://cdn.alchitry.com/labs-v2/loader-alpha.png" alt="Alchitry Loader" /></p> +<p>The new loader automatically detects connected boards and lists them in a drop down. This allows you to have more than one board connected without conflict.</p> +<p>Under the hood, it now also handles the D2XX driver a bit more elegantly. It first tries to load the proprietary D2XX library (libd2xx) and if it fails, it falls back to the open source libUSB driver.</p> +<p>On Windows, you'll almost always be using D2XX from FTDI. However, on Linux, libUSB is the default but you can install libd2xx and it'll be detected and used.</p> +<p>There are still a few weird kinks to work out but it is overall usable (and an improvement over the old one).</p> +<p>On Windows, I haven't been able to figure out how to configure the installer to not install a shortcut for the command line interface version of the launcher. After running the installer, you'll see a shortcut called &quot;alchitry&quot; which doesn't seem to do anything. This is the command line interface launcher.</p> +<p>There seems to be a bug in <code>jpackage</code> that ignores the value of the <code>--win-shortcut</code> option and always makes shortcuts. I'll have to dig into more eventually.</p> +<p>On Linux, I've been having a hard time getting the window's icon to be set correctly. On Gnome, it seems to be working but on Ubuntu (22.04) it shows the default Java icon and has some kind of secondary ghost window that you can't focus.</p> +<h1 id="installers">Installers<a class="anchor" aria-hidden="true" href="#installers" hidden="">#</a> +</h1> +<p><a href="https://cdn.alchitry.com/labs-v2/Alchitry%20Labs-2.0.0-ALPHA-1.msi">Windows Installer</a></p> +<p><a href="https://cdn.alchitry.com/labs-v2/alchitry-labs_2.0.0-ALPHA-1-1_amd64.deb">Linux Installer</a></p> + + + + + Alchitry Labs V2 - Command Line Interface + 2023-09-11T00:00:00+00:00 + 2023-09-11T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-cli/ + + <p>It has been a while since I last wrote about the progress on Alchitry Labs V2 and a lot has changed.</p> +<h2 id="build-tools">Build Tools<a class="anchor" aria-hidden="true" href="#build-tools" hidden="">#</a> +</h2> +<p>I've spent a good amount of time working on building out the Gradle build script so that the deployment process will be much easier than it was for Alchitry Labs V1.</p> +<p>When I was looking for a way to create the Window's installer, I discovered that <a href="https://github.com/JetBrains/compose-multiplatform/tree/master">Compose Multiplatform</a> has a built in <a href="https://github.com/JetBrains/compose-multiplatform/blob/master/tutorials/Native_distributions_and_local_execution/README.md">packaging tool</a>!</p> +<p>It turns out that this still has the major downside of needing to be running on the OS that you want to package for. This means you can't build an installer for Windows from Linux. Bummer, but not the end of the world.</p> +<p>I ran into two other issues when flushing out the build script. First, Compose's build tools only support creating one launcher per application. I need to create two. The main one to launch Alchitry Labs and the second to launch the Alchitry Loader.</p> +<p>These two programs are actually the same thing with just a different argument passed to them to show a different GUI.</p> +<p>It turns out that jpackage, the tool used by Compose, has a way to add additional launchers but Compose currently gives no way to access it. I add the support I needed, I forked the Compose plugin and submitted a <a href="https://github.com/JetBrains/compose-multiplatform/pull/3640">pull request</a>.</p> +<p>For now, I'm using my local forked version of the Compose plugin, but hopefully they'll accept the pull request or make some similar changes to allow creating additional launchers.</p> +<h2 id="command-line-interface">Command Line Interface<a class="anchor" aria-hidden="true" href="#command-line-interface" hidden="">#</a> +</h2> +<p>Something I often get emails about is for command line support in Alchitry Labs. Well, I'm happy to announce that the command line interface for Alchitry Labs V2 will be well supported.</p> +<p>I've decided to get everything working via the command line before diving too much into the GUI.</p> +<p>Right now, the loading tools already work. So if you've been looking for a way to load your Alchitry boards from the command line, check out the very early releases below.</p> +<p>The command line is broken into a bunch of subcommands.</p> +<pre style="background-color:#282828;color:#ffffff;"><code><span>$ alchitry --help +</span><span>Usage: alchitry_labs options_list +</span><span>Subcommands: +</span><span> new - Create a new project +</span><span> clone - Clone an existing project +</span><span> check - Check a project for errors +</span><span> build - Build an Alchitry Project +</span><span> load - Load a project or .bin file +</span><span> sim - Simulate a project +</span><span> labs - Launch Alchitry Labs GUI +</span><span> loader - Launch Alchitry Loader GUI +</span><span> +</span><span>Options: +</span><span> --help, -h -&gt; Usage info +</span></code></pre> +<p>If you install the .deb on Linux, you'll get access to the <code>alchitry</code> command.</p> +<p>On Windows, the <code>Alchitry.exe</code> executable in the installation directory can be used.</p> +<p>You can run <code>--help</code> on each subcommand for more info.</p> +<pre style="background-color:#282828;color:#ffffff;"><code><span>$ alchitry load --help +</span><span>Usage: alchitry_labs load options_list +</span><span>Options: +</span><span> --project, -p -&gt; Alchitry project file { String } +</span><span> --flash, -f [false] -&gt; Load project to FPGA&#39;s flash (persistent) +</span><span> --ram, -r [false] -&gt; Load project to FPGA&#39;s RAM (temporary) +</span><span> --list, -l [false] -&gt; List all detected boards +</span><span> --device, -d [0] -&gt; Index of device to load { Int } +</span><span> --bin -&gt; Bin file to load { String } +</span><span> --board, -b -&gt; Board used in the project { Value should be one of [Au, Au+, Cu] } +</span><span> --help, -h -&gt; Usage info +</span></code></pre> +<p>For example, you can load a .bin file like this.</p> +<pre style="background-color:#282828;color:#ffffff;"><code><span>$ alchitry load --bin alchitry.bin -b Au+ --flash +</span><span>Checking IDCODE... +</span><span>Loading bridge configuration... +</span><span>Erasing... +</span><span>Flashing 100% │███████████████████████████████████│ 335339/335339 (0:00:01 / 0:00:00) +</span><span>Resetting FPGA... +</span><span>Done. +</span></code></pre> +<p>If you try this out, let me know what you think over at the <a href="https://github.com/alchitry/Alchitry-Labs-V2/discussions">discussions page</a>.</p> +<h2 id="releases">Releases<a class="anchor" aria-hidden="true" href="#releases" hidden="">#</a> +</h2> +<p>These aren't really a &quot;release&quot; as much as just something you can try and mess around with.</p> +<p>That being said, the loading features should be fully working.</p> +<p><a href="https://cdn.alchitry.com/labs-v2/alchitry-labs_2.0.0-ALPHA-0-1_amd64.deb">Linux Deb</a></p> +<p><a href="https://cdn.alchitry.com/labs-v2/Alchitry-2.0.0-ALPHA-0.msi">Windows Installer</a></p> +<p>The Labs GUI will open but it doesn't really do much. It is basically just a test right now for the custom text editor.</p> +<p>The Loader GUI doesn't open/exist at all yet.</p> +<p>The command line tools work for creating and simulating projects as well as loading .bin files.</p> + + + + + Alchitry Labs V2 + 2023-06-07T00:00:00+00:00 + 2023-06-07T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2/ + + <p>I am now starting to work on the UI of the Alchitry Labs rewrite!</p> +<p>Alchitry Labs currently use UI toolkit, SWT. +This is the UI toolkit developed and used by Eclipse. +At the time I started working on what was then the Mojo IDE, SWT was a solid choice. +It allowed me to create a single UI that worked on Windows and Linux with minimal effort, and it looked native on both +platforms.</p> +<p>However, it hasn't aged super well.</p> +<p>I found it to be fairly limited when trying to do anything custom. +For example, I wanted the project tree on the left side of the window to stay the same size when you resized the window. +The main code editor should be the only thing that changes size to accommodate the new window size. +SWT doesn't allow for this, and instead you specify the size of each side as a percent. +My workaround was to recalculate the percentages every time the window size changes to keep one side a fixed size. +This mostly works, but if you resize the window a lot, you may notice the divider jumps around due to rounding errors.</p> +<p>In newer versions of SWT, something changed/broke that broke the tooltip window from popping up when hovering over an +error in the text editor. +I spend a stupid amount of time trying to figure out a fix for this before giving up and sticking with an old version +of the library. +This annoyingly prevents other bugs from getting fixed though.</p> +<p>One of the worst offenders is the undo/redo bug in the current Alchitry Labs. +I've spent days trying to get the undo/redo function to be reliable, but for whatever reason, the way SWT handles the +edit events have prevented me from getting it to always work. V2 already has a fully reliable undo/redo working.</p> +<p>TLDR, I'm moving to something else.</p> +<h2 id="jetpack-compose">Jetpack Compose<a class="anchor" aria-hidden="true" href="#jetpack-compose" hidden="">#</a> +</h2> +<p>If you do any UI work and haven't tried <a href="https://github.com/JetBrains/compose-multiplatform">Jetpack Compose</a> you're +missing out.</p> +<p>This is a declarative UI framework originally developed for use on Android, but it has since made its way onto more +platforms including desktop.</p> +<p>I find it a joy to use, and it doesn't lock you into anything allowing me to create whatever custom UI elements or +tweaks I need.</p> +<p>Unfortunately, the built-in text editor (TextField) has terrible performance if you are trying to edit any decent amount +of text. +This led me to write my own custom editor that has solid performance for thousands of lines of code.</p> +<p>While this was a substantial amount of work, it also opens up potential in the future for doing cool tricks like +collapsable blocks. This was impossible with SWT.</p> +<h2 id="lucid-parser">Lucid Parser<a class="anchor" aria-hidden="true" href="#lucid-parser" hidden="">#</a> +</h2> +<p>I've also implemented the snapshots for <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span></code> and added <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$silentTick</span></code> which skips the snapshot step. +The snapshots get compiled into a simulation result that holds the value of every signal in the design for every call +of <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span></code>.</p> +<p>This will allow the UI to display the results of the entire simulation.</p> +<h2 id="the-repo">The Repo<a class="anchor" aria-hidden="true" href="#the-repo" hidden="">#</a> +</h2> +<p>The Lucid Parser repo has been renamed to <a href="https://github.com/alchitry/Alchitry-Labs-V2">Alchitry Labs V2</a> and now +contains the UI and parser code. +This is where all the progress can be found.</p> +<p>There is a <a href="https://github.com/alchitry/Alchitry-Labs-V2/discussions">discussion page</a>, or you can +<a href="mailto:justin@alchitry.com">email me</a> and let me know your thoughts.</p> + + + + + Lucid V2 - Update 2 - Test Benches + 2023-06-01T00:00:00+00:00 + 2023-06-01T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/lucid-v2-update-2/ + + <p>Test benches are here!</p> +<p>I just pushed a working draft of the test bench code that has the necessities for writing quick tests for you modules!</p> +<h2 id="test-bench-example">Test Bench Example<a class="anchor" aria-hidden="true" href="#test-bench-example" hidden="">#</a> +</h2> +<p>Take a look at this revolutionary counter module I created. </p> +<pre data-lang="lucid" style="background-color:#282828;color:#ffffff;" class="language-lucid "><code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">module</span><span> counter </span><span style="color:#ed4343;">( +</span><span> </span><span style="color:#0a8dbf;">input</span><span> clk</span><span style="color:#ed4343;">, +</span><span> </span><span style="color:#0a8dbf;">output</span><span> count</span><span style="color:#ed4343;">[</span><span style="color:#a269dc;">8</span><span style="color:#ed4343;">] +</span><span style="color:#ed4343;">) { +</span><span> </span><span style="color:#0a8dbf;">dff</span><span> counter</span><span style="color:#ed4343;">[</span><span style="color:#a269dc;">8</span><span style="color:#ed4343;">] (</span><span>.clk</span><span style="color:#ed4343;">(</span><span>clk</span><span style="color:#ed4343;">)) +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">always </span><span style="color:#ed4343;">{ +</span><span> counter.d </span><span style="color:#ed4343;">=</span><span> counter.q </span><span style="color:#ed4343;">+ </span><span style="color:#a269dc;">1 +</span><span> count </span><span style="color:#ed4343;">=</span><span> counter.q +</span><span> </span><span style="color:#ed4343;">} +</span><span style="color:#ed4343;">} +</span></code></pre> +<p>I designed it so that the output <code class="language-lucid" data-lang="lucid"><span>count</span></code> will increment by one on every rising edge of the <code class="language-lucid" data-lang="lucid"><span>clk</span></code> input. However, does +it actually work?!? There's no way to know. Oh wait, we could test it.</p> +<p>Here is my test bench that does just that.</p> +<pre data-lang="lucid" style="background-color:#282828;color:#ffffff;" class="language-lucid "><code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">testBench</span><span> myTestBench </span><span style="color:#ed4343;">{ +</span><span> </span><span style="color:#0a8dbf;">sig</span><span> clk </span><span style="color:#969696;">// signal to use as my clock +</span><span> +</span><span> counter dut </span><span style="color:#ed4343;">(</span><span>.clk</span><span style="color:#ed4343;">(</span><span>clk</span><span style="color:#ed4343;">)) </span><span style="color:#969696;">// device under test +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">fun</span><span> tickClock</span><span style="color:#ed4343;">() { +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">1 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">0 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> </span><span style="color:#ed4343;">} +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">test</span><span> simpleTest </span><span style="color:#ed4343;">{ +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">0 </span><span style="color:#969696;">// initialize the clock +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">repeat</span><span style="color:#ed4343;">(</span><span style="color:#a269dc;">100</span><span style="color:#ed4343;">,</span><span> i</span><span style="color:#ed4343;">) { +</span><span> </span><span style="color:#1bddaf;">$print</span><span style="color:#ed4343;">(</span><span>dut.count</span><span style="color:#ed4343;">) +</span><span> </span><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">(</span><span>dut.count </span><span style="color:#ed4343;">==</span><span> i</span><span style="color:#ed4343;">) +</span><span> </span><span style="color:#1bddaf;">$tickClock</span><span style="color:#ed4343;">() +</span><span> </span><span style="color:#ed4343;">} +</span><span> +</span><span> </span><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">(</span><span>dut.count </span><span style="color:#ed4343;">== </span><span style="color:#a269dc;">100</span><span style="color:#ed4343;">) +</span><span> </span><span style="color:#ed4343;">} +</span><span style="color:#ed4343;">} +</span></code></pre> +<p>The insides of a <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">testBench</span></code> are very similar to a <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">module</span></code> with a couple of key differences. There are no ports +or parameters and instead of <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">always</span></code> blocks you use <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">test</span></code> and <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">fun</span></code> blocks.</p> +<p>On line 2, we create a signal named <code class="language-lucid" data-lang="lucid"><span>clk</span></code> that will act as our clock.</p> +<p>On line 4, we instantiate the device under test or &quot;dut&quot;. It is convention to call the module being tested &quot;dut&quot; but +there is nothing special about the name.</p> +<p>Next, we have our function declaration. Functions have the same properties as tests, but they aren't run directly. +Instead, functions are little pieces of helper code that can be called from tests.</p> +<p>Here I defined the very common function of toggling the clock and called it <code class="language-lucid" data-lang="lucid"><span>tickClock</span></code>. This function doesn't have any +parameters, but it could.</p> +<p>For example, we could give it a parameter to repeat a specified number of times.</p> +<pre data-lang="lucid" style="background-color:#282828;color:#ffffff;" class="language-lucid "><code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">fun</span><span> tickClock</span><span style="color:#ed4343;">(</span><span>times</span><span style="color:#ed4343;">[</span><span style="color:#a269dc;">32</span><span style="color:#ed4343;">]) { +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">repeat</span><span style="color:#ed4343;">(</span><span>times</span><span style="color:#ed4343;">) { +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">1 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">0 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> </span><span style="color:#ed4343;">} +</span><span style="color:#ed4343;">} +</span></code></pre> +<p>Function arguments act the same as module inputs and can be multidimensional arrays or structs.</p> +<h3 id="test-bench-functions">Test Bench Functions<a class="anchor" aria-hidden="true" href="#test-bench-functions" hidden="">#</a> +</h3> +<p>Before we move on, let me quickly go over the couple of test bench specific functions that I'm using.</p> +<p>The function <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> is at the very core of the simulation. It initiates a simulation tick. So what is a simulation +tick? This is when the simulator publishes all signal changes and recalculates the outputs for all the pieces in the +design whose input signals changed. Those output changes then trigger other updates if they are used as inputs. This +continues until the results of everything stabilize.</p> +<p>The only time it won't stabilize is if you have some kind of dependency loop like <code class="language-lucid" data-lang="lucid"><span>a </span><span style="color:#ed4343;">=</span><span> b</span></code> and <code class="language-lucid" data-lang="lucid"><span>b </span><span style="color:#ed4343;">= ~</span><span>a</span></code>. In this case, +the simulator will quit after 1000 iterations. I chose this number as a seemingly nice upper bound, but it may change if +I find designs often need more or fewer iterations. A loop like this would result in faulty hardware, and anything +requiring too many iterations to resolve would likely be too complicated to do in a single real clock cycle.</p> +<p>So back to the test bench. Before we call <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code>, first we need to set a value to all signals we are using. Signals +default to having a <code class="language-lucid" data-lang="lucid"><span style="color:#a269dc;">bx</span></code> value so bad things will happen if we call <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> before setting a real value. By bad things, +I mean that <code class="language-lucid" data-lang="lucid"><span style="color:#a269dc;">bx</span></code> value will propagate throughout the design contaminating our counter.</p> +<p>With <code class="language-lucid" data-lang="lucid"><span>clk</span></code> set to 0, we call <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> to initialize the design.</p> +<p>Next, we hit a <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">repeat</span></code> block that will repeat its contents 100 times and use the signal <code class="language-lucid" data-lang="lucid"><span>i</span></code> as the iteration index.</p> +<p>The first line in the loop prints the value of <code class="language-lucid" data-lang="lucid"><span>dut.count</span></code> using the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$print</span><span style="color:#ed4343;">()</span></code> function. This function takes one +argument, the value to print. It currently outputs the value in the format <code class="language-lucid" data-lang="lucid"><span>dut.count </span><span style="color:#ed4343;">= {</span><span style="color:#a269dc;">00011100</span><span style="color:#ed4343;">} : </span><span style="color:#a269dc;">28</span></code> where the value +is shown in its binary form as well as its decimal value (if it has one).</p> +<p>The next line uses the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">()</span></code> function to check that the value of the counter matches the loop iteration we are on. +The argument to <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">()</span></code> can be anything, and it is treated as a boolean. That means if it is non-zero, nothing +happens, but if it is zero, the simulation is aborted and the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">()</span></code> that caused it is called out.</p> +<p>This is very useful for checking values quickly without having to look back through the simulation manually to see if +values make sense.</p> +<p>The last line in the loop is the call to the function <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tickClock</span><span style="color:#ed4343;">()</span></code> that we already defined.</p> +<p>Finally, we end our test by checking that the counter output is 100 after the 100 cycles.</p> +<p>This example is from one of the tests and can be found in the +<a href="https://github.com/alchitry/LucidParserV2/blob/9795d9dcea1a769be7567025b15607549c36edc3/src/test/kotlin/TestBenchTests.kt#L45">repo here</a>.</p> +<h2 id="next-step">Next Step<a class="anchor" aria-hidden="true" href="#next-step" hidden="">#</a> +</h2> +<p>The next step is to add snapshots of the entire design every time <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> is called. This will allow for the +simulation results to be shown after it is run. Currently, it just runs discarding all intermediate values.</p> +<p>I also plan to have a <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$silentTick</span><span style="color:#ed4343;">()</span></code> or similarly named function that does a tick without taking a snapshot. This way +you can use that when making the clock fall for most designs and avoid the overhead of an entire snapshot.</p> +<p>As before, there is a <a href="https://github.com/alchitry/LucidParserV2/discussions">discussion page</a> setup as part of the repo +where you can let me know your thoughts.</p> + + + + + Lucid V2 - Update 1 + 2023-05-30T00:00:00+00:00 + 2023-05-30T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/lucid-v2-update-1/ + + <p>I just pushed what I believe is the last piece of the core Lucid 2 rewrite.</p> + + + + + Lucid V2 + 2023-05-18T00:00:00+00:00 + 2023-05-18T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/lucid-v2/ + + <p>A full rewrite of the Lucid parser in Alchitry Labs has been a long time coming.</p> + + + + diff --git a/boards/au/index.html b/boards/au/index.html new file mode 100644 index 0000000..e16cc24 --- /dev/null +++ b/boards/au/index.html @@ -0,0 +1,545 @@ + + + + + + + + +Alchitry Au + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/br/index.html b/boards/br/index.html new file mode 100644 index 0000000..523a7d6 --- /dev/null +++ b/boards/br/index.html @@ -0,0 +1,551 @@ + + + + + + + + +Alchitry Br + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/cu/index.html b/boards/cu/index.html new file mode 100644 index 0000000..8af7665 --- /dev/null +++ b/boards/cu/index.html @@ -0,0 +1,551 @@ + + + + + + + + +Alchitry Cu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/ft/index.html b/boards/ft/index.html new file mode 100644 index 0000000..bfe94f8 --- /dev/null +++ b/boards/ft/index.html @@ -0,0 +1,545 @@ + + + + + + + + +Alchitry Ft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/index.html b/boards/index.html new file mode 100644 index 0000000..dafcd51 --- /dev/null +++ b/boards/index.html @@ -0,0 +1,612 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + + +
+
+

Alchitry Au

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Cu

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Br

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Io

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Ft

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/io/index.html b/boards/io/index.html new file mode 100644 index 0000000..10d1aaf --- /dev/null +++ b/boards/io/index.html @@ -0,0 +1,551 @@ + + + + + + + + +Alchitry Io + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/page/1/index.html b/boards/page/1/index.html new file mode 100644 index 0000000..f5a8843 --- /dev/null +++ b/boards/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/css/override.css b/css/override.css new file mode 100644 index 0000000..5f1816d --- /dev/null +++ b/css/override.css @@ -0,0 +1,32 @@ +.post-content pre, +.post-content pre code { + border-radius: var(--radius); +} +.post-content pre code > table { + margin: 0px auto; + border-radius: var(--radius); + border-spacing: 0; + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} +.post-content pre code > table td { + min-width: 0; + vertical-align: top; + padding: 0; + margin: 0; + border: 0; +} +.post-content pre code > table td:first-child { + white-space: pre; + user-select: none; + margin: 0; + padding: 0 1em 0 0; + color: #7f7f7f; + text-align: right; + display: table-cell; + max-width: 10%; +} +.post-content pre code > table td:nth-child(2) { + width: 92%; +} diff --git a/css/styles.css b/css/styles.css new file mode 100644 index 0000000..3e6e833 --- /dev/null +++ b/css/styles.css @@ -0,0 +1,1330 @@ +/* + PaperMod v7 + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2023 adityatelange +*/ +:root { + --gap: 24px; + --content-gap: 20px; + --nav-width: 1400px; + --main-width: 1400px; + --header-height: 120px; + --footer-height: 140px; + --radius: 8px; + --theme: rgb(255, 255, 255); + --entry: rgb(255, 255, 255); + --primary: rgb(30, 30, 30); + --secondary: rgb(108, 108, 108); + --tertiary: rgb(214, 214, 214); + --content: rgb(31, 31, 31); + --hljs-bg: rgb(28, 29, 33); + --code-bg: rgb(245, 245, 245); + --border: rgb(238, 238, 238); + --accent: rgb(250,172,31); +} +.dark { + --theme: rgb(51, 51, 51); + --entry: rgb(40, 40, 40); + --primary: rgb(218, 218, 219); + --secondary: rgb(155, 156, 157); + --tertiary: rgb(65, 66, 68); + --content: rgb(196, 196, 197); + --hljs-bg: rgb(40, 40, 40); + --code-bg: rgb(40, 40, 40); + --border: rgb(51, 51, 51); +} +.list { + background: var(--code-bg); +} +.dark.list { + background: var(--theme); +} +*, +::after, +::before { + box-sizing: border-box; +} +html { + -webkit-tap-highlight-color: transparent; + overflow-y: scroll; +} +button, +body, +h1, +h2, +h3, +h4, +h5, +h6 { + color: var(--primary); +} +a { + color: var(--accent); +} +a:hover { + color: var(--primary); +} + +body { + font-family: Ubuntu, -apple-system, BlinkMacSystemFont, segoe ui, Roboto, Oxygen, + Cantarell, open sans, helvetica neue, sans-serif; + font-size: 18px; + line-height: 1.6; + word-break: break-word; + background: var(--theme); +} +article, +aside, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +table { + display: block; +} +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} +h1, +h2, +h3, +h4, +h5, +h6, +p { + margin-top: 0; + margin-bottom: 0; +} +ul { + padding: 0; +} +a,.social-icons a { + text-decoration: none; +} +body, +figure, +ul { + margin: 0; +} +table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow-x: auto; + word-break: keep-all; +} +button, +input, +textarea { + padding: 0; + font: inherit; + background: 0 0; + border: 0; +} +input, +textarea { + outline: 0; +} +button, +input[type="button"], +input[type="submit"] { + cursor: pointer; +} +input:-webkit-autofill, +textarea:-webkit-autofill { + box-shadow: 0 0 0 50px var(--theme) inset; +} +img { + display: block; + max-width: 100%; +} +.not-found { + position: absolute; + left: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center; + height: 80%; + font-size: 160px; + font-weight: 700; +} +.archive-posts { + width: 100%; + font-size: 18px; +} +.archive-year { + margin-top: 40px; +} +.archive-year:not(:last-of-type) { + border-bottom: 2px solid var(--border); +} +.archive-month { + display: flex; + align-items: flex-start; + padding: 10px 0; +} +.archive-month-header { + margin: 25px 0; + width: 200px; +} +.archive-month:not(:last-of-type) { + border-bottom: 1px solid var(--border); +} +.archive-entry { + position: relative; + padding: 5px; + margin: 10px 0; +} +.archive-entry-title { + margin: 5px 0; + font-weight: 400; +} +.archive-count, +.archive-meta { + color: var(--secondary); + font-size: 14px; +} +.footer, +.top-link { + font-size: 14px; + color: var(--secondary); +} +.footer { + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + height: var(--footer-height); + text-align: center; + line-height: 24px; + display: flex; + align-items: center; + justify-content: center; +} +.footer span { + margin-inline-start: 1px; + margin-inline-end: 1px; +} +.footer span:last-child { + white-space: nowrap; +} +.footer .social-icons a { + border-bottom: none; + color: var(--accent); +} +.footer .social-icons a:hover { + border-bottom: none; +} +.footer a { + color: inherit; + border-bottom: 1px solid var(--secondary); +} +.footer a:hover { + border-bottom: 1px solid var(--primary); +} +.top-link { + visibility: hidden; + position: fixed; + bottom: 60px; + right: 30px; + z-index: 99; + background: var(--tertiary); + width: 42px; + height: 42px; + padding: 12px; + border-radius: 64px; + transition: visibility 0.5s, opacity 0.8s linear; +} +.top-link, +.top-link svg { + filter: drop-shadow(0 0 0 var(--theme)); +} +.footer a:hover, +.top-link:hover { + color: var(--primary); +} +.top-link:focus, +#theme-toggle:focus { + outline: 0; +} +.nav { + display: flex; + justify-content: space-between; + max-width: calc(var(--nav-width) + var(--gap) * 2); + margin-inline-start: auto; + margin-inline-end: auto; + line-height: var(--header-height); + padding-left: var(--gap); + padding-right: var(--gap); +} +.nav a { + display: block; +} +.logo { + display: flex; + /* margin: auto var(--gap); */ +} + + + +/* The Overlay (background) */ +.overlay { + /* Height & width depends on how you want to reveal the overlay (see JS below) */ + display: none; + height: 100%; + width: 100%; + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + left: 0; + top: 0; + background-color: rgb(0,0,0); /* Black fallback color */ + background-color: rgba(0,0,0, 0.9); /* Black w/opacity */ + overflow-x: hidden; /* Disable horizontal scroll */ + transition: 0.5s; /* 0.5 second transition effect to slide in or slide down the overlay (height or width, depending on reveal) */ +} + +/* Position the content inside the overlay */ +.overlay-content { + position: relative; + top: 25%; /* 25% from the top */ + width: 100%; /* 100% width */ + text-align: center; /* Centered text/links */ + margin-top: 30px; /* 30px top margin to avoid conflict with the close button on smaller screens */ +} + +/* The navigation links inside the overlay */ +.overlay a { + padding: 8px; + text-decoration: none; + font-size: 36px; + color: #818181; + display: block; /* Display block instead of inline */ + transition: 0.3s; /* Transition effects on hover (color) */ +} + +/* When you mouse over the navigation links, change their color */ +.overlay a:hover, .overlay a:focus { + color: #f1f1f1; +} + +/* Position the close button (top right corner) */ +.overlay .closebtn { + position: absolute; + top: 20px; + right: 45px; + font-size: 60px; +} + +/* When the height of the screen is less than 450 pixels, change the font-size of the links and position the close button again, so they don't overlap */ +@media screen and (max-height: 450px) { + .overlay a {font-size: 20px} + .overlay .closebtn { + font-size: 40px; + top: 15px; + right: 35px; + } +} + +#menu { + display: none; +} + +#overlayNavOpen span { + font-size: 50px; + padding: 20px; +} + +#overlayNavOpen { + display: flex; + align-items: center; +} + +@media screen and (min-width: 1100px) { + #menu { + display: flex; + } + #overlayNavOpen{ + display: none; + } +} + +.logo { + flex-wrap: inherit; +} +.logo a { + font-size: 24px; + font-weight: 700; +} +.logo a img, +.logo a svg { + display: inline; + vertical-align: middle; + pointer-events: none; + border-radius: 6px; + margin-inline-end: 8px; + max-height: 100px; + width: 100%; +} +button#theme-toggle { + font-size: 26px; + margin: auto 4px; +} +body.dark #moon { + vertical-align: middle; + display: none; +} +body:not(.dark) #sun { + display: none; +} +#menu { + list-style: none; + word-break: keep-all; + overflow-x: auto; + white-space: nowrap; +} +#menu li + li { + margin-inline-start: var(--gap); +} +#menu a { + font-size: 18px; +} +#menu .active { + font-weight: 500; + border-bottom: 2px solid; +} +.lang-switch li, +.lang-switch ul, +.logo-switches { + display: inline-flex; + margin: auto 4px; +} +.lang-switch { + display: flex; + flex-wrap: inherit; +} +.lang-switch a { + margin: auto 3px; + font-size: 18px; + font-weight: 500; +} +.logo-switches { + flex-wrap: inherit; +} +.main { + position: relative; + min-height: calc(100vh - var(--header-height) - var(--footer-height)); + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + padding: var(--gap); +} +.page-header h1 { + font-size: 40px; +} +.pagination { + display: flex; +} +.pagination a { + color: var(--theme); + font-size: 13px; + line-height: 36px; + background: var(--primary); + border-radius: calc(36px / 2); + padding: 0 18px; +} +.pagination .next { + margin-inline-start: auto; +} +.social-icons { + padding: 0; +} +.social-icons a:not(:last-of-type) { + margin-inline-end: 12px; +} +.social-icons a svg { + height: 26px; + width: 26px; +} +code { + direction: ltr; + font-family: Ubuntu Mono, monospace; +} +div.highlight, +pre { + position: relative; +} +.copy-code { + display: none; + position: absolute; + top: 4px; + right: 4px; + color: rgba(255, 255, 255, 0.8); + background: rgba(78, 78, 78, 0.8); + border-radius: var(--radius); + padding: 0 5px; + font-size: 18px; + user-select: none; +} +div.highlight:hover .copy-code, +pre:hover .copy-code { + display: block; +} +.first-entry { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + /*min-height: 320px;*/ + margin: var(--gap) 0 calc(var(--gap) * 2); +} +.first-entry .entry-header { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} +.first-entry .entry-header h1 { + font-size: 34px; + line-height: 1.3; +} +.first-entry .entry-content { + margin: 14px 0; + font-size: 18px; + -webkit-line-clamp: 3; +} +.first-entry .entry-footer { + font-size: 14px; +} +.home-info .entry-content { + -webkit-line-clamp: unset; +} +.post-entry { + position: relative; + margin-bottom: var(--gap); + padding: var(--gap); + background: var(--entry); + border-radius: var(--radius); + transition: transform 0.1s; + border: 1px solid var(--border); +} +.post-entry:active { + transform: scale(0.96); +} +.tag-entry .entry-cover { + display: none; +} +.entry-header h2 { + font-size: 24px; + line-height: 1.3; +} +.entry-content { + margin: 8px 0; + color: var(--secondary); + font-size: 14px; + line-height: 1.6; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.entry-footer { + color: var(--secondary); + font-size: 13px; +} +.entry-link { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +.entry-cover, +.entry-isdraft { + font-size: 14px; + color: var(--secondary); +} +.entry-cover { + margin-bottom: var(--gap); + text-align: center; +} +.entry-cover img { + border-radius: var(--radius); + pointer-events: none; + width: 100%; + height: auto; +} +.entry-cover a { + color: var(--secondary); + box-shadow: 0 1px 0 var(--primary); +} +.page-header, +.post-header { + margin: 0 auto var(--content-gap); +} +.post-title { + margin-top: var(--gap); + margin-bottom: var(--gap); + font-size: 40px; +} +.post-description { + margin-top: 10px; + margin-bottom: 5px; +} +.post-meta, +.breadcrumbs { + color: var(--secondary); + font-size: 18px; + display: flex; + flex-wrap: wrap; +} +.post-meta .i18n_list li { + display: inline-flex; + list-style: none; + margin: auto 3px; + box-shadow: 0 1px 0 var(--secondary); +} +.breadcrumbs a { + font-size: 18px; +} +.post-content { + color: var(--content); +} +.post-content h3, +.post-content h4, +.post-content h5, +.post-content h6 { + margin: 24px 0 16px; +} +.post-content h1 { + margin: 40px auto 32px; + font-size: 40px; +} +.post-content h2 { + margin: 32px auto 24px; + font-size: 32px; +} +.post-content h3 { + font-size: 24px; +} +.post-content h4 { + font-size: 16px; +} +.post-content h5 { + font-size: 14px; +} +.post-content h6 { + font-size: 12px; +} +.post-content a:hover, +.toc a:hover { + color: var(--primary); +} +.post-content a code { + margin: auto 0; + border-radius: 0; + box-shadow: 0 -1px 0 var(--primary) inset; +} +.post-content del { + text-decoration: line-through; +} +.post-content dl, +.post-content ol, +.post-content p, +.post-content figure, +.post-content ul { + margin-bottom: var(--content-gap); +} +.post-content ol, +.post-content ul { + padding-inline-start: 20px; +} +.post-content li { + margin-top: 5px; +} +.post-content li p { + margin-bottom: 0; +} +.post-content dl { + display: flex; + flex-wrap: wrap; + margin: 0; +} +.post-content dt { + width: 25%; + font-weight: 700; +} +.post-content dd { + width: 75%; + margin-inline-start: 0; + padding-inline-start: 10px; +} +.post-content dd ~ dd, +.post-content dt ~ dt { + margin-top: 10px; +} +.post-content table { + margin-bottom: 32px; +} +.post-content table th, +.post-content table td { + min-width: 80px; + padding: 12px 8px; + line-height: 1.5; + border-bottom: 1px solid var(--border); +} +.post-content table th { + font-size: 14px; + text-align: start; +} +.post-content table td code:only-child { + margin: auto 0; +} +.post-content .highlight table { + border-radius: var(--radius); +} +.post-content .highlight:not(table) { + margin: 10px auto; + background: var(--hljs-bg) !important; + border-radius: var(--radius); + direction: ltr; +} +.post-content li > .highlight { + margin-inline-end: 0; +} +.post-content ul pre { + margin-inline-start: calc(var(--gap) * -2); +} +.post-content .highlight pre { + margin: 0; +} +.post-content .highlighttable { + table-layout: fixed; +} +.post-content .highlighttable td:first-child { + width: 40px; +} +.post-content .highlighttable td .linenodiv { + padding-inline-end: 0 !important; +} +.post-content .highlighttable td .highlight, +.post-content .highlighttable td .linenodiv pre { + margin-bottom: 0; +} +.post-content code { + margin: auto 4px; + padding: 4px 6px; + line-height: 1.5; + background: var(--code-bg); + border-radius: 5px; +} +.post-content pre { + background: var(--hljs-bg) !important; + border-radius: var(--radius); +} + +.post-content pre code { + display: block; + margin: auto 0; + padding: 12px 20px 12px 20px; + color: #d5d5d6; + background: var(--hljs-bg) !important; + border-radius: var(--radius); + overflow-x: auto; + word-break: break-all; +} +.post-content blockquote { + margin: 20px 0; + padding: 0 14px; + border-inline-start: 3px solid var(--primary); +} +.post-content hr { + margin: 30px 0; + height: 2px; + background: var(--tertiary); + border: 0; +} +.post-content iframe { + max-width: 100%; +} +.post-content img { + border-radius: 4px; + margin: 1rem auto; +} +.post-content img[src*="#center"] { + margin: 1rem auto; +} +.post-content figure.align-center { + text-align: center; +} +.post-content figure > figcaption { + color: var(--primary); + font-size: 18px; + font-weight: 700; + margin: 8px 0 16px; +} +.post-content figure > figcaption > p { + color: var(--secondary); + font-size: 14px; + font-weight: 400; +} +.toc { + margin: 0 2px 40px; + border: 1px solid var(--border); + background: var(--code-bg); + border-radius: var(--radius); + padding: 0.4em; +} +.dark .toc { + background: var(--entry); +} +.toc details summary { + cursor: zoom-in; + margin-inline-start: 20px; +} +.toc details[open] summary { + cursor: zoom-out; +} +.toc .details { + display: inline; + font-weight: 500; +} +.toc .inner { + margin: 0 20px; + padding: 10px 20px; +} +.toc li ul { + margin-inline-start: var(--gap); +} +.toc summary:focus { + outline: 0; +} +.post-footer { + margin-top: 56px; +} +.post-tags li { + display: inline-block; + margin-inline-end: 3px; + margin-bottom: 5px; +} +.post-tags a, +.share-buttons, +.paginav { + border-radius: var(--radius); + background: var(--code-bg); + border: 1px solid var(--border); +} +.paginav a { + padding: 0 0 10px 0; +} +.post-tags a { + display: block; + padding-inline-start: 14px; + padding-inline-end: 14px; + color: var(--secondary); + font-size: 14px; + line-height: 34px; + background: var(--code-bg); +} +.post-tags a:hover, +.paginav a:hover { + background: var(--tertiary); +} +.share-buttons { + margin: 14px 0; + padding-inline-start: var(--radius); + display: flex; + justify-content: center; + overflow-x: auto; +} +.share-buttons a { + margin-top: 10px; +} +.share-buttons a:not(:last-of-type) { + margin-inline-end: 12px; +} +h1:hover .anchor, +h2:hover .anchor, +h3:hover .anchor, +h4:hover .anchor, +h5:hover .anchor, +h6:hover .anchor { + display: inline-flex; + color: var(--secondary); + margin-inline-start: 8px; + font-weight: 500; + user-select: none; +} +.paginav { + margin: 10px 0; + display: flex; + line-height: 30px; + border-radius: var(--radius); +} +.paginav a { + padding-inline-start: 14px; + padding-inline-end: 14px; + border-radius: var(--radius); +} +.paginav .title { + letter-spacing: 1px; + text-transform: uppercase; + font-size: small; + color: var(--secondary); +} +.paginav .prev, +.paginav .next { + width: 50%; +} + +.paginav .next { + margin-inline-start: auto; + text-align: right; +} +[dir="rtl"] .paginav .next { + text-align: left; +} +h1 > a > svg { + display: inline; +} +img.in-text { + display: inline; + margin: auto; +} +.buttons, +.main .profile { + display: flex; + justify-content: center; +} +.main .profile { + align-items: center; + min-height: calc( + 100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2) + ); + text-align: center; +} +.profile .profile_inner h1 { + padding: 12px 0; +} +.profile img { + display: inline-table; + border-radius: 50%; +} +.buttons { + flex-wrap: wrap; + max-width: 400px; + margin: 0 auto; +} +.button { + background: var(--tertiary); + border-radius: var(--radius); + margin: 8px; + padding: 6px; + transition: transform 0.1s; +} +.button-inner { + padding: 0 8px; +} +.button:active { + transform: scale(0.96); +} +#searchbox input { + padding: 4px 10px; + width: 100%; + color: var(--primary); + font-weight: 700; + border: 2px solid var(--tertiary); + border-radius: var(--radius); +} +#searchbox input:focus { + border-color: var(--secondary); +} +#searchResults li { + list-style: none; + border-radius: var(--radius); + padding: 10px; + margin: 10px 0; + position: relative; + font-weight: 500; +} +#searchResults { + margin: 10px 0; + width: 100%; +} +#searchResults li:active { + transition: transform 0.1s; + transform: scale(0.98); +} +#searchResults a { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + outline: none; +} +#searchResults .focus { + transform: scale(0.98); + border: 2px solid var(--tertiary); +} +.terms-tags li { + display: inline-block; + margin: 10px; + font-weight: 500; +} +.terms-tags a { + display: block; + padding: 3px 10px; + background: var(--tertiary); + border-radius: 6px; + transition: transform 0.1s; +} +.terms-tags a:active { + background: var(--tertiary); + transform: scale(0.96); +} +.chroma { + background-color: unset !important; +} +::-webkit-scrollbar-track { + background: 0 0; +} +.list:not(.dark)::-webkit-scrollbar-track { + background: var(--code-bg); +} +::-webkit-scrollbar-thumb { + background: var(--tertiary); + border: 5px solid var(--theme); + border-radius: var(--radius); +} +.list:not(.dark)::-webkit-scrollbar-thumb { + border: 5px solid var(--code-bg); +} +::-webkit-scrollbar-thumb:hover { + background: var(--secondary); +} +::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) { + background: var(--theme); +} +.post-content .highlighttable td .highlight pre code::-webkit-scrollbar { + display: none; +} +.post-content :not(table) ::-webkit-scrollbar-thumb { + border: 2px solid var(--hljs-bg); + background: #717175; +} +.post-content :not(table) ::-webkit-scrollbar-thumb:hover { + background: #a3a3a5; +} +.gist table::-webkit-scrollbar-thumb { + border: 2px solid #fff; + background: #adadad; +} +.gist table::-webkit-scrollbar-thumb:hover { + background: #707070; +} +.post-content table::-webkit-scrollbar-thumb { + border-width: 2px; +} + +@media screen and (min-width: 768px) { + ::-webkit-scrollbar { + width: 19px; + height: 11px; + } +} +@media screen and (max-width: 768px) { + :root { + --gap: 14px; + } + .profile img { + transform: scale(0.85); + } + .archive-month { + flex-direction: column; + } + .archive-year { + margin-top: 20px; + } + .footer { + padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap); + } +} +@media screen and (max-width: 900px) { + .list .top-link { + transform: translateY(-5rem); + } +} +@media (prefers-reduced-motion) { + .terms-tags a:active, + .button:active, + .post-entry:active, + .top-link, + #searchResults .focus, + #searchResults li:active { + transform: none; + } +} +.bg { + color: #f8f8f2; + background-color: #282a36; +} +.chroma { + color: #f8f8f2; + background-color: #282a36; +} +.chroma .x { +} +.chroma .err { +} +.chroma .cl { +} +.chroma .lntd { + vertical-align: top; + padding: 0; + margin: 0; + border: 0; +} +.chroma .lntable { + border-spacing: 0; + padding: 0; + margin: 0; + border: 0; +} +.chroma .hl { + background-color: #474733; +} +.chroma .lnt { + white-space: pre; + user-select: none; + margin-right: 0.4em; + padding: 0 0.4em; + color: #7f7f7f; +} +.chroma .ln { + white-space: pre; + user-select: none; + margin-right: 0.4em; + padding: 0 0.4em; + color: #7f7f7f; +} +.chroma .line { + display: flex; +} +.chroma .k { + color: #ff79c6; +} +.chroma .kc { + color: #ff79c6; +} +.chroma .kd { + color: #8be9fd; + font-style: italic; +} +.chroma .kn { + color: #ff79c6; +} +.chroma .kp { + color: #ff79c6; +} +.chroma .kr { + color: #ff79c6; +} +.chroma .kt { + color: #8be9fd; +} +.chroma .n { +} +.chroma .na { + color: #50fa7b; +} +.chroma .nb { + color: #8be9fd; + font-style: italic; +} +.chroma .bp { +} +.chroma .nc { + color: #50fa7b; +} +.chroma .no { +} +.chroma .nd { +} +.chroma .ni { +} +.chroma .ne { +} +.chroma .nf { + color: #50fa7b; +} +.chroma .fm { +} +.chroma .nl { + color: #8be9fd; + font-style: italic; +} +.chroma .nn { +} +.chroma .nx { +} +.chroma .py { +} +.chroma .nt { + color: #ff79c6; +} +.chroma .nv { + color: #8be9fd; + font-style: italic; +} +.chroma .vc { + color: #8be9fd; + font-style: italic; +} +.chroma .vg { + color: #8be9fd; + font-style: italic; +} +.chroma .vi { + color: #8be9fd; + font-style: italic; +} +.chroma .vm { +} +.chroma .l { +} +.chroma .ld { +} +.chroma .s { + color: #f1fa8c; +} +.chroma .sa { + color: #f1fa8c; +} +.chroma .sb { + color: #f1fa8c; +} +.chroma .sc { + color: #f1fa8c; +} +.chroma .dl { + color: #f1fa8c; +} +.chroma .sd { + color: #f1fa8c; +} +.chroma .s2 { + color: #f1fa8c; +} +.chroma .se { + color: #f1fa8c; +} +.chroma .sh { + color: #f1fa8c; +} +.chroma .si { + color: #f1fa8c; +} +.chroma .sx { + color: #f1fa8c; +} +.chroma .sr { + color: #f1fa8c; +} +.chroma .s1 { + color: #f1fa8c; +} +.chroma .ss { + color: #f1fa8c; +} +.chroma .m { + color: #bd93f9; +} +.chroma .mb { + color: #bd93f9; +} +.chroma .mf { + color: #bd93f9; +} +.chroma .mh { + color: #bd93f9; +} +.chroma .mi { + color: #bd93f9; +} +.chroma .il { + color: #bd93f9; +} +.chroma .mo { + color: #bd93f9; +} +.chroma .o { + color: #ff79c6; +} +.chroma .ow { + color: #ff79c6; +} +.chroma .p { +} +.chroma .c { + color: #6272a4; +} +.chroma .ch { + color: #6272a4; +} +.chroma .cm { + color: #6272a4; +} +.chroma .c1 { + color: #6272a4; +} +.chroma .cs { + color: #6272a4; +} +.chroma .cp { + color: #ff79c6; +} +.chroma .cpf { + color: #ff79c6; +} +.chroma .g { +} +.chroma .gd { + color: #f55; +} +.chroma .ge { + text-decoration: underline; +} +.chroma .gr { +} +.chroma .gh { + font-weight: 700; +} +.chroma .gi { + color: #50fa7b; + font-weight: 700; +} +.chroma .go { + color: #44475a; +} +.chroma .gp { +} +.chroma .gs { +} +.chroma .gu { + font-weight: 700; +} +.chroma .gt { +} +.chroma .gl { + text-decoration: underline; +} +.chroma .w { +} diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 0000000..79dad65 --- /dev/null +++ b/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/favicon_16.png b/favicon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..233e17f1483ca7fc245db3b44d00bbc243c10bf4 GIT binary patch literal 682 zcmV;b0#*HqP)*>Z*pnK#LAeBrp&p zCNAi%EGERbN{NFBCRExGv}tGxB)p-0&jDWYQn=;G^S!(8-S=`QV`F24&05>lXf(3M zmGlsp401jzus z9X|0`GhDz`)kP6`b=q+t2mBxBVvrns_L2K>FH^VIaW7*g89BrKA%4$$Md|&2=M44`ckRH zt@x#vsngH2_7)ZcFnR~v)taFBk6XL%jH@*wv33Z1iwrsgB;a( z+&<5bttfY{9x)JaFuxk(VaE~&yJa$&OjyEaW362VDgcE-fml}`eV2Xq4h?IiHopFH zSjz1(oH(MhJHh(;dXW4t8jXI6G@H%($$Bmpi$$(YO)>ZV9=ts}<_QLW10o!-eM#Y|` Qn*aa+07*qoM6N<$f?JC%>Hq)$ literal 0 HcmV?d00001 diff --git a/favicon_32.png b/favicon_32.png new file mode 100644 index 0000000000000000000000000000000000000000..fd733bc030f025034bb4eddb3b4ff7b85d0a183b GIT binary patch literal 1574 zcmV+>2HE+EP)|S1nqhBasx>;dX3?ojv&57X zZ);49O&j}9t&6gWF|n3S{#f0Hk&4pW3Mot2BSvIx`3o3bfpa95s^>nfw(dT(+O&A`E> z0jH#-_(Qw&@St#?bEhztY$nZTlTRlQGDe-$M0rf`Zc zZ@qzIlss37Zc4GGBpJxGs{XPk4OS^~VfXh1~jfu96=1mHiTF1{7|F6W?tpOT=-Gq~Sc+a)4bTmWlrlSp=f z9Xoaqi^Z13KDP$9tE-E1=gwu56JyK)pwA73Liy3`(bd(Jl^2V}C@(Kx zPYz&DI2_J%)4e@Nhr{=MrlzLo?d|2>4eztDAO*nqti!L*5$M^jpQUC?h)6;b> zP#uIlJUoo&dBo#!Mn*>X`aN&+VCh2T|NE-Ti$j}<$KzbObcx~N;Xn>VWUC8o4npqk z?xwrDoA&nhH96O=U1R_L{ehCF@fl;SExeOE{?FJDxQ7BnA`yyi^j(N zR2Te>gP->ppK+K^LVga6dJY>4l#dl!e)PveKA1Fo<)JxJ)9>-iSN_3)15H#^RB-wGk)>2bbLrY5wwRc}+-y<`;Kko2@-xqSQy@;tBx9azUNr$WB z4#N`;pD48Kdt`>%yD!qx(n3v5&1%UJku#p>EvOh{o(GndwzZbd&Q4;n81G(Rm|as= za2;jd7ltQp894suFl|qdaq64nlx|$;j_+P~iN#`cc6P32K&`buhx9yx-%3X-Z$#= zwN^yFxU}F_L!i^KF{Tgb3x~sbp6Au7>O&&3SyhVwL}Wr$FN;WjI2`WtJnzPOLv9BD Y1@d@NGOco-egFUf07*qoM6N<$f)v&Y_5c6? literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..2181a36 --- /dev/null +++ b/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + + + + +

Recent Posts

+ + + +
+
+

Alchitry Labs V2.0.5 - Simulations

+
+ +
+

Version 2.0.5-Preview of Alchitry Labs is now available. It now supports simulating the main Alchitry boards as well as the Io Element.

+

+
+ +
+ + + + + + + + + + + + + + + + +2024-02-06 · 5 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2 - Update 3

+
+ +
+ + + + + + + + + + + + + + + + +2024-01-15 · 2 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2 - Update 2

+
+ +
+ + + + + + + + + + + + + + + + +2024-01-04 · 5 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2 - Update 1

+
+ +
+ + + + + + + + + + + + + + + + +2023-10-13 · 5 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Loader V2

+
+ +
+ + + + + + + + + + + + + + + + +2023-09-18 · 2 min · Justin Rajewski + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/alchitry-labs-v2-0-5-simulations/index.html b/news/alchitry-labs-v2-0-5-simulations/index.html new file mode 100644 index 0000000..25e898c --- /dev/null +++ b/news/alchitry-labs-v2-0-5-simulations/index.html @@ -0,0 +1,619 @@ + + + + + + + + +Alchitry Labs V2.0.5 - Simulations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Alchitry Labs V2.0.5 - Simulations

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

Version 2.0.5-Preview of Alchitry Labs is now available. It now supports simulating the main Alchitry boards as well as the Io Element.

+ +

Alchitry Labs V2.0.5 Preview

+

Simulation Setup +

+

Minimally, if your design connects to the CLOCK pin on the Alchitry board, you can click the little bug icon in the tool bar. This will open up a tab that will show a virtual version of your Au or Cu.

+

If you also connect to the RESET pin or the LED0 through LED7 pins, the main board will also simulate those.

+

By "connect" I mean that you have valid pin constraints for them in your .acf file.

+

With these connected, you can write your design how you normally would. However, when you click the "bug" the simulation will start almost immediately.

+

Counter Simulation

+

Here's a GIF of a counter running on the board. Note that I have the simulation speed set way down so you can easily see the LEDs blinking.

+

When writing this I discovered a bug in 2.0.5 that prevents you from setting the speed really low (~20Hz or less) where it just doesn't do anything. It's fixed and will make it into the next release.

+

What's really cool about the simulation is that the LED state isn't just on or off. It actually keeps track of all the values from the previous frame and averages them to allow for PWM.

+

Wave Animation

+

Here's the classic wave pattern that the Alchitry boards ship with being simulated.

+

This fake persistence of vision effect was important when implementing the 7-segment digits on the Io Element. These are multiplexed so you typically only have one of the four lit at any given time.

+

This is all accurately simulated and you can see in the first screen shot an example of it showing some numbers.

+

The buttons and switches are also all intractable. Clicking on a button momentarily presses it while click on the dip switch toggles it.

+

When the simulator detects that your design is connected to all the signals of the Io Element, it'll stack one on top automatically.

+

Controlling the Simulation +

+

In the simulation tab, there is a toolbar with a couple of buttons and a text box for controlling the simulation.

+

The first button lets you play/pause the simulation.

+

When the simulation is paused, you can enter a target into the "Target Rate" field. This is the number of cycles per second the simulator will attempt to hit.

+

It may not be able to actually hit your target depending on your design and computer.

+

When the simulation is running, in the top right you can see the actual simulation rate.

+

For example, my computer is able to hit about 3,200 Hz when running the wave and Io demo.

+

Replacing the fancy wave pattern with a basic counter, I can hit about 13,800 Hz.

+

The repeat loop in the wave pattern module is relatively slow to simulate as it can't be parallelized in simulation. Each always block runs in it's own job so many always blocks can be run in parallel but a single always block can't be.

+

Back to the simulator, the last button is the reset button. This just simple resets your design as if you power cycled it.

+

Next Steps +

+

I'm now pretty happy with the simulator. I put a ton of work into getting it to run faster and got about 4x the performance from where I started.

+

It's kind of hilarious to see all 32 monster cores of my desktop struggling reach 100 Hz in some benchmarks when the real FPGA does it all at 100,000,000 Hz with room to spare.

+

Obviously, this type of simulation is no substitute for actually running stuff on the board. However, with the addition of the Io Element, I hope it'll let some people get into digital design by lowering the barrier to entry just a little more.

+

Please let me know if you try it out and what you think! You can email me at justin@alchitry.com or post on the discussion page.

+

Next, I'll be working on the quality of life features of the IDE.

+

You can already format you code with Ctrl+Alt+L but stuff like auto-indenting on new lines needs to be done.

+

I also plan to create a robust auto-complete feature. The old one wasn't awful, but it wasn't context aware and would recommend things that would auto-complete into an error.

+

There's also a known bug where the cursor position will get a little messed up. Hitting Ctrl+Alt+L works as a workaround but I need to track down what's causing it.

+

Until next time!

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/alchitry-labs-v2-cli/index.html b/news/alchitry-labs-v2-cli/index.html new file mode 100644 index 0000000..451a940 --- /dev/null +++ b/news/alchitry-labs-v2-cli/index.html @@ -0,0 +1,649 @@ + + + + + + + + +Alchitry Labs V2 - Command Line Interface + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Alchitry Labs V2 - Command Line Interface

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

It has been a while since I last wrote about the progress on Alchitry Labs V2 and a lot has changed.

+

Build Tools +

+

I've spent a good amount of time working on building out the Gradle build script so that the deployment process will be much easier than it was for Alchitry Labs V1.

+

When I was looking for a way to create the Window's installer, I discovered that Compose Multiplatform has a built in packaging tool!

+

It turns out that this still has the major downside of needing to be running on the OS that you want to package for. This means you can't build an installer for Windows from Linux. Bummer, but not the end of the world.

+

I ran into two other issues when flushing out the build script. First, Compose's build tools only support creating one launcher per application. I need to create two. The main one to launch Alchitry Labs and the second to launch the Alchitry Loader.

+

These two programs are actually the same thing with just a different argument passed to them to show a different GUI.

+

It turns out that jpackage, the tool used by Compose, has a way to add additional launchers but Compose currently gives no way to access it. I add the support I needed, I forked the Compose plugin and submitted a pull request.

+

For now, I'm using my local forked version of the Compose plugin, but hopefully they'll accept the pull request or make some similar changes to allow creating additional launchers.

+

Command Line Interface +

+

Something I often get emails about is for command line support in Alchitry Labs. Well, I'm happy to announce that the command line interface for Alchitry Labs V2 will be well supported.

+

I've decided to get everything working via the command line before diving too much into the GUI.

+

Right now, the loading tools already work. So if you've been looking for a way to load your Alchitry boards from the command line, check out the very early releases below.

+

The command line is broken into a bunch of subcommands.

+
$ alchitry --help
+Usage: alchitry_labs options_list
+Subcommands: 
+    new - Create a new project
+    clone - Clone an existing project
+    check - Check a project for errors
+    build - Build an Alchitry Project
+    load - Load a project or .bin file
+    sim - Simulate a project
+    labs - Launch Alchitry Labs GUI
+    loader - Launch Alchitry Loader GUI
+
+Options: 
+    --help, -h -> Usage info 
+
+

If you install the .deb on Linux, you'll get access to the alchitry command.

+

On Windows, the Alchitry.exe executable in the installation directory can be used.

+

You can run --help on each subcommand for more info.

+
$ alchitry load --help
+Usage: alchitry_labs load options_list
+Options: 
+    --project, -p -> Alchitry project file { String }
+    --flash, -f [false] -> Load project to FPGA's flash (persistent) 
+    --ram, -r [false] -> Load project to FPGA's RAM (temporary) 
+    --list, -l [false] -> List all detected boards 
+    --device, -d [0] -> Index of device to load { Int }
+    --bin -> Bin file to load { String }
+    --board, -b -> Board used in the project { Value should be one of [Au, Au+, Cu] }
+    --help, -h -> Usage info 
+
+

For example, you can load a .bin file like this.

+
$ alchitry load --bin alchitry.bin -b Au+ --flash
+Checking IDCODE...
+Loading bridge configuration...
+Erasing...
+Flashing 100% │███████████████████████████████████│ 335339/335339 (0:00:01 / 0:00:00) 
+Resetting FPGA...
+Done.
+
+

If you try this out, let me know what you think over at the discussions page.

+

Releases +

+

These aren't really a "release" as much as just something you can try and mess around with.

+

That being said, the loading features should be fully working.

+

Linux Deb

+

Windows Installer

+

The Labs GUI will open but it doesn't really do much. It is basically just a test right now for the custom text editor.

+

The Loader GUI doesn't open/exist at all yet.

+

The command line tools work for creating and simulating projects as well as loading .bin files.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/alchitry-labs-v2-update-1/index.html b/news/alchitry-labs-v2-update-1/index.html new file mode 100644 index 0000000..8ad879e --- /dev/null +++ b/news/alchitry-labs-v2-update-1/index.html @@ -0,0 +1,635 @@ + + + + + + + + +Alchitry Labs V2 - Update 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Alchitry Labs V2 - Update 1

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

Today was the first time I built a .bin file from Alchitry Labs V2!

+

Before we get too far ahead, there is a lot more to cover.

+

In the last release, I use the Compose Multiplatform Gradle plugin to create native distributions. +At first, this seemed like an awesome solution. However, it has one fatal flaw.

+

The plugin requires you to build each target on its respective platform. That means if you want to build for Windows, you need to be on Windows. If you want to build for an ARM based Mac, you need to have an ARM based Mac.

+

This requirement was the same issue I had before with the original Alchitry Labs but it wasn't that bad since I only ever built for Windows and Linux X64. I was able to do everything from Linux using a Window VM.

+

This time around, I want to add support for more systems. Alchitry Labs runs on a JVM (Java Virtual Machine) so in theory it should run in a ton of places with minimal work.

+

I'm hoping to target everything that Compose supports, Windows x64, Linux x64, Linux ARM, Mac x64, and Mac ARM.

+

When looking for solutions to this, I came across Conveyor which seems to be almost everything I was looking for. Best of all, it is free for open source projects like Alchitry Labs!

+

Conveyor lets you build for every target from a single system. It also deals with code signing and pushing updates.

+

The only downside right now is that it doesn't support Linux AArch64 (ARM). I became a paid subscriber to get this feature onto the dev's radar and I was told it will likely make it into the next major release.

+

Now that I have this all setup, I can run a single command that builds my project, creates update packages, creates an update website, and pushes it all to GitHub.

+

You can now download the latest version from the GitHub page here

+

I'm currently just self signing everything. This only really matters for Windows and Macs where you'll see more security warnings when trying to install it.

+

I'll likely get everything officially signed for the next release. For the Window's release, this means that it'll be available from the Microsoft Store.

+

The Linux version is now packaged as a deb which makes installation so much easier! Installing the deb also adds an update site so that when updates for Alchitry Labs are available they show up in the package manager with everything else.

+

Mac Support +

+

As I've mentioned above, the new releases have Mac versions.

+

Before you get too excited, no, you still can't run Vivado or iceCube 2 on a Mac. This means that you still can't build FPGA projects using the proprietary tools.

+

So why bother supporting Macs? First, many people run the build tools inside of virtual machines inside a Mac. USB devices don't always play nicely going across the VM layer so by having native support for the Alchitry Loader, we can avoid that issue.

+

The Mac versions of the loader are already working!

+

Second, there are open source tools that can run on a Mac. I'm hoping to bundle these with a later release of Alchitry Labs so that you will be able to develop for the Alchitry Cu natively on a Mac.

+

The New Verilog Converter +

+

The biggest update to the Alchitry Labs V2 codebase is the Verilog converter.

+

Continuing with the full rewrite, the new converter is much cleaner than the old one. The original converter was one of the first things I wrote back when the IDE was the "Mojo IDE."

+

Back then, the converted was responsible for everything. Given some Lucid text, it had to spit out a Verilog version.

+

The new converted is instead given a fully parsed Lucid module instance. A lot of the complicated tasks are already done in the previous stage such as dealing with signal indexing, declarations, etc.

+

This, along with better coding practices, has made the new converter about 40% of the size of the original! I'm pretty excited for it.

+

ACF Parser +

+

With a Lucid->Verilog translator working, the next step was to add support for constraint files.

+

The Alchitry Constraint File format is super simple and adding a parser for it wasn't too complicated.

+

I ended up modifying the format a bit from V1 though.

+

Keeping with the change to Lucid, semicolons are now optional. Also, clock statements are considered a special type of pin statement so you don't need to specify both for a single pin.

+

It now checks that the names of the ports and pins are valid. Wildly, I apparently never checked the pin names properly for V1 so they would just show up as "null" in the converted constraint file and cause silent issues.

+

For now, I just have an ACF->XDC converter (XDC is the Xilinx format).

+

Test Build +

+

With all the pieces in place, I was able to get a test build running.

+

Once a project is open, calling Project.build() simply builds the entire project!

+

This only works for the Au/Au+ right now as I still have to port the Cu builders but it is a big milestone!

+

Building Au projects is accessible from the command line interface now.

+

If you want to check out the progress, see the GitHub page.

+

You can install the latest version here.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/alchitry-labs-v2-update-2/index.html b/news/alchitry-labs-v2-update-2/index.html new file mode 100644 index 0000000..e87e9e4 --- /dev/null +++ b/news/alchitry-labs-v2-update-2/index.html @@ -0,0 +1,641 @@ + + + + + + + + +Alchitry Labs V2 - Update 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Alchitry Labs V2 - Update 2

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

It's been a while since I've posted an update and a lot has happened. Most of the work I've been putting into Alchitry Labs has been for the new GUI.

+

Alchitry Labs 2.0.3 PREVIEW

+

As I've mentioned in a previous blog post, this time around I'm using Compose Multiplatform for creating the UI instead of the now very old SWT.

+

Compose is fundamentally different from SWT and allows for a lot more freedom in creating a beautiful UI. However, since Compose for desktop is so new, there are some growing pains I've had to overcome.

+

Code Editor +

+

One of the first things I did when starting the Alchitry Labs rewrite was to see if I could make a text editor perform well with Compose. The built in TextField widget is fine for small text fields but falls apart for something as complicated as a code editor.

+

Compose exposes various levels of abstraction you can dig into depending on what you want to accomplish. I jumped a few layers down and created my own code editor composable.

+

The most important difference between my code editor and the built in TextField is that my code computes the layout of each line individually instead of the entire block of text. The big upside to this is that when text is being edited I only need to compute the lines that change instead of every single line.

+

This makes editing text fast no matter how big the file is.

+

There was a lot of complexity added to make this work but the payoff was worth it.

+

In addition to performance, I was able to add some additional features that are nice to have for the code editor, such as the line numbers in the gutter. These are even flexible so I can potentially later add stuff like icons if needed.

+

TextField also doesn't provide any way to draw a background color behind text so I had to add this custom. This allows for highlighting the token the cursor is on as well as all matching tokens.

+

Tabs +

+

The next major UI hurdle was making the editor tabs work. I already had written a sash composable that would allow me to split a section into left and right or top and bottom resize-able areas (I needed it already for the main layout). However, I wanted to make splitting the editor be as easy as dragging a dropping the tab to where you want it.

+

Again, compose gives you plenty of tools to do this and I had already done something similar for a different project that I was able to steal most of the code from. With some modifications I ended up where it is now where you can not only drag and drop the tabs to rearrange them but drag them top any side of the window to split it.

+

This is definitely a step up from the previous version that requires you to split then window then drag the tab over.

+

Project Tree +

+

This is something that still needs some work, but one of the new features is that file names in the tree are color coded based on their state (yellow = has warnings, red = has errors).

+

This was possible because the way projects/files are checked for errors is fundamentally different than before.

+

When a file is changed, an error check is queued. The error check first parses all the project files for errors like syntax errors. Then starting from the top module, the project is parsed as a tree through the module instances.

+

This allows for a thorough check of the modules using actual parameter values.

+

Some of this could be improved in the future such as caching some of the results for files that haven't changed, but even as it is now it is quite fast.

+

It currently doesn't fully check modules that fall outside the project tree (in other words, modules that are in the project but not used). I'll add this in a later update.

+

Labs and Loader +

+

Alchitry Labs and the Alchitry Loader now share one executable/launcher. This was done because it isn't possible to create two launchers with one installer on macOS.

+

Instead, when you open Alchitry Labs, it'll open whatever you were using last.

+

To switch between Labs and the Loader, you simply click the Alchitry logo in the top left and choose "Switch to X"

+

I have a feeling that most people are using either one or the other and don't often switch between the two. If this isn't you, let me know on the discussion page.

+

Test It Out +

+

There is still a lot of features missing, but if you would like you can download the latest version here.

+

Everything should be there to make a simple project, build, and load it to any of the Alchitry boards.

+

This also means you should be able to use this to build projects for the Alchitry Cu on a Mac.

+

Next Steps +

+

The code editor needs many quality of life improvements such as auto indenting/formatting, auto-complete, support for Verilog, error checking for ACF files, support for Xilinx and Lattice constraint files, context menus (right click), and I'm sure endless more.

+

I need to also add in the component library, port the project templates to Lucid V2, and add back in support the Vivado's IP catalog.

+

I also need to build the front end for running simulations. All the code is there to actually run it, there just isn't currently a way to conveniently start it or view the results. This will likely be my first next step.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/alchitry-labs-v2-update-3/index.html b/news/alchitry-labs-v2-update-3/index.html new file mode 100644 index 0000000..e27e162 --- /dev/null +++ b/news/alchitry-labs-v2-update-3/index.html @@ -0,0 +1,605 @@ + + + + + + + + +Alchitry Labs V2 - Update 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Alchitry Labs V2 - Update 3

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

Simulations are now supported!

+

Alchitry Labs 2.0.4 PREVIEW

+

Test Benches +

+

The new update, 2.0.4-PREVIEW, now has the first draft of the +simulation GUI.

+

To run a simulation you need to first create a test bench.

+

I've covered these before when you could first run them from the command line so make sure +to check that out if you haven't already.

+

There's been an addition to the $print function though. You can still pass it a signal directly for the old behavior, +but you can now pass in a formatting string followed by the values to use.

+

This is similar to something like printf in C/C++.

+

The function call looks something like $print("my value is %d", mySig) where mySig is the signal to print in decimal +where the %d is.

+

The format options are "%d" for decimal, "%b" for binary, "%h" for hexadecimal, and "%nf" for fixed point where +n is the number of fixed fractional bits (for example "%2f").

+

Run the Test +

+

In the code editor, when it detects a test, there is an arrow in the left hand gutter on the line where the test was +declared. You can click this arrow to run that test.

+

Alternatively, clicking the bug icon in the toolbar will run every test.

+

The results of the test are printed to the console and a new tab is opened displaying the resulting values captured at +each $tick().

+

The waveform viewer is currently pretty basic but its enough to start messing with it.

+

You can use the mouse wheel to zoom and click/drag to pan around.

+

The values at your cursor are show as an overlay.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/alchitry-labs-v2/index.html b/news/alchitry-labs-v2/index.html new file mode 100644 index 0000000..250ed17 --- /dev/null +++ b/news/alchitry-labs-v2/index.html @@ -0,0 +1,632 @@ + + + + + + + + +Alchitry Labs V2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Alchitry Labs V2

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

I am now starting to work on the UI of the Alchitry Labs rewrite!

+

Alchitry Labs currently use UI toolkit, SWT. +This is the UI toolkit developed and used by Eclipse. +At the time I started working on what was then the Mojo IDE, SWT was a solid choice. +It allowed me to create a single UI that worked on Windows and Linux with minimal effort, and it looked native on both +platforms.

+

However, it hasn't aged super well.

+

I found it to be fairly limited when trying to do anything custom. +For example, I wanted the project tree on the left side of the window to stay the same size when you resized the window. +The main code editor should be the only thing that changes size to accommodate the new window size. +SWT doesn't allow for this, and instead you specify the size of each side as a percent. +My workaround was to recalculate the percentages every time the window size changes to keep one side a fixed size. +This mostly works, but if you resize the window a lot, you may notice the divider jumps around due to rounding errors.

+

In newer versions of SWT, something changed/broke that broke the tooltip window from popping up when hovering over an +error in the text editor. +I spend a stupid amount of time trying to figure out a fix for this before giving up and sticking with an old version +of the library. +This annoyingly prevents other bugs from getting fixed though.

+

One of the worst offenders is the undo/redo bug in the current Alchitry Labs. +I've spent days trying to get the undo/redo function to be reliable, but for whatever reason, the way SWT handles the +edit events have prevented me from getting it to always work. V2 already has a fully reliable undo/redo working.

+

TLDR, I'm moving to something else.

+

Jetpack Compose +

+

If you do any UI work and haven't tried Jetpack Compose you're +missing out.

+

This is a declarative UI framework originally developed for use on Android, but it has since made its way onto more +platforms including desktop.

+

I find it a joy to use, and it doesn't lock you into anything allowing me to create whatever custom UI elements or +tweaks I need.

+

Unfortunately, the built-in text editor (TextField) has terrible performance if you are trying to edit any decent amount +of text. +This led me to write my own custom editor that has solid performance for thousands of lines of code.

+

While this was a substantial amount of work, it also opens up potential in the future for doing cool tricks like +collapsable blocks. This was impossible with SWT.

+

Lucid Parser +

+

I've also implemented the snapshots for $tick and added $silentTick which skips the snapshot step. +The snapshots get compiled into a simulation result that holds the value of every signal in the design for every call +of $tick.

+

This will allow the UI to display the results of the entire simulation.

+

The Repo +

+

The Lucid Parser repo has been renamed to Alchitry Labs V2 and now +contains the UI and parser code. +This is where all the progress can be found.

+

There is a discussion page, or you can +email me and let me know your thoughts.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/alchitry-loader-v2/index.html b/news/alchitry-loader-v2/index.html new file mode 100644 index 0000000..4dc50e2 --- /dev/null +++ b/news/alchitry-loader-v2/index.html @@ -0,0 +1,587 @@ + + + + + + + + +Alchitry Loader V2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Alchitry Loader V2

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

The Alchitry Loader portion of the Alchitry Labs V2 rewrite is mostly done!

+

Alchitry Loader

+

The new loader automatically detects connected boards and lists them in a drop down. This allows you to have more than one board connected without conflict.

+

Under the hood, it now also handles the D2XX driver a bit more elegantly. It first tries to load the proprietary D2XX library (libd2xx) and if it fails, it falls back to the open source libUSB driver.

+

On Windows, you'll almost always be using D2XX from FTDI. However, on Linux, libUSB is the default but you can install libd2xx and it'll be detected and used.

+

There are still a few weird kinks to work out but it is overall usable (and an improvement over the old one).

+

On Windows, I haven't been able to figure out how to configure the installer to not install a shortcut for the command line interface version of the launcher. After running the installer, you'll see a shortcut called "alchitry" which doesn't seem to do anything. This is the command line interface launcher.

+

There seems to be a bug in jpackage that ignores the value of the --win-shortcut option and always makes shortcuts. I'll have to dig into more eventually.

+

On Linux, I've been having a hard time getting the window's icon to be set correctly. On Gnome, it seems to be working but on Ubuntu (22.04) it shows the default Java icon and has some kind of secondary ghost window that you can't focus.

+

Installers +

+

Windows Installer

+

Linux Installer

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/atom.xml b/news/atom.xml new file mode 100644 index 0000000..e8f8889 --- /dev/null +++ b/news/atom.xml @@ -0,0 +1,544 @@ + + + - News + + + Zola + 2024-02-06T00:00:00+00:00 + https://alchitry.com/news/atom.xml + + Alchitry Labs V2.0.5 - Simulations + 2024-02-06T00:00:00+00:00 + 2024-02-06T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/ + + <p><a href="https://alchitry.com/Alchitry-Labs-V2/download.html">Version 2.0.5-Preview</a> of Alchitry Labs is now available. It now supports simulating the main Alchitry boards as well as the Io Element.</p> + + + + + Alchitry Labs V2 - Update 3 + 2024-01-15T00:00:00+00:00 + 2024-01-15T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-update-3/ + + <p>Simulations are now supported!</p> +<p><img src="https://cdn.alchitry.com/labs-v2/alchitry-labs-2.0.4-preview.png" alt="Alchitry Labs 2.0.4 PREVIEW" /></p> +<h2 id="test-benches">Test Benches<a class="anchor" aria-hidden="true" href="#test-benches" hidden="">#</a> +</h2> +<p>The new update, <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">2.0.4-PREVIEW</a>, now has the first draft of the +simulation GUI.</p> +<p>To run a simulation you need to first create a test bench.</p> +<p>I've covered these before when you could first run them from the command line so make sure +to <a href="https://alchitry.com/news/lucid-v2-update-2/">check that out</a> if you haven't already.</p> +<p>There's been an addition to the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$print</span></code> function though. You can still pass it a signal directly for the old behavior, +but you can now pass in a formatting string followed by the values to use.</p> +<p>This is similar to something like <code class="language-lucid" data-lang="lucid"><span>printf</span></code> in C/C++.</p> +<p>The function call looks something like <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$print</span><span style="color:#ed4343;">(</span><span style="color:#bfbf0a;">&quot;my value is %d&quot;</span><span style="color:#ed4343;">,</span><span> mySig</span><span style="color:#ed4343;">)</span></code> where <code class="language-lucid" data-lang="lucid"><span>mySig</span></code> is the signal to print in decimal +where the %d is.</p> +<p>The format options are <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%d&quot;</span></code> for decimal, <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%b&quot;</span></code> for binary, <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%h&quot;</span></code> for hexadecimal, and <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%nf&quot;</span></code> for fixed point where +n is the number of fixed fractional bits (for example <code class="language-lucid" data-lang="lucid"><span style="color:#bfbf0a;">&quot;%2f&quot;</span></code>).</p> +<h2 id="run-the-test">Run the Test<a class="anchor" aria-hidden="true" href="#run-the-test" hidden="">#</a> +</h2> +<p>In the code editor, when it detects a test, there is an arrow in the left hand gutter on the line where the test was +declared. You can click this arrow to run that test.</p> +<p>Alternatively, clicking the bug icon in the toolbar will run every test.</p> +<p>The results of the test are printed to the console and a new tab is opened displaying the resulting values captured at +each <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code>.</p> +<p>The waveform viewer is currently pretty basic but its enough to start messing with it.</p> +<p>You can use the mouse wheel to zoom and click/drag to pan around.</p> +<p>The values at your cursor are show as an overlay.</p> + + + + + Alchitry Labs V2 - Update 2 + 2024-01-04T00:00:00+00:00 + 2024-01-04T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-update-2/ + + <p>It's been a while since I've posted an update and a lot has happened. Most of the work I've been putting into Alchitry Labs has been for the new GUI.</p> +<p><img src="https://cdn.alchitry.com/labs-v2/alchitry-labs-2.0.3-preview.png" alt="Alchitry Labs 2.0.3 PREVIEW" /></p> +<p>As I've mentioned in a previous blog post, this time around I'm using <a href="https://www.jetbrains.com/lp/compose-multiplatform/">Compose Multiplatform</a> for creating the UI instead of the now very old <a href="https://www.eclipse.org/swt/">SWT</a>.</p> +<p>Compose is fundamentally different from SWT and allows for a lot more freedom in creating a beautiful UI. However, since Compose for desktop is so new, there are some growing pains I've had to overcome.</p> +<h2 id="code-editor">Code Editor<a class="anchor" aria-hidden="true" href="#code-editor" hidden="">#</a> +</h2> +<p>One of the first things I did when starting the Alchitry Labs rewrite was to see if I could make a text editor perform well with Compose. The built in <code>TextField</code> widget is fine for small text fields but falls apart for something as complicated as a code editor.</p> +<p>Compose exposes various levels of abstraction you can dig into depending on what you want to accomplish. I jumped a few layers down and created my own code editor composable. </p> +<p>The most important difference between my code editor and the built in <code>TextField</code> is that my code computes the layout of each line individually instead of the entire block of text. The big upside to this is that when text is being edited I only need to compute the lines that change instead of every single line.</p> +<p>This makes editing text fast no matter how big the file is.</p> +<p>There was a lot of complexity added to make this work but the payoff was worth it.</p> +<p>In addition to performance, I was able to add some additional features that are nice to have for the code editor, such as the line numbers in the gutter. These are even flexible so I can potentially later add stuff like icons if needed.</p> +<p><code>TextField</code> also doesn't provide any way to draw a background color behind text so I had to add this custom. This allows for highlighting the token the cursor is on as well as all matching tokens. </p> +<h2 id="tabs">Tabs<a class="anchor" aria-hidden="true" href="#tabs" hidden="">#</a> +</h2> +<p>The next major UI hurdle was making the editor tabs work. I already had written a sash composable that would allow me to split a section into left and right or top and bottom resize-able areas (I needed it already for the main layout). However, I wanted to make splitting the editor be as easy as dragging a dropping the tab to where you want it.</p> +<p>Again, compose gives you plenty of tools to do this and I had already done something similar for a different project that I was able to steal most of the code from. With some modifications I ended up where it is now where you can not only drag and drop the tabs to rearrange them but drag them top any side of the window to split it.</p> +<p>This is definitely a step up from the previous version that requires you to split then window then drag the tab over.</p> +<h2 id="project-tree">Project Tree<a class="anchor" aria-hidden="true" href="#project-tree" hidden="">#</a> +</h2> +<p>This is something that still needs some work, but one of the new features is that file names in the tree are color coded based on their state (yellow = has warnings, red = has errors).</p> +<p>This was possible because the way projects/files are checked for errors is fundamentally different than before.</p> +<p>When a file is changed, an error check is queued. The error check first parses all the project files for errors like syntax errors. Then starting from the top module, the project is parsed as a tree through the module instances.</p> +<p>This allows for a thorough check of the modules using actual parameter values. </p> +<p>Some of this could be improved in the future such as caching some of the results for files that haven't changed, but even as it is now it is quite fast.</p> +<p>It currently doesn't fully check modules that fall outside the project tree (in other words, modules that are in the project but not used). I'll add this in a later update.</p> +<h2 id="labs-and-loader">Labs and Loader<a class="anchor" aria-hidden="true" href="#labs-and-loader" hidden="">#</a> +</h2> +<p>Alchitry Labs and the Alchitry Loader now share one executable/launcher. This was done because it isn't possible to create two launchers with one installer on macOS.</p> +<p>Instead, when you open Alchitry Labs, it'll open whatever you were using last.</p> +<p>To switch between Labs and the Loader, you simply click the Alchitry logo in the top left and choose &quot;Switch to X&quot;</p> +<p>I have a feeling that most people are using either one or the other and don't often switch between the two. If this isn't you, let me know on the <a href="https://github.com/alchitry/LucidParserV2/discussions">discussion page</a>.</p> +<h2 id="test-it-out">Test It Out<a class="anchor" aria-hidden="true" href="#test-it-out" hidden="">#</a> +</h2> +<p>There is still a lot of features missing, but if you would like you can download the <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">latest version here</a>.</p> +<p>Everything should be there to make a simple project, build, and load it to any of the Alchitry boards.</p> +<p>This also means you should be able to use this to build projects for the Alchitry Cu on a Mac.</p> +<h2 id="next-steps">Next Steps<a class="anchor" aria-hidden="true" href="#next-steps" hidden="">#</a> +</h2> +<p>The code editor needs many quality of life improvements such as auto indenting/formatting, auto-complete, support for Verilog, error checking for ACF files, support for Xilinx and Lattice constraint files, context menus (right click), and I'm sure endless more.</p> +<p>I need to also add in the component library, port the project templates to Lucid V2, and add back in support the Vivado's IP catalog.</p> +<p>I also need to build the front end for running simulations. All the code is there to actually run it, there just isn't currently a way to conveniently start it or view the results. This will likely be my first next step.</p> + + + + + Alchitry Labs V2 - Update 1 + 2023-10-13T00:00:00+00:00 + 2023-10-13T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-update-1/ + + <p>Today was the first time I built a .bin file from Alchitry Labs V2!</p> +<p>Before we get too far ahead, there is a lot more to cover.</p> +<p>In the last release, I use the Compose Multiplatform Gradle plugin to create <a href="https://github.com/JetBrains/compose-multiplatform/blob/master/tutorials/Native_distributions_and_local_execution/README.md">native distributions</a>. +At first, this seemed like an awesome solution. However, it has one fatal flaw.</p> +<p>The plugin requires you to build each target on its respective platform. That means if you want to build for Windows, you need to be on Windows. If you want to build for an ARM based Mac, you need to have an ARM based Mac.</p> +<p>This requirement was the same issue I had before with the original Alchitry Labs but it wasn't that bad since I only ever built for Windows and Linux X64. I was able to do everything from Linux using a Window VM.</p> +<p>This time around, I want to add support for more systems. Alchitry Labs runs on a JVM (Java Virtual Machine) so in theory it should run in a ton of places with minimal work.</p> +<p>I'm hoping to target everything that Compose supports, Windows x64, Linux x64, Linux ARM, Mac x64, and Mac ARM.</p> +<p>When looking for solutions to this, I came across <a href="https://www.hydraulic.dev/">Conveyor</a> which seems to be almost everything I was looking for. Best of all, it is free for open source projects like Alchitry Labs!</p> +<p>Conveyor lets you build for every target from a single system. It also deals with code signing and pushing updates.</p> +<p>The only downside right now is that it doesn't support Linux AArch64 (ARM). I became a paid subscriber to get this feature onto the dev's radar and I was told it will likely make it into the next major release.</p> +<p>Now that I have this all setup, I can run a single command that builds my project, creates update packages, creates an update website, and pushes it all to GitHub.</p> +<p>You can now download the latest version from the <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">GitHub page here</a></p> +<p>I'm currently just self signing everything. This only really matters for Windows and Macs where you'll see more security warnings when trying to install it.</p> +<p>I'll likely get everything officially signed for the next release. For the Window's release, this means that it'll be available from the Microsoft Store.</p> +<p>The Linux version is now packaged as a deb which makes installation so much easier! Installing the deb also adds an update site so that when updates for Alchitry Labs are available they show up in the package manager with everything else.</p> +<h2 id="mac-support">Mac Support<a class="anchor" aria-hidden="true" href="#mac-support" hidden="">#</a> +</h2> +<p>As I've mentioned above, the new releases have Mac versions.</p> +<p>Before you get too excited, no, you still can't run Vivado or iceCube 2 on a Mac. This means that you still can't build FPGA projects using the proprietary tools.</p> +<p>So why bother supporting Macs? First, many people run the build tools inside of virtual machines inside a Mac. USB devices don't always play nicely going across the VM layer so by having native support for the Alchitry Loader, we can avoid that issue.</p> +<p>The Mac versions of the loader are already working!</p> +<p>Second, there are open source tools that <em>can</em> run on a Mac. I'm hoping to bundle these with a later release of Alchitry Labs so that you will be able to develop for the Alchitry Cu natively on a Mac.</p> +<h2 id="the-new-verilog-converter">The New Verilog Converter<a class="anchor" aria-hidden="true" href="#the-new-verilog-converter" hidden="">#</a> +</h2> +<p>The biggest update to the Alchitry Labs V2 codebase is the Verilog converter.</p> +<p>Continuing with the full rewrite, the new converter is much cleaner than the old one. The original converter was one of the first things I wrote back when the IDE was the &quot;Mojo IDE.&quot;</p> +<p>Back then, the converted was responsible for everything. Given some Lucid text, it had to spit out a Verilog version.</p> +<p>The new converted is instead given a fully parsed Lucid module instance. A lot of the complicated tasks are already done in the previous stage such as dealing with signal indexing, declarations, etc.</p> +<p>This, along with better coding practices, has made the new converter about 40% of the size of the original! I'm pretty excited for it.</p> +<h2 id="acf-parser">ACF Parser<a class="anchor" aria-hidden="true" href="#acf-parser" hidden="">#</a> +</h2> +<p>With a Lucid-&gt;Verilog translator working, the next step was to add support for constraint files.</p> +<p>The Alchitry Constraint File format is super simple and adding a parser for it wasn't too complicated.</p> +<p>I ended up modifying the format a bit from V1 though. </p> +<p>Keeping with the change to Lucid, semicolons are now optional. Also, clock statements are considered a special type of pin statement so you don't need to specify both for a single pin.</p> +<p>It now checks that the names of the ports and pins are valid. Wildly, I apparently never checked the pin names properly for V1 so they would just show up as &quot;null&quot; in the converted constraint file and cause silent issues.</p> +<p>For now, I just have an ACF-&gt;XDC converter (XDC is the Xilinx format).</p> +<h2 id="test-build">Test Build<a class="anchor" aria-hidden="true" href="#test-build" hidden="">#</a> +</h2> +<p>With all the pieces in place, I was able to get a test build running.</p> +<p>Once a project is open, calling <code>Project.build()</code> simply builds the entire project!</p> +<p>This only works for the Au/Au+ right now as I still have to port the Cu builders but it is a big milestone!</p> +<p>Building Au projects is accessible from the command line interface now.</p> +<p>If you want to check out the progress, see <a href="https://github.com/alchitry/Alchitry-Labs-V2">the GitHub page</a>.</p> +<p>You can install the <a href="https://alchitry.com/Alchitry-Labs-V2/download.html">latest version here</a>.</p> + + + + + Alchitry Loader V2 + 2023-09-18T00:00:00+00:00 + 2023-09-18T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-loader-v2/ + + <p>The Alchitry Loader portion of the Alchitry Labs V2 rewrite is mostly done!</p> +<p><img src="https://cdn.alchitry.com/labs-v2/loader-alpha.png" alt="Alchitry Loader" /></p> +<p>The new loader automatically detects connected boards and lists them in a drop down. This allows you to have more than one board connected without conflict.</p> +<p>Under the hood, it now also handles the D2XX driver a bit more elegantly. It first tries to load the proprietary D2XX library (libd2xx) and if it fails, it falls back to the open source libUSB driver.</p> +<p>On Windows, you'll almost always be using D2XX from FTDI. However, on Linux, libUSB is the default but you can install libd2xx and it'll be detected and used.</p> +<p>There are still a few weird kinks to work out but it is overall usable (and an improvement over the old one).</p> +<p>On Windows, I haven't been able to figure out how to configure the installer to not install a shortcut for the command line interface version of the launcher. After running the installer, you'll see a shortcut called &quot;alchitry&quot; which doesn't seem to do anything. This is the command line interface launcher.</p> +<p>There seems to be a bug in <code>jpackage</code> that ignores the value of the <code>--win-shortcut</code> option and always makes shortcuts. I'll have to dig into more eventually.</p> +<p>On Linux, I've been having a hard time getting the window's icon to be set correctly. On Gnome, it seems to be working but on Ubuntu (22.04) it shows the default Java icon and has some kind of secondary ghost window that you can't focus.</p> +<h1 id="installers">Installers<a class="anchor" aria-hidden="true" href="#installers" hidden="">#</a> +</h1> +<p><a href="https://cdn.alchitry.com/labs-v2/Alchitry%20Labs-2.0.0-ALPHA-1.msi">Windows Installer</a></p> +<p><a href="https://cdn.alchitry.com/labs-v2/alchitry-labs_2.0.0-ALPHA-1-1_amd64.deb">Linux Installer</a></p> + + + + + Alchitry Labs V2 - Command Line Interface + 2023-09-11T00:00:00+00:00 + 2023-09-11T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2-cli/ + + <p>It has been a while since I last wrote about the progress on Alchitry Labs V2 and a lot has changed.</p> +<h2 id="build-tools">Build Tools<a class="anchor" aria-hidden="true" href="#build-tools" hidden="">#</a> +</h2> +<p>I've spent a good amount of time working on building out the Gradle build script so that the deployment process will be much easier than it was for Alchitry Labs V1.</p> +<p>When I was looking for a way to create the Window's installer, I discovered that <a href="https://github.com/JetBrains/compose-multiplatform/tree/master">Compose Multiplatform</a> has a built in <a href="https://github.com/JetBrains/compose-multiplatform/blob/master/tutorials/Native_distributions_and_local_execution/README.md">packaging tool</a>!</p> +<p>It turns out that this still has the major downside of needing to be running on the OS that you want to package for. This means you can't build an installer for Windows from Linux. Bummer, but not the end of the world.</p> +<p>I ran into two other issues when flushing out the build script. First, Compose's build tools only support creating one launcher per application. I need to create two. The main one to launch Alchitry Labs and the second to launch the Alchitry Loader.</p> +<p>These two programs are actually the same thing with just a different argument passed to them to show a different GUI.</p> +<p>It turns out that jpackage, the tool used by Compose, has a way to add additional launchers but Compose currently gives no way to access it. I add the support I needed, I forked the Compose plugin and submitted a <a href="https://github.com/JetBrains/compose-multiplatform/pull/3640">pull request</a>.</p> +<p>For now, I'm using my local forked version of the Compose plugin, but hopefully they'll accept the pull request or make some similar changes to allow creating additional launchers.</p> +<h2 id="command-line-interface">Command Line Interface<a class="anchor" aria-hidden="true" href="#command-line-interface" hidden="">#</a> +</h2> +<p>Something I often get emails about is for command line support in Alchitry Labs. Well, I'm happy to announce that the command line interface for Alchitry Labs V2 will be well supported.</p> +<p>I've decided to get everything working via the command line before diving too much into the GUI.</p> +<p>Right now, the loading tools already work. So if you've been looking for a way to load your Alchitry boards from the command line, check out the very early releases below.</p> +<p>The command line is broken into a bunch of subcommands.</p> +<pre style="background-color:#282828;color:#ffffff;"><code><span>$ alchitry --help +</span><span>Usage: alchitry_labs options_list +</span><span>Subcommands: +</span><span> new - Create a new project +</span><span> clone - Clone an existing project +</span><span> check - Check a project for errors +</span><span> build - Build an Alchitry Project +</span><span> load - Load a project or .bin file +</span><span> sim - Simulate a project +</span><span> labs - Launch Alchitry Labs GUI +</span><span> loader - Launch Alchitry Loader GUI +</span><span> +</span><span>Options: +</span><span> --help, -h -&gt; Usage info +</span></code></pre> +<p>If you install the .deb on Linux, you'll get access to the <code>alchitry</code> command.</p> +<p>On Windows, the <code>Alchitry.exe</code> executable in the installation directory can be used.</p> +<p>You can run <code>--help</code> on each subcommand for more info.</p> +<pre style="background-color:#282828;color:#ffffff;"><code><span>$ alchitry load --help +</span><span>Usage: alchitry_labs load options_list +</span><span>Options: +</span><span> --project, -p -&gt; Alchitry project file { String } +</span><span> --flash, -f [false] -&gt; Load project to FPGA&#39;s flash (persistent) +</span><span> --ram, -r [false] -&gt; Load project to FPGA&#39;s RAM (temporary) +</span><span> --list, -l [false] -&gt; List all detected boards +</span><span> --device, -d [0] -&gt; Index of device to load { Int } +</span><span> --bin -&gt; Bin file to load { String } +</span><span> --board, -b -&gt; Board used in the project { Value should be one of [Au, Au+, Cu] } +</span><span> --help, -h -&gt; Usage info +</span></code></pre> +<p>For example, you can load a .bin file like this.</p> +<pre style="background-color:#282828;color:#ffffff;"><code><span>$ alchitry load --bin alchitry.bin -b Au+ --flash +</span><span>Checking IDCODE... +</span><span>Loading bridge configuration... +</span><span>Erasing... +</span><span>Flashing 100% │███████████████████████████████████│ 335339/335339 (0:00:01 / 0:00:00) +</span><span>Resetting FPGA... +</span><span>Done. +</span></code></pre> +<p>If you try this out, let me know what you think over at the <a href="https://github.com/alchitry/Alchitry-Labs-V2/discussions">discussions page</a>.</p> +<h2 id="releases">Releases<a class="anchor" aria-hidden="true" href="#releases" hidden="">#</a> +</h2> +<p>These aren't really a &quot;release&quot; as much as just something you can try and mess around with.</p> +<p>That being said, the loading features should be fully working.</p> +<p><a href="https://cdn.alchitry.com/labs-v2/alchitry-labs_2.0.0-ALPHA-0-1_amd64.deb">Linux Deb</a></p> +<p><a href="https://cdn.alchitry.com/labs-v2/Alchitry-2.0.0-ALPHA-0.msi">Windows Installer</a></p> +<p>The Labs GUI will open but it doesn't really do much. It is basically just a test right now for the custom text editor.</p> +<p>The Loader GUI doesn't open/exist at all yet.</p> +<p>The command line tools work for creating and simulating projects as well as loading .bin files.</p> + + + + + Alchitry Labs V2 + 2023-06-07T00:00:00+00:00 + 2023-06-07T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/alchitry-labs-v2/ + + <p>I am now starting to work on the UI of the Alchitry Labs rewrite!</p> +<p>Alchitry Labs currently use UI toolkit, SWT. +This is the UI toolkit developed and used by Eclipse. +At the time I started working on what was then the Mojo IDE, SWT was a solid choice. +It allowed me to create a single UI that worked on Windows and Linux with minimal effort, and it looked native on both +platforms.</p> +<p>However, it hasn't aged super well.</p> +<p>I found it to be fairly limited when trying to do anything custom. +For example, I wanted the project tree on the left side of the window to stay the same size when you resized the window. +The main code editor should be the only thing that changes size to accommodate the new window size. +SWT doesn't allow for this, and instead you specify the size of each side as a percent. +My workaround was to recalculate the percentages every time the window size changes to keep one side a fixed size. +This mostly works, but if you resize the window a lot, you may notice the divider jumps around due to rounding errors.</p> +<p>In newer versions of SWT, something changed/broke that broke the tooltip window from popping up when hovering over an +error in the text editor. +I spend a stupid amount of time trying to figure out a fix for this before giving up and sticking with an old version +of the library. +This annoyingly prevents other bugs from getting fixed though.</p> +<p>One of the worst offenders is the undo/redo bug in the current Alchitry Labs. +I've spent days trying to get the undo/redo function to be reliable, but for whatever reason, the way SWT handles the +edit events have prevented me from getting it to always work. V2 already has a fully reliable undo/redo working.</p> +<p>TLDR, I'm moving to something else.</p> +<h2 id="jetpack-compose">Jetpack Compose<a class="anchor" aria-hidden="true" href="#jetpack-compose" hidden="">#</a> +</h2> +<p>If you do any UI work and haven't tried <a href="https://github.com/JetBrains/compose-multiplatform">Jetpack Compose</a> you're +missing out.</p> +<p>This is a declarative UI framework originally developed for use on Android, but it has since made its way onto more +platforms including desktop.</p> +<p>I find it a joy to use, and it doesn't lock you into anything allowing me to create whatever custom UI elements or +tweaks I need.</p> +<p>Unfortunately, the built-in text editor (TextField) has terrible performance if you are trying to edit any decent amount +of text. +This led me to write my own custom editor that has solid performance for thousands of lines of code.</p> +<p>While this was a substantial amount of work, it also opens up potential in the future for doing cool tricks like +collapsable blocks. This was impossible with SWT.</p> +<h2 id="lucid-parser">Lucid Parser<a class="anchor" aria-hidden="true" href="#lucid-parser" hidden="">#</a> +</h2> +<p>I've also implemented the snapshots for <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span></code> and added <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$silentTick</span></code> which skips the snapshot step. +The snapshots get compiled into a simulation result that holds the value of every signal in the design for every call +of <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span></code>.</p> +<p>This will allow the UI to display the results of the entire simulation.</p> +<h2 id="the-repo">The Repo<a class="anchor" aria-hidden="true" href="#the-repo" hidden="">#</a> +</h2> +<p>The Lucid Parser repo has been renamed to <a href="https://github.com/alchitry/Alchitry-Labs-V2">Alchitry Labs V2</a> and now +contains the UI and parser code. +This is where all the progress can be found.</p> +<p>There is a <a href="https://github.com/alchitry/Alchitry-Labs-V2/discussions">discussion page</a>, or you can +<a href="mailto:justin@alchitry.com">email me</a> and let me know your thoughts.</p> + + + + + Lucid V2 - Update 2 - Test Benches + 2023-06-01T00:00:00+00:00 + 2023-06-01T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/lucid-v2-update-2/ + + <p>Test benches are here!</p> +<p>I just pushed a working draft of the test bench code that has the necessities for writing quick tests for you modules!</p> +<h2 id="test-bench-example">Test Bench Example<a class="anchor" aria-hidden="true" href="#test-bench-example" hidden="">#</a> +</h2> +<p>Take a look at this revolutionary counter module I created. </p> +<pre data-lang="lucid" style="background-color:#282828;color:#ffffff;" class="language-lucid "><code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">module</span><span> counter </span><span style="color:#ed4343;">( +</span><span> </span><span style="color:#0a8dbf;">input</span><span> clk</span><span style="color:#ed4343;">, +</span><span> </span><span style="color:#0a8dbf;">output</span><span> count</span><span style="color:#ed4343;">[</span><span style="color:#a269dc;">8</span><span style="color:#ed4343;">] +</span><span style="color:#ed4343;">) { +</span><span> </span><span style="color:#0a8dbf;">dff</span><span> counter</span><span style="color:#ed4343;">[</span><span style="color:#a269dc;">8</span><span style="color:#ed4343;">] (</span><span>.clk</span><span style="color:#ed4343;">(</span><span>clk</span><span style="color:#ed4343;">)) +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">always </span><span style="color:#ed4343;">{ +</span><span> counter.d </span><span style="color:#ed4343;">=</span><span> counter.q </span><span style="color:#ed4343;">+ </span><span style="color:#a269dc;">1 +</span><span> count </span><span style="color:#ed4343;">=</span><span> counter.q +</span><span> </span><span style="color:#ed4343;">} +</span><span style="color:#ed4343;">} +</span></code></pre> +<p>I designed it so that the output <code class="language-lucid" data-lang="lucid"><span>count</span></code> will increment by one on every rising edge of the <code class="language-lucid" data-lang="lucid"><span>clk</span></code> input. However, does +it actually work?!? There's no way to know. Oh wait, we could test it.</p> +<p>Here is my test bench that does just that.</p> +<pre data-lang="lucid" style="background-color:#282828;color:#ffffff;" class="language-lucid "><code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">testBench</span><span> myTestBench </span><span style="color:#ed4343;">{ +</span><span> </span><span style="color:#0a8dbf;">sig</span><span> clk </span><span style="color:#969696;">// signal to use as my clock +</span><span> +</span><span> counter dut </span><span style="color:#ed4343;">(</span><span>.clk</span><span style="color:#ed4343;">(</span><span>clk</span><span style="color:#ed4343;">)) </span><span style="color:#969696;">// device under test +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">fun</span><span> tickClock</span><span style="color:#ed4343;">() { +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">1 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">0 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> </span><span style="color:#ed4343;">} +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">test</span><span> simpleTest </span><span style="color:#ed4343;">{ +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">0 </span><span style="color:#969696;">// initialize the clock +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">repeat</span><span style="color:#ed4343;">(</span><span style="color:#a269dc;">100</span><span style="color:#ed4343;">,</span><span> i</span><span style="color:#ed4343;">) { +</span><span> </span><span style="color:#1bddaf;">$print</span><span style="color:#ed4343;">(</span><span>dut.count</span><span style="color:#ed4343;">) +</span><span> </span><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">(</span><span>dut.count </span><span style="color:#ed4343;">==</span><span> i</span><span style="color:#ed4343;">) +</span><span> </span><span style="color:#1bddaf;">$tickClock</span><span style="color:#ed4343;">() +</span><span> </span><span style="color:#ed4343;">} +</span><span> +</span><span> </span><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">(</span><span>dut.count </span><span style="color:#ed4343;">== </span><span style="color:#a269dc;">100</span><span style="color:#ed4343;">) +</span><span> </span><span style="color:#ed4343;">} +</span><span style="color:#ed4343;">} +</span></code></pre> +<p>The insides of a <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">testBench</span></code> are very similar to a <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#faac1f;">module</span></code> with a couple of key differences. There are no ports +or parameters and instead of <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">always</span></code> blocks you use <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">test</span></code> and <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">fun</span></code> blocks.</p> +<p>On line 2, we create a signal named <code class="language-lucid" data-lang="lucid"><span>clk</span></code> that will act as our clock.</p> +<p>On line 4, we instantiate the device under test or &quot;dut&quot;. It is convention to call the module being tested &quot;dut&quot; but +there is nothing special about the name.</p> +<p>Next, we have our function declaration. Functions have the same properties as tests, but they aren't run directly. +Instead, functions are little pieces of helper code that can be called from tests.</p> +<p>Here I defined the very common function of toggling the clock and called it <code class="language-lucid" data-lang="lucid"><span>tickClock</span></code>. This function doesn't have any +parameters, but it could.</p> +<p>For example, we could give it a parameter to repeat a specified number of times.</p> +<pre data-lang="lucid" style="background-color:#282828;color:#ffffff;" class="language-lucid "><code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">fun</span><span> tickClock</span><span style="color:#ed4343;">(</span><span>times</span><span style="color:#ed4343;">[</span><span style="color:#a269dc;">32</span><span style="color:#ed4343;">]) { +</span><span> </span><span style="font-weight:bold;color:#0abfbf;">repeat</span><span style="color:#ed4343;">(</span><span>times</span><span style="color:#ed4343;">) { +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">1 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> clk </span><span style="color:#ed4343;">= </span><span style="color:#a269dc;">0 +</span><span> </span><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">() +</span><span> </span><span style="color:#ed4343;">} +</span><span style="color:#ed4343;">} +</span></code></pre> +<p>Function arguments act the same as module inputs and can be multidimensional arrays or structs.</p> +<h3 id="test-bench-functions">Test Bench Functions<a class="anchor" aria-hidden="true" href="#test-bench-functions" hidden="">#</a> +</h3> +<p>Before we move on, let me quickly go over the couple of test bench specific functions that I'm using.</p> +<p>The function <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> is at the very core of the simulation. It initiates a simulation tick. So what is a simulation +tick? This is when the simulator publishes all signal changes and recalculates the outputs for all the pieces in the +design whose input signals changed. Those output changes then trigger other updates if they are used as inputs. This +continues until the results of everything stabilize.</p> +<p>The only time it won't stabilize is if you have some kind of dependency loop like <code class="language-lucid" data-lang="lucid"><span>a </span><span style="color:#ed4343;">=</span><span> b</span></code> and <code class="language-lucid" data-lang="lucid"><span>b </span><span style="color:#ed4343;">= ~</span><span>a</span></code>. In this case, +the simulator will quit after 1000 iterations. I chose this number as a seemingly nice upper bound, but it may change if +I find designs often need more or fewer iterations. A loop like this would result in faulty hardware, and anything +requiring too many iterations to resolve would likely be too complicated to do in a single real clock cycle.</p> +<p>So back to the test bench. Before we call <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code>, first we need to set a value to all signals we are using. Signals +default to having a <code class="language-lucid" data-lang="lucid"><span style="color:#a269dc;">bx</span></code> value so bad things will happen if we call <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> before setting a real value. By bad things, +I mean that <code class="language-lucid" data-lang="lucid"><span style="color:#a269dc;">bx</span></code> value will propagate throughout the design contaminating our counter.</p> +<p>With <code class="language-lucid" data-lang="lucid"><span>clk</span></code> set to 0, we call <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> to initialize the design.</p> +<p>Next, we hit a <code class="language-lucid" data-lang="lucid"><span style="font-weight:bold;color:#0abfbf;">repeat</span></code> block that will repeat its contents 100 times and use the signal <code class="language-lucid" data-lang="lucid"><span>i</span></code> as the iteration index.</p> +<p>The first line in the loop prints the value of <code class="language-lucid" data-lang="lucid"><span>dut.count</span></code> using the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$print</span><span style="color:#ed4343;">()</span></code> function. This function takes one +argument, the value to print. It currently outputs the value in the format <code class="language-lucid" data-lang="lucid"><span>dut.count </span><span style="color:#ed4343;">= {</span><span style="color:#a269dc;">00011100</span><span style="color:#ed4343;">} : </span><span style="color:#a269dc;">28</span></code> where the value +is shown in its binary form as well as its decimal value (if it has one).</p> +<p>The next line uses the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">()</span></code> function to check that the value of the counter matches the loop iteration we are on. +The argument to <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">()</span></code> can be anything, and it is treated as a boolean. That means if it is non-zero, nothing +happens, but if it is zero, the simulation is aborted and the <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$assert</span><span style="color:#ed4343;">()</span></code> that caused it is called out.</p> +<p>This is very useful for checking values quickly without having to look back through the simulation manually to see if +values make sense.</p> +<p>The last line in the loop is the call to the function <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tickClock</span><span style="color:#ed4343;">()</span></code> that we already defined.</p> +<p>Finally, we end our test by checking that the counter output is 100 after the 100 cycles.</p> +<p>This example is from one of the tests and can be found in the +<a href="https://github.com/alchitry/LucidParserV2/blob/9795d9dcea1a769be7567025b15607549c36edc3/src/test/kotlin/TestBenchTests.kt#L45">repo here</a>.</p> +<h2 id="next-step">Next Step<a class="anchor" aria-hidden="true" href="#next-step" hidden="">#</a> +</h2> +<p>The next step is to add snapshots of the entire design every time <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$tick</span><span style="color:#ed4343;">()</span></code> is called. This will allow for the +simulation results to be shown after it is run. Currently, it just runs discarding all intermediate values.</p> +<p>I also plan to have a <code class="language-lucid" data-lang="lucid"><span style="color:#1bddaf;">$silentTick</span><span style="color:#ed4343;">()</span></code> or similarly named function that does a tick without taking a snapshot. This way +you can use that when making the clock fall for most designs and avoid the overhead of an entire snapshot.</p> +<p>As before, there is a <a href="https://github.com/alchitry/LucidParserV2/discussions">discussion page</a> setup as part of the repo +where you can let me know your thoughts.</p> + + + + + Lucid V2 - Update 1 + 2023-05-30T00:00:00+00:00 + 2023-05-30T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/lucid-v2-update-1/ + + <p>I just pushed what I believe is the last piece of the core Lucid 2 rewrite.</p> + + + + + Lucid V2 + 2023-05-18T00:00:00+00:00 + 2023-05-18T00:00:00+00:00 + + + + + Justin Rajewski + + + + + + https://alchitry.com/news/lucid-v2/ + + <p>A full rewrite of the Lucid parser in Alchitry Labs has been a long time coming.</p> + + + + diff --git a/news/index.html b/news/index.html new file mode 100644 index 0000000..1a3afa7 --- /dev/null +++ b/news/index.html @@ -0,0 +1,787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + + +
+
+

Alchitry Labs V2.0.5 - Simulations

+
+ +
+

Version 2.0.5-Preview of Alchitry Labs is now available. It now supports simulating the main Alchitry boards as well as the Io Element.

+

+
+ +
+ + + + + + + + + + + + + + + + +2024-02-06 · 5 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2 - Update 3

+
+ +
+ + + + + + + + + + + + + + + + +2024-01-15 · 2 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2 - Update 2

+
+ +
+ + + + + + + + + + + + + + + + +2024-01-04 · 5 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2 - Update 1

+
+ +
+ + + + + + + + + + + + + + + + +2023-10-13 · 5 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Loader V2

+
+ +
+ + + + + + + + + + + + + + + + +2023-09-18 · 2 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2 - Command Line Interface

+
+ +
+ + + + + + + + + + + + + + + + +2023-09-11 · 4 min · Justin Rajewski + +
+ +
+ +
+
+

Alchitry Labs V2

+
+ +
+ + + + + + + + + + + + + + + + +2023-06-07 · 3 min · Justin Rajewski + +
+ +
+ +
+
+

Lucid V2 - Update 2 - Test Benches

+
+ +
+ + + + + + + + + + + + + + + + +2023-06-01 · 5 min · Justin Rajewski + +
+ +
+ +
+
+

Lucid V2 - Update 1

+
+ +
+

I just pushed what I believe is the last piece of the core Lucid 2 rewrite.

+

+
+ +
+ + + + + + + + + + + + + + + + +2023-05-30 · 3 min · Justin Rajewski + +
+ +
+ +
+
+

Lucid V2

+
+ +
+

A full rewrite of the Lucid parser in Alchitry Labs has been a long time coming.

+

+
+ +
+ + + + + + + + + + + + + + + + +2023-05-18 · 6 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/lucid-v2-update-1/index.html b/news/lucid-v2-update-1/index.html new file mode 100644 index 0000000..942d4af --- /dev/null +++ b/news/lucid-v2-update-1/index.html @@ -0,0 +1,620 @@ + + + + + + + + +Lucid V2 - Update 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Lucid V2 - Update 1

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

I just pushed what I believe is the last piece of the core Lucid 2 rewrite.

+ +

Since the last update, I added $widthOf(), $fixedPoint(), $cFixedPoint(), and $fFixedPoint() functions.

+

The $widthOf() function takes one argument and returns its width (number of bits). If the value is an array, the +returned value is also an array with each entry the width of the dimension.

+

For example, $widthOf({8b0, 8b1}) will return an array {8, 2} since the first dimension has two elements and the +inner dimension has 8. Remember that in Lucid (and all HDLs) arrays are indexed right to left to match bit numbers +instead of left to right like most programming languages.

+

If you read the original post, you may remember for enums I presented the syntax +$widthOf(myFSM) to get the width of the enum. I ended up scrapping this since passing myFSM as an argument would +be a weird exception since you can't use enums directly anywhere else. Instead, I added the .WIDTH constant just to +enums. So you can now get the width of an enum by using myFSM.WIDTH or $widthOf(myFSM.INIT) (where INIT is any +member of myFSM).

+

Fixed Point +

+

The fixed point functions work as expected. The basic one, $fixedPoint(), takes three arguments, the value to convert, +the total width, and the fractional width. It returns the fixed point value that is closest to the given value.

+

The function $cFixedPoint() takes the same arguments but returns the closet value that is greater than or equal to +the given value.

+

The function $fFixedPoint() is the same but returns the closet value that is less than or equal to the given value.

+

Interfaces +

+

I attempted to implement interfaces, but along the way I discovered they were just too complicated to add at this point +for what I believe to be a relatively niche feature.

+

They presented many weird cases that would be difficult to deal with such as an array of modules that used an interface.

+

In the end, I decided using structs was a decent compromise to the added complexity.

+

Next Step +

+

The next step is to add test benches. I think I have most of this flushed out in my mind (again refer to the +previous post for details) but now it's time to get it down in code.

+

I don't anticipate this being too difficult to write since the groundwork for simulations is already all there. In +my tests +I've already simulated modules of counters.

+

Once that's done, it'll be on to creating the Verilog translator.

+

As before, there is a discussion page setup as part of the repo +where you can let me know your thoughts.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/lucid-v2-update-2/index.html b/news/lucid-v2-update-2/index.html new file mode 100644 index 0000000..987a458 --- /dev/null +++ b/news/lucid-v2-update-2/index.html @@ -0,0 +1,690 @@ + + + + + + + + +Lucid V2 - Update 2 - Test Benches + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Lucid V2 - Update 2 - Test Benches

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

Test benches are here!

+

I just pushed a working draft of the test bench code that has the necessities for writing quick tests for you modules!

+

Test Bench Example +

+

Take a look at this revolutionary counter module I created.

+
module counter (
+    input clk,
+    output count[8]
+) {
+    dff counter[8] (.clk(clk))
+
+    always {
+        counter.d = counter.q + 1
+        count = counter.q
+    }
+}
+
+

I designed it so that the output count will increment by one on every rising edge of the clk input. However, does +it actually work?!? There's no way to know. Oh wait, we could test it.

+

Here is my test bench that does just that.

+
testBench myTestBench {
+    sig clk // signal to use as my clock
+    
+    counter dut (.clk(clk)) // device under test
+    
+    fun tickClock() {
+        clk = 1
+        $tick()
+        clk = 0
+        $tick()
+    }
+    
+    test simpleTest {
+        clk = 0 // initialize the clock
+        $tick()
+        
+        repeat(100, i) {
+            $print(dut.count)
+            $assert(dut.count == i)
+            $tickClock()
+        }
+        
+        $assert(dut.count == 100)
+    }
+}
+
+

The insides of a testBench are very similar to a module with a couple of key differences. There are no ports +or parameters and instead of always blocks you use test and fun blocks.

+

On line 2, we create a signal named clk that will act as our clock.

+

On line 4, we instantiate the device under test or "dut". It is convention to call the module being tested "dut" but +there is nothing special about the name.

+

Next, we have our function declaration. Functions have the same properties as tests, but they aren't run directly. +Instead, functions are little pieces of helper code that can be called from tests.

+

Here I defined the very common function of toggling the clock and called it tickClock. This function doesn't have any +parameters, but it could.

+

For example, we could give it a parameter to repeat a specified number of times.

+
fun tickClock(times[32]) {
+    repeat(times) {
+        clk = 1
+        $tick()
+        clk = 0
+        $tick()
+    }
+}
+
+

Function arguments act the same as module inputs and can be multidimensional arrays or structs.

+

Test Bench Functions +

+

Before we move on, let me quickly go over the couple of test bench specific functions that I'm using.

+

The function $tick() is at the very core of the simulation. It initiates a simulation tick. So what is a simulation +tick? This is when the simulator publishes all signal changes and recalculates the outputs for all the pieces in the +design whose input signals changed. Those output changes then trigger other updates if they are used as inputs. This +continues until the results of everything stabilize.

+

The only time it won't stabilize is if you have some kind of dependency loop like a = b and b = ~a. In this case, +the simulator will quit after 1000 iterations. I chose this number as a seemingly nice upper bound, but it may change if +I find designs often need more or fewer iterations. A loop like this would result in faulty hardware, and anything +requiring too many iterations to resolve would likely be too complicated to do in a single real clock cycle.

+

So back to the test bench. Before we call $tick(), first we need to set a value to all signals we are using. Signals +default to having a bx value so bad things will happen if we call $tick() before setting a real value. By bad things, +I mean that bx value will propagate throughout the design contaminating our counter.

+

With clk set to 0, we call $tick() to initialize the design.

+

Next, we hit a repeat block that will repeat its contents 100 times and use the signal i as the iteration index.

+

The first line in the loop prints the value of dut.count using the $print() function. This function takes one +argument, the value to print. It currently outputs the value in the format dut.count = {00011100} : 28 where the value +is shown in its binary form as well as its decimal value (if it has one).

+

The next line uses the $assert() function to check that the value of the counter matches the loop iteration we are on. +The argument to $assert() can be anything, and it is treated as a boolean. That means if it is non-zero, nothing +happens, but if it is zero, the simulation is aborted and the $assert() that caused it is called out.

+

This is very useful for checking values quickly without having to look back through the simulation manually to see if +values make sense.

+

The last line in the loop is the call to the function $tickClock() that we already defined.

+

Finally, we end our test by checking that the counter output is 100 after the 100 cycles.

+

This example is from one of the tests and can be found in the +repo here.

+

Next Step +

+

The next step is to add snapshots of the entire design every time $tick() is called. This will allow for the +simulation results to be shown after it is run. Currently, it just runs discarding all intermediate values.

+

I also plan to have a $silentTick() or similarly named function that does a tick without taking a snapshot. This way +you can use that when making the clock fall for most designs and avoid the overhead of an entire snapshot.

+

As before, there is a discussion page setup as part of the repo +where you can let me know your thoughts.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/lucid-v2/index.html b/news/lucid-v2/index.html new file mode 100644 index 0000000..0c487bd --- /dev/null +++ b/news/lucid-v2/index.html @@ -0,0 +1,661 @@ + + + + + + + + +Lucid V2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Lucid V2

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

A full rewrite of the Lucid parser in Alchitry Labs has been a long time coming.

+ +

The current parser has had feature after feature crudely bolted on to a shaky foundation. It was originally only written +to convert Lucid into Verilog. Later, error checking for signal widths was added. Then full parsing on constant values +was added. Then parsing of non-constant values was kind of added. Then... then... then...

+

A lot of the code is confusing and many sections are redundant. On top of that, null checks weren't my specialty and +I often forgot to check when something could've been null resulting in a crash when bad syntax was entered.

+

The new parser is fixing all this while adding many more features. It is written in Kotlin which largely fixes null +checks by having null safe types built into the language.

+

Breaking Changes +

+

I'm also taking this opportunity to reimagine some aspects of Lucid. Because of this, Lucid 2 will break compatibility +with the original Lucid.

+

For example, currently you can use the .WIDTH property of signals in Lucid to access their dimensions (number of bits). +In Lucid 2, this is getting replaced by the $widthOf() function. This will allow you to not only get the widths of +signals but also expressions. It also helps clean up the internal code when resolving signals.

+

The fsm type is being removed and being replaced with enum. The fsm type was kind of a strange type in that it +really was just a dff with an associated set of constants. The new method is to use enum to declare a set of +constants and use a dff to hold them. Here's an example.

+
enum myFSM { INIT, START, RUN, STOP }
+dff myDff[$widthOf(myFSM)]
+
+always {
+    myDff.d = myFSM.START
+}
+
+

This simplifies things by making dff the only sequential type.

+

The eagle eyed among you may have noticed that there aren't any semicolons in the above code snippet. Semicolons are +optional in Lucid 2.

+

The var type is also being removed. The only real use for the var type was in for loops which you could still use +a sig type for. It wasn't particularly intuitive as it had the size of a computer Int when everything else a single +bit.

+

Speaking of for loops, these are replaced with repeat blocks. These have the syntax repeat(count, var) { ... } +where count is the number of times to repeat the block and var is the name to use for the current iteration index. +This signal is automatically generated for you and you don't need to declare it somewhere else. It is only visible +inside the repeat block.

+

There are a handful of other minor changes. When declaring a dff or sig, you can now only declare one per line. +Declaring multiple off the same keyword was rarely used and often made the code harder to read. Removing this also +made the backend code cleaner.

+

The struct portion of a declaration was moved after the array indices. An old dff declaration with that +used a struct used to look like this dff<myStruct> myDff[8] (.clk(clk));. It now looks like this +dff myDff[8]<myStruct> (.clk(clk)). The original style was based on generics in languages like Java, but the new style +fits better with how you actually index the values. It makes it much clearer that myDff is an array of structs.

+

New Additions +

+

There will be some new functions to help when working with fixed point numbers. I haven't nailed all these down yet but +something along the lines of $fixedPoint(3.14159, 8, 4) will generate an 8-bit wide number with 4 bits used for the +decimal (aka 8b00110010) that is the closest approximation to the 3.14159. There will also be ceiling and floor +versions that generate the closet value above or below the given value respectively.

+

I'm also planning to implement interfaces. These will basically be like struct but each member will have a direction +associated with it. I found myself often creating two struct where one would be for inputs and one would be for +outputs. For example, the memory.in and memory.out structs used by the +DDR interface.

+

Interfaces will allow combining these into a single port. There will be "a" and "b" versions of each interface where +the "b" version is a mirrored copy of "a" (inputs are outputs, outputs are inputs). That way a module with an "a" port +can directly connect to a module with a "b" port.

+

Simulation +

+

A big motivator for the rewrite was the potential to do full Lucid simulations. The old code would parse constant +expressions, but it only hinted at the possibility to do a full simulation by iterating the parsing.

+

The new code builds a full model of your project complete with signal connections, models for always blocks, and other +dynamic expressions. This not only helps with more robust error checking (it's hard to miss something when you're +required to actually model it all) but will allow for quick simple simulations to check if your logic is working how +you expect.

+

Much of this is already working. The details are more than the scope of this post, but check out the link to the source +below for details on how it works.

+

As part of doing simulations, a new testBench will be created. I haven't nailed down the specifics for this either +just quiet yet but the current idea is for a testBench to look similar to a module. Inside the testBench, you +will be able to instantiate your module to test. You can then test it via test and function blocks.

+

The test blocks will work similar to an always block in that the contents will run sequentially.

+

The function blocks will be the same except they won't run on their own and can instead be called by test blocks. +I'm imagining these being used for common tasks like cycling a clock. For example, something like +repeat(100) { cycleClock() }. The syntax for this is very much still up in the air.

+

Source and Discussion +

+

Head over to our GitHub page to check out the current state of things.

+

There is also a discussion page setup as part of the repo +where you can let me know your thoughts.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/news/page/1/index.html b/news/page/1/index.html new file mode 100644 index 0000000..9da723f --- /dev/null +++ b/news/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..3b4c571 --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://alchitry.com/sitemap.xml diff --git a/search_index.en.js b/search_index.en.js new file mode 100644 index 0000000..5a603d8 --- /dev/null +++ b/search_index.en.js @@ -0,0 +1 @@ +window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.4641016151377544}},"df":2,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{},"df":0,"1":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}}},"1":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"1":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.1622776601683795}},"df":3,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":2,"0":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772}},"df":2,",":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,",":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}}}},"0":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}},"1":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"1":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"2":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1},"3":{"docs":{},"df":0,",":{"docs":{},"df":0,"8":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"4":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"6":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"2":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":7,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"4":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1},"5":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951}},"df":1}}}},"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":1,"h":{"docs":{},"df":0,"z":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}},"1":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1},"2":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,"4":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}},"5":{"docs":{},"df":0,"5":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"8":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1},"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}},"3":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1,",":{"docs":{},"df":0,"2":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},".":{"docs":{},"df":0,"1":{"docs":{},"df":0,"4":{"docs":{},"df":0,"1":{"docs":{},"df":0,"5":{"docs":{},"df":0,"9":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}},"2":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"4":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3,"0":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1},"b":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"1":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"0":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"1":{"docs":{},"df":0,"2":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"2":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"7":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":2,":":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"b":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"h":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"8":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":3,"b":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}},"1":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}},"h":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"9":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"_":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"a":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"6":{"docs":{},"df":0,"4":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}},"v":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}}}}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}},"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":3},"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":6}}}}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":2.0}},"df":5,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.449489742783178},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":6,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/background/addition/":{"tf":1.0}},"df":6}}}},"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"k":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":3.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":3.3166247903554},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":3.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/setup/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/verilog/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":19},"y":{"docs":{},"df":0,".":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}}}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":8}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":10}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.0}},"df":7}}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0}},"df":2}}}},"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":6}},"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":4}}}},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772}},"df":3}}}}}},"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.23606797749979}},"df":1},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":6}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.1622776601683795}},"df":4}},"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":2}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772}},"df":1}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.4641016151377544}},"df":1}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":1}}},"u":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}}}},"u":{"docs":{"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":2.23606797749979}},"df":5,"/":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"_":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951}},"df":2,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":4}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":2}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}}},"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0}},"df":2}},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}}},"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":6,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/background/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}}}}}}}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3},"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/background/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":6},"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":7}}}},"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":8,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":10}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":2}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.8284271247461903},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0}},"df":4,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}}}},"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":3}}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":6.244997998398398},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":7}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":3.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.123105625617661}},"df":6,"'":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/boards/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.605551275463989},"https://alchitry.com/tutorials/setup/":{"tf":2.23606797749979}},"df":8,"_":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,".":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}}}}}},"l":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}},"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"r":{"docs":{"https://alchitry.com/boards/br/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"w":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":4},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":3.3166247903554},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.8284271247461903},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":6,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":6}}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}},"d":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.449489742783178},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.7416573867739413}},"df":2}}}}},"x":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1}},"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"/":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}},"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":3.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":6}},"m":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1,"r":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":6}}},"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}}},"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":6,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"/":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}}}}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":2.8284271247461903},"https://alchitry.com/tutorials/":{"tf":1.0}},"df":7}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3}},"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":1}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}},"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.8284271247461903}},"df":5,"/":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}}}}}},"k":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772}},"df":1,"(":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.4142135623730951}},"df":5}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}},"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":3.1622776601683795},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":10,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0}},"df":2}}},"e":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":3.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951}},"df":4}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4},"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3}},"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":4}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0}},"df":3},"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.8284271247461903},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":4,"e":{"docs":{},"df":0,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":4}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907}},"df":1}}}},"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"u":{"docs":{"https://alchitry.com/tutorials/background/":{"tf":1.0}},"df":1}}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0}},"df":2}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.605551275463989}},"df":4}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":3}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":3}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}},"x":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":3}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":3.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}}}}},"o":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0}},"df":4},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"'":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0}},"df":3}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":2}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4}}}},"p":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"z":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0}},"df":13}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"+":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"+":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"u":{"docs":{"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.7320508075688772}},"df":6,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":8}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772}},"df":3}}}}},"y":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}}}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2,"1":{"docs":{},"df":0,"2":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"x":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.7320508075688772}},"df":1}}},"a":{"docs":{},"df":0,"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1,"3":{"docs":{"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2}},"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":2,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2},"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.1622776601683795}},"df":4}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":6}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3}}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":6}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907}},"df":4}}},"k":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":3}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":2}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":2.449489742783178}},"df":1,"&":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"m":{"docs":{},"df":0,"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":5}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}}}}}},"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":3}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}}},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":5}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":7}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}},"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":8}},"’":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}},"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/background/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":7}},"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":6},"’":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":6,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":2}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}},"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0}},"df":1},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"r":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":3}}},"u":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1,".":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":9}},"g":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4}},"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":3.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":5}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0}},"df":4}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":3}}},"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":5,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}},"i":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":4}},"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":2}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":5}}}},"t":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1,"u":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":5}}}}}},"x":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0}},"df":9}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"/":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}}}}}},"o":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":1}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0}},"df":3}}}}},"y":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3}}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":3}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}},"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":7}}}},"e":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2}}},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.1622776601683795},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":6}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/":{"tf":1.0}},"df":6},"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}},"t":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.872983346207417}},"df":10}}},"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":5,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1,"(":{"docs":{},"df":0,"3":{"docs":{},"df":0,".":{"docs":{},"df":0,"1":{"docs":{},"df":0,"4":{"docs":{},"df":0,"1":{"docs":{},"df":0,"5":{"docs":{},"df":0,"9":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":1}},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1,"s":{"docs":{"https://alchitry.com/tutorials/verilog/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/background/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951}},"df":1},"m":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":4}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":2}}},"p":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.872983346207417},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0}},"df":8,"'":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2}}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0}},"df":3}},"t":{"docs":{"https://alchitry.com/boards/ft/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.23606797749979}},"df":2,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":4}}},"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":3.7416573867739413},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":6}}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}}}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0}},"df":3}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":5}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":5,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":4}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}},"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":3,"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"2":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"x":{"docs":{},"df":0,"d":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":3,"d":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":2}}}}}},"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":2}}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3}},"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/background/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3}},"i":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":5,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":5}},"’":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}}},"d":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0}},"df":3}},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":5,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/verilog/":{"tf":1.0}},"df":6,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}},"x":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":2}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":2,"f":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"z":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0}},"df":1}},"i":{"docs":{},"df":0,"'":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":4}},"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":7},"v":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":7}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"2":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0}},"df":3}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":5}}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":6,"e":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0}},"df":2}}},"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":5}}}}},"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3}},"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":2}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"/":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}}}}}}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":5}},"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}},"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0}},"df":5}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":4}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":2.0}},"df":6},"n":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2},"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":7}}}}},"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":8}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0}},"df":6},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1},"s":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0}},"df":4,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3}}},"s":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772}},"df":2}}},"t":{"docs":{},"df":0,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":5,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":5}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":2}},"’":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}}},"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":1}}}}}},"o":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1},"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":2}}}}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"@":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,".":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}},"v":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":3}},"y":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":4},"k":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":8,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.8284271247461903},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/verilog/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":13},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}}},"r":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":7}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907}},"df":4},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0}},"df":3}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"'":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951}},"df":3}}}}}},"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":5.5677643628300215}},"df":3,"0":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1},"7":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1},"[":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}}}},"f":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":5}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":3}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":2,"'":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"d":{"docs":{},"df":0,"2":{"docs":{},"df":0,"x":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":3}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951}},"df":1}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}},"f":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2}},"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.8284271247461903},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.0}},"df":10},"k":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.7320508075688772}},"df":4}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":4,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":5}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1},"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":2}},"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0}},"df":7}},"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.1622776601683795}},"df":7},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":4}},"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":6},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"/":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"2":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}}}}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":3.1622776601683795},"https://alchitry.com/tutorials/":{"tf":2.0},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":13}}}}},"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1,"a":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":3.605551275463989},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0}},"df":2}}},"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":5,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}}}},"j":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":3}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.3166247903554},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":11}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}},"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":7},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.7416573867739413},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":7}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0}},"df":3},"y":{"docs":{},"df":0,".":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2}}}},"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}}}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":3,"u":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":1}}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":1}},"i":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.898979485566356},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0}},"df":8}}},"j":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.7320508075688772}},"df":8}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}}}}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/background/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907}},"df":10}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":4}},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":3}}}}}},"e":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}}}}}},"y":{"docs":{},"df":0,"d":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1,"[":{"docs":{},"df":0,"8":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1,"]":{"docs":{},"df":0,"&":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"m":{"docs":{},"df":0,"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}},"f":{"docs":{},"df":0,"s":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1,".":{"docs":{},"df":0,"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}}}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951}},"df":1}}}}},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0}},"df":5}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/background/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0},"https://alchitry.com/tutorials/setup/":{"tf":2.0}},"df":10}},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3}}},"w":{"docs":{"https://alchitry.com/news/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":9,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":2}}},"x":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":6}}},"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4},"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2,"e":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.8284271247461903}},"df":2},"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1},"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":3}}},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":3.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":12}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.0}},"df":2}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.47213595499958}},"df":7}}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/background/addition/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0},"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.0},"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0},"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":68}},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.4641016151377544}},"df":10,"/":{"docs":{},"df":0,"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3},"t":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":4}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":9,"/":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":5}}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/":{"tf":1.0}},"df":6}}}}},"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":12,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.7416573867739413}},"df":3}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907}},"df":7,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772}},"df":2}}}},"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"g":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/background/addition/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0},"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.0},"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0},"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":70}},"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}},"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":2.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":3}}},"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":5,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772}},"df":1}}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":3}}},"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}},"h":{"docs":{},"df":0,"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":4}},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":1}},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3},"t":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":2}}}}},"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1,"/":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":2}}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":4}}},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2},"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/background/addition/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0},"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.0},"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0},"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":66,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3}}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":4}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}}}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":2}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}},"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":2}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":3}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":2}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":3}},"o":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":4}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3,"(":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}},"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0}},"df":2}}}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.4641016151377544}},"df":3}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":3}}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":3.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.69041575982343},"https://alchitry.com/tutorials/projects/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0}},"df":12,".":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"/":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3}}},"i":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951}},"df":1},"s":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":4}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2}},"w":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}}},"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":1}}},"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"d":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3,"/":{"docs":{},"df":0,"w":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"z":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":5}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}}}}},"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":2}}}}}}},"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.449489742783178}},"df":3}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":1}}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}},"o":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":1}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":3,"(":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}},"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":4},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.8284271247461903}},"df":1}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/background/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/setup/":{"tf":2.23606797749979}},"df":7}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":2,"_":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}}},"i":{"docs":{},"df":0,"z":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":2}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":3}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":5}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.449489742783178}},"df":1}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}}}}}}}},"w":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":6,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951}},"df":5}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}}},"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0}},"df":2},"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":1,"_":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":1}}}},"u":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":10}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":7}},"s":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0}},"df":2}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":4,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":7,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.7320508075688772}},"df":2,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}}}},"g":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":1,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":2}}}}}}},"n":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":3}}},"v":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0}},"df":2}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.605551275463989},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":6,"u":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0}},"df":11}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0}},"df":1}}},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":2.0}},"df":1}}}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":6,"n":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772}},"df":2}},"g":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":1,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.449489742783178},"https://alchitry.com/news/lucid-v2/":{"tf":2.449489742783178},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.123105625617661}},"df":7,"'":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":6,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3,"f":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":4.795831523312719},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.8284271247461903},"https://alchitry.com/news/lucid-v2/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":9}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":7}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"x":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1},"z":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.449489742783178},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":4}}},"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":1}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772}},"df":2}}}}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":1}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":6},"i":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}},"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":5}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}},"f":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":4.242640687119285}},"df":4}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}}},"i":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":1,"_":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}},"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.8284271247461903}},"df":5}},"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0}},"df":5,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":2}}}}}},"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":6}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":8}}},"o":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":2}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}}}}}}}}},"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.449489742783178}},"df":3}},"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":3}},"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}},"y":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951}},"df":1}}}},"u":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951}},"df":1}}}}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0}},"df":1}}}}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"f":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}}}},"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":3}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":7}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.0}},"df":3}}},"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}}},"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.449489742783178}},"df":2}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0}},"df":3}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":4}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":1}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":3},"g":{"docs":{"https://alchitry.com/tags/":{"tf":1.0}},"df":1},"k":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":4}},"l":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772}},"df":2}}}},"s":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":2.8284271247461903},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":4.123105625617661},"https://alchitry.com/news/lucid-v2/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0}},"df":8,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":2}}}}}}},"x":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":6,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"'":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":3}}},"y":{"docs":{},"df":0,"'":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":8},"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":4}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":3,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":4}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":2}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":4,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}}}}}},"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.8284271247461903}},"df":3,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}}}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0}},"df":11}}},"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"o":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/tutorials/background/addition/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0},"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/projects/":{"tf":1.0},"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.0},"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0},"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":63}},"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2}}},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951}},"df":1}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":3},"o":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/setup/":{"tf":2.0}},"df":6,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}}},"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178}},"df":4},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951}},"df":1}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}},"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":6,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.0}},"df":2}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/background/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.8284271247461903},"https://alchitry.com/tutorials/verilog/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":7}}}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}},"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":5}},"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":2.8284271247461903},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":4},"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":3.0}},"df":2},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"/":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772}},"df":1}}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}}}}}},"k":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/background/addition/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0},"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.0},"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0},"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":64}}}},"p":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.3166247903554},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":8,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951}},"df":5}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"s":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":3.0},"https://alchitry.com/news/lucid-v2/":{"tf":3.4641016151377544},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":5.477225575051661},"https://alchitry.com/tutorials/setup/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/verilog/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0}},"df":14,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}},"b":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/":{"tf":1.0},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":7},"2":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"tf":1.0}},"df":12,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":2}},"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":3.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":3.605551275463989},"https://alchitry.com/news/lucid-v2/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":5.744562646538029}},"df":9}},"r":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":2.0}},"df":1,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":5,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/verilog/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":8}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772}},"df":7}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2},"e":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":2}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/tutorials/background/addition/":{"tf":1.0},"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0},"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.0},"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0},"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":61}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0}},"df":4,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}}}},"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951}},"df":1}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":2}},"l":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":6}},"r":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":3}},"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":3}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":2.0}},"df":1,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}}}},"y":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.3166247903554}},"df":8}},"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.7320508075688772}},"df":6}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":1}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951}},"df":1},"e":{"docs":{},"df":0,"v":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.4142135623730951}},"df":2}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.23606797749979}},"df":2},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":2.6457513110645907},"https://alchitry.com/news/lucid-v2/":{"tf":1.7320508075688772},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":3.4641016151377544},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0}},"df":4,"o":{"docs":{},"df":0,"f":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2,"(":{"docs":{},"df":0,"m":{"docs":{},"df":0,"y":{"docs":{},"df":0,"f":{"docs":{},"df":0,"s":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1,".":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}}}}}}},"{":{"docs":{},"df":0,"8":{"docs":{},"df":0,"b":{"docs":{},"df":0,"0":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":1}}}}}}}}}},"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}}}},"n":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.449489742783178},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.6457513110645907},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":2.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":7,"'":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":3}}}}},"p":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/":{"tf":1.0}},"df":4}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1},"k":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.7320508075688772},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":2.23606797749979},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":2.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":2.8284271247461903},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/news/lucid-v2/":{"tf":2.23606797749979},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.0}},"df":12,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":2}}}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1}}}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.4142135623730951},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.449489742783178},"https://alchitry.com/tutorials/setup/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0}},"df":7},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":4}}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":2}}}}},"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907}},"df":2,"6":{"docs":{},"df":0,"4":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":2.0}},"df":1}},"d":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/":{"tf":1.4142135623730951}},"df":3,"/":{"docs":{},"df":0,"1":{"docs":{},"df":0,"4":{"docs":{},"df":0,".":{"docs":{},"df":0,"7":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"/":{"docs":{},"df":0,"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,".":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}},"y":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"'":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.4142135623730951}},"df":3}},"r":{"docs":{"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":3},"v":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"_":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0}},"df":2}}}}}}}}}}}}},"z":{"docs":{"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.6457513110645907}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.4142135623730951},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":2.0}},"df":2}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1}}}}}},"title":{"root":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0}},"df":2},"2":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":2},"3":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/background/addition/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/boards/au/":{"tf":1.0},"https://alchitry.com/boards/br/":{"tf":1.0},"https://alchitry.com/boards/cu/":{"tf":1.0},"https://alchitry.com/boards/ft/":{"tf":1.0},"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":13}}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0}},"df":1}}}}}}}},"u":{"docs":{"https://alchitry.com/boards/au/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0}},"df":1}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/background/":{"tf":1.0}},"df":1}}}}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/boards/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://alchitry.com/boards/br/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/tutorials/projects/clock-clock/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/components/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0}},"df":2}}}},"u":{"docs":{"https://alchitry.com/boards/cu/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"3":{"docs":{"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0}},"df":1}}}}}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/background/encodings/":{"tf":1.0}},"df":1}}}},"x":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0}},"df":2}}}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0}},"df":2}}}},"p":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0}},"df":5}}},"s":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0}},"df":2}},"t":{"docs":{"https://alchitry.com/boards/ft/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"u":{"docs":{"https://alchitry.com/tutorials/projects/gpu/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"d":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0}},"df":3}}},"x":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/projects/hexapod/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"2":{"docs":{"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0}},"df":1}}}}}}},"n":{"docs":{},"df":0,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":4}}}}}}},"o":{"docs":{"https://alchitry.com/boards/io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"tf":1.0}},"df":5},"s":{"docs":{"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://alchitry.com/alchitry-labs/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0}},"df":7}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://alchitry.com/tutorials/background/combinational-logic/":{"tf":1.0},"https://alchitry.com/tutorials/background/digital-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0}},"df":5}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0}},"df":5}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0}},"df":1}}},"j":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{"https://alchitry.com/tutorials/background/multiplexers/":{"tf":1.0}},"df":1}}}}}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://alchitry.com/news/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"tf":1.0}},"df":1}}}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"tf":1.0},"https://alchitry.com/tutorials/projects/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"tf":1.0}},"df":5}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"s":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"tf":1.0}},"df":2}}},"s":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"tf":1.0}},"df":2}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":2}}},"v":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://alchitry.com/tutorials/setup/":{"tf":1.0},"https://alchitry.com/tutorials/setup/icecube2/":{"tf":1.0},"https://alchitry.com/tutorials/setup/ise/":{"tf":1.0},"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0}},"df":4}}}},"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/tutorials/background/subtraction/":{"tf":1.0}},"df":1}}}}}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"tf":1.0}},"df":3}}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tags/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://alchitry.com/tutorials/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0}},"df":5}}}},"s":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"1":{"docs":{"https://alchitry.com/tutorials/lucid-1-vs-2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/":{"tf":1.0}},"df":2},"2":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-cli/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"tf":1.0},"https://alchitry.com/news/alchitry-labs-v2/":{"tf":1.0},"https://alchitry.com/news/alchitry-loader-v2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-1/":{"tf":1.0},"https://alchitry.com/news/lucid-v2-update-2/":{"tf":1.0},"https://alchitry.com/news/lucid-v2/":{"tf":1.0},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"tf":1.0}},"df":10,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://alchitry.com/tutorials/verilog/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"tf":1.0}},"df":2}}}}}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{"https://alchitry.com/tutorials/setup/vivado/":{"tf":1.0},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"tf":1.0}},"df":2}}}}}},"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"d":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"_":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"tf":1.0},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"tf":1.0}},"df":2}}}}}}}}}}}}}}}},"documentStore":{"save":true,"docs":{"https://alchitry.com/":{"body":"","id":"https://alchitry.com/","title":""},"https://alchitry.com/alchitry-labs/":{"body":"Download the V2 preview.\nTODO: Visit the old page until this is ported\n","id":"https://alchitry.com/alchitry-labs/","title":"Alchitry Labs"},"https://alchitry.com/boards/":{"body":"","id":"https://alchitry.com/boards/","title":"Boards"},"https://alchitry.com/boards/au/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/boards/au/","title":"Alchitry Au"},"https://alchitry.com/boards/br/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/boards/br/","title":"Alchitry Br"},"https://alchitry.com/boards/cu/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/boards/cu/","title":"Alchitry Cu"},"https://alchitry.com/boards/ft/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/boards/ft/","title":"Alchitry Ft"},"https://alchitry.com/boards/io/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/boards/io/","title":"Alchitry Io"},"https://alchitry.com/news/":{"body":"","id":"https://alchitry.com/news/","title":"News"},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"body":"Version 2.0.5-Preview of Alchitry Labs is now available. It now supports simulating the main Alchitry boards as well as the Io Element.\n\n\nSimulation Setup#\n\nMinimally, if your design connects to the CLOCK pin on the Alchitry board, you can click the little bug icon in the tool bar. This will open up a tab that will show a virtual version of your Au or Cu.\nIf you also connect to the RESET pin or the LED0 through LED7 pins, the main board will also simulate those.\nBy \"connect\" I mean that you have valid pin constraints for them in your .acf file.\nWith these connected, you can write your design how you normally would. However, when you click the \"bug\" the simulation will start almost immediately.\n\nHere's a GIF of a counter running on the board. Note that I have the simulation speed set way down so you can easily see the LEDs blinking.\nWhen writing this I discovered a bug in 2.0.5 that prevents you from setting the speed really low (~20Hz or less) where it just doesn't do anything. It's fixed and will make it into the next release.\nWhat's really cool about the simulation is that the LED state isn't just on or off. It actually keeps track of all the values from the previous frame and averages them to allow for PWM.\n\nHere's the classic wave pattern that the Alchitry boards ship with being simulated.\nThis fake persistence of vision effect was important when implementing the 7-segment digits on the Io Element. These are multiplexed so you typically only have one of the four lit at any given time.\nThis is all accurately simulated and you can see in the first screen shot an example of it showing some numbers.\nThe buttons and switches are also all intractable. Clicking on a button momentarily presses it while click on the dip switch toggles it.\nWhen the simulator detects that your design is connected to all the signals of the Io Element, it'll stack one on top automatically.\nControlling the Simulation#\n\nIn the simulation tab, there is a toolbar with a couple of buttons and a text box for controlling the simulation.\nThe first button lets you play/pause the simulation.\nWhen the simulation is paused, you can enter a target into the \"Target Rate\" field. This is the number of cycles per second the simulator will attempt to hit.\nIt may not be able to actually hit your target depending on your design and computer.\nWhen the simulation is running, in the top right you can see the actual simulation rate.\nFor example, my computer is able to hit about 3,200 Hz when running the wave and Io demo.\nReplacing the fancy wave pattern with a basic counter, I can hit about 13,800 Hz. \nThe repeat loop in the wave pattern module is relatively slow to simulate as it can't be parallelized in simulation. Each always block runs in it's own job so many always blocks can be run in parallel but a single always block can't be.\nBack to the simulator, the last button is the reset button. This just simple resets your design as if you power cycled it.\nNext Steps#\n\nI'm now pretty happy with the simulator. I put a ton of work into getting it to run faster and got about 4x the performance from where I started.\nIt's kind of hilarious to see all 32 monster cores of my desktop struggling reach 100 Hz in some benchmarks when the real FPGA does it all at 100,000,000 Hz with room to spare.\nObviously, this type of simulation is no substitute for actually running stuff on the board. However, with the addition of the Io Element, I hope it'll let some people get into digital design by lowering the barrier to entry just a little more.\nPlease let me know if you try it out and what you think! You can email me at justin@alchitry.com or post on the discussion page.\nNext, I'll be working on the quality of life features of the IDE. \nYou can already format you code with Ctrl+Alt+L but stuff like auto-indenting on new lines needs to be done.\nI also plan to create a robust auto-complete feature. The old one wasn't awful, but it wasn't context aware and would recommend things that would auto-complete into an error.\nThere's also a known bug where the cursor position will get a little messed up. Hitting Ctrl+Alt+L works as a workaround but I need to track down what's causing it.\nUntil next time!\n","id":"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/","title":"Alchitry Labs V2.0.5 - Simulations"},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"body":"It has been a while since I last wrote about the progress on Alchitry Labs V2 and a lot has changed.\nBuild Tools#\n\nI've spent a good amount of time working on building out the Gradle build script so that the deployment process will be much easier than it was for Alchitry Labs V1.\nWhen I was looking for a way to create the Window's installer, I discovered that Compose Multiplatform has a built in packaging tool!\nIt turns out that this still has the major downside of needing to be running on the OS that you want to package for. This means you can't build an installer for Windows from Linux. Bummer, but not the end of the world.\nI ran into two other issues when flushing out the build script. First, Compose's build tools only support creating one launcher per application. I need to create two. The main one to launch Alchitry Labs and the second to launch the Alchitry Loader.\nThese two programs are actually the same thing with just a different argument passed to them to show a different GUI.\nIt turns out that jpackage, the tool used by Compose, has a way to add additional launchers but Compose currently gives no way to access it. I add the support I needed, I forked the Compose plugin and submitted a pull request.\nFor now, I'm using my local forked version of the Compose plugin, but hopefully they'll accept the pull request or make some similar changes to allow creating additional launchers.\nCommand Line Interface#\n\nSomething I often get emails about is for command line support in Alchitry Labs. Well, I'm happy to announce that the command line interface for Alchitry Labs V2 will be well supported.\nI've decided to get everything working via the command line before diving too much into the GUI.\nRight now, the loading tools already work. So if you've been looking for a way to load your Alchitry boards from the command line, check out the very early releases below.\nThe command line is broken into a bunch of subcommands.\n\nIf you install the .deb on Linux, you'll get access to the alchitry command.\nOn Windows, the Alchitry.exe executable in the installation directory can be used.\nYou can run --help on each subcommand for more info.\n\nFor example, you can load a .bin file like this.\n\nIf you try this out, let me know what you think over at the discussions page.\nReleases#\n\nThese aren't really a \"release\" as much as just something you can try and mess around with.\nThat being said, the loading features should be fully working.\nLinux Deb\nWindows Installer\nThe Labs GUI will open but it doesn't really do much. It is basically just a test right now for the custom text editor.\nThe Loader GUI doesn't open/exist at all yet.\nThe command line tools work for creating and simulating projects as well as loading .bin files.\n","id":"https://alchitry.com/news/alchitry-labs-v2-cli/","title":"Alchitry Labs V2 - Command Line Interface"},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"body":"Today was the first time I built a .bin file from Alchitry Labs V2!\nBefore we get too far ahead, there is a lot more to cover.\nIn the last release, I use the Compose Multiplatform Gradle plugin to create native distributions.\nAt first, this seemed like an awesome solution. However, it has one fatal flaw.\nThe plugin requires you to build each target on its respective platform. That means if you want to build for Windows, you need to be on Windows. If you want to build for an ARM based Mac, you need to have an ARM based Mac.\nThis requirement was the same issue I had before with the original Alchitry Labs but it wasn't that bad since I only ever built for Windows and Linux X64. I was able to do everything from Linux using a Window VM.\nThis time around, I want to add support for more systems. Alchitry Labs runs on a JVM (Java Virtual Machine) so in theory it should run in a ton of places with minimal work.\nI'm hoping to target everything that Compose supports, Windows x64, Linux x64, Linux ARM, Mac x64, and Mac ARM.\nWhen looking for solutions to this, I came across Conveyor which seems to be almost everything I was looking for. Best of all, it is free for open source projects like Alchitry Labs!\nConveyor lets you build for every target from a single system. It also deals with code signing and pushing updates.\nThe only downside right now is that it doesn't support Linux AArch64 (ARM). I became a paid subscriber to get this feature onto the dev's radar and I was told it will likely make it into the next major release.\nNow that I have this all setup, I can run a single command that builds my project, creates update packages, creates an update website, and pushes it all to GitHub.\nYou can now download the latest version from the GitHub page here\nI'm currently just self signing everything. This only really matters for Windows and Macs where you'll see more security warnings when trying to install it.\nI'll likely get everything officially signed for the next release. For the Window's release, this means that it'll be available from the Microsoft Store.\nThe Linux version is now packaged as a deb which makes installation so much easier! Installing the deb also adds an update site so that when updates for Alchitry Labs are available they show up in the package manager with everything else.\nMac Support#\n\nAs I've mentioned above, the new releases have Mac versions.\nBefore you get too excited, no, you still can't run Vivado or iceCube 2 on a Mac. This means that you still can't build FPGA projects using the proprietary tools.\nSo why bother supporting Macs? First, many people run the build tools inside of virtual machines inside a Mac. USB devices don't always play nicely going across the VM layer so by having native support for the Alchitry Loader, we can avoid that issue.\nThe Mac versions of the loader are already working!\nSecond, there are open source tools that can run on a Mac. I'm hoping to bundle these with a later release of Alchitry Labs so that you will be able to develop for the Alchitry Cu natively on a Mac.\nThe New Verilog Converter#\n\nThe biggest update to the Alchitry Labs V2 codebase is the Verilog converter.\nContinuing with the full rewrite, the new converter is much cleaner than the old one. The original converter was one of the first things I wrote back when the IDE was the \"Mojo IDE.\"\nBack then, the converted was responsible for everything. Given some Lucid text, it had to spit out a Verilog version.\nThe new converted is instead given a fully parsed Lucid module instance. A lot of the complicated tasks are already done in the previous stage such as dealing with signal indexing, declarations, etc.\nThis, along with better coding practices, has made the new converter about 40% of the size of the original! I'm pretty excited for it.\nACF Parser#\n\nWith a Lucid->Verilog translator working, the next step was to add support for constraint files.\nThe Alchitry Constraint File format is super simple and adding a parser for it wasn't too complicated.\nI ended up modifying the format a bit from V1 though. \nKeeping with the change to Lucid, semicolons are now optional. Also, clock statements are considered a special type of pin statement so you don't need to specify both for a single pin.\nIt now checks that the names of the ports and pins are valid. Wildly, I apparently never checked the pin names properly for V1 so they would just show up as \"null\" in the converted constraint file and cause silent issues.\nFor now, I just have an ACF->XDC converter (XDC is the Xilinx format).\nTest Build#\n\nWith all the pieces in place, I was able to get a test build running.\nOnce a project is open, calling Project.build() simply builds the entire project!\nThis only works for the Au/Au+ right now as I still have to port the Cu builders but it is a big milestone!\nBuilding Au projects is accessible from the command line interface now.\nIf you want to check out the progress, see the GitHub page.\nYou can install the latest version here.\n","id":"https://alchitry.com/news/alchitry-labs-v2-update-1/","title":"Alchitry Labs V2 - Update 1"},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"body":"It's been a while since I've posted an update and a lot has happened. Most of the work I've been putting into Alchitry Labs has been for the new GUI.\n\nAs I've mentioned in a previous blog post, this time around I'm using Compose Multiplatform for creating the UI instead of the now very old SWT.\nCompose is fundamentally different from SWT and allows for a lot more freedom in creating a beautiful UI. However, since Compose for desktop is so new, there are some growing pains I've had to overcome.\nCode Editor#\n\nOne of the first things I did when starting the Alchitry Labs rewrite was to see if I could make a text editor perform well with Compose. The built in TextField widget is fine for small text fields but falls apart for something as complicated as a code editor.\nCompose exposes various levels of abstraction you can dig into depending on what you want to accomplish. I jumped a few layers down and created my own code editor composable. \nThe most important difference between my code editor and the built in TextField is that my code computes the layout of each line individually instead of the entire block of text. The big upside to this is that when text is being edited I only need to compute the lines that change instead of every single line.\nThis makes editing text fast no matter how big the file is.\nThere was a lot of complexity added to make this work but the payoff was worth it.\nIn addition to performance, I was able to add some additional features that are nice to have for the code editor, such as the line numbers in the gutter. These are even flexible so I can potentially later add stuff like icons if needed.\nTextField also doesn't provide any way to draw a background color behind text so I had to add this custom. This allows for highlighting the token the cursor is on as well as all matching tokens. \nTabs#\n\nThe next major UI hurdle was making the editor tabs work. I already had written a sash composable that would allow me to split a section into left and right or top and bottom resize-able areas (I needed it already for the main layout). However, I wanted to make splitting the editor be as easy as dragging a dropping the tab to where you want it.\nAgain, compose gives you plenty of tools to do this and I had already done something similar for a different project that I was able to steal most of the code from. With some modifications I ended up where it is now where you can not only drag and drop the tabs to rearrange them but drag them top any side of the window to split it.\nThis is definitely a step up from the previous version that requires you to split then window then drag the tab over.\nProject Tree#\n\nThis is something that still needs some work, but one of the new features is that file names in the tree are color coded based on their state (yellow = has warnings, red = has errors).\nThis was possible because the way projects/files are checked for errors is fundamentally different than before.\nWhen a file is changed, an error check is queued. The error check first parses all the project files for errors like syntax errors. Then starting from the top module, the project is parsed as a tree through the module instances.\nThis allows for a thorough check of the modules using actual parameter values. \nSome of this could be improved in the future such as caching some of the results for files that haven't changed, but even as it is now it is quite fast.\nIt currently doesn't fully check modules that fall outside the project tree (in other words, modules that are in the project but not used). I'll add this in a later update.\nLabs and Loader#\n\nAlchitry Labs and the Alchitry Loader now share one executable/launcher. This was done because it isn't possible to create two launchers with one installer on macOS.\nInstead, when you open Alchitry Labs, it'll open whatever you were using last.\nTo switch between Labs and the Loader, you simply click the Alchitry logo in the top left and choose \"Switch to X\"\nI have a feeling that most people are using either one or the other and don't often switch between the two. If this isn't you, let me know on the discussion page.\nTest It Out#\n\nThere is still a lot of features missing, but if you would like you can download the latest version here.\nEverything should be there to make a simple project, build, and load it to any of the Alchitry boards.\nThis also means you should be able to use this to build projects for the Alchitry Cu on a Mac.\nNext Steps#\n\nThe code editor needs many quality of life improvements such as auto indenting/formatting, auto-complete, support for Verilog, error checking for ACF files, support for Xilinx and Lattice constraint files, context menus (right click), and I'm sure endless more.\nI need to also add in the component library, port the project templates to Lucid V2, and add back in support the Vivado's IP catalog.\nI also need to build the front end for running simulations. All the code is there to actually run it, there just isn't currently a way to conveniently start it or view the results. This will likely be my first next step.\n","id":"https://alchitry.com/news/alchitry-labs-v2-update-2/","title":"Alchitry Labs V2 - Update 2"},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"body":"Simulations are now supported!\n\nTest Benches#\n\nThe new update, 2.0.4-PREVIEW, now has the first draft of the\nsimulation GUI.\nTo run a simulation you need to first create a test bench.\nI've covered these before when you could first run them from the command line so make sure\nto check that out if you haven't already.\nThere's been an addition to the $print function though. You can still pass it a signal directly for the old behavior,\nbut you can now pass in a formatting string followed by the values to use.\nThis is similar to something like printf in C/C++.\nThe function call looks something like $print(\"my value is %d\", mySig) where mySig is the signal to print in decimal\nwhere the %d is.\nThe format options are \"%d\" for decimal, \"%b\" for binary, \"%h\" for hexadecimal, and \"%nf\" for fixed point where\nn is the number of fixed fractional bits (for example \"%2f\").\nRun the Test#\n\nIn the code editor, when it detects a test, there is an arrow in the left hand gutter on the line where the test was\ndeclared. You can click this arrow to run that test.\nAlternatively, clicking the bug icon in the toolbar will run every test.\nThe results of the test are printed to the console and a new tab is opened displaying the resulting values captured at\neach $tick().\nThe waveform viewer is currently pretty basic but its enough to start messing with it.\nYou can use the mouse wheel to zoom and click/drag to pan around.\nThe values at your cursor are show as an overlay.\n","id":"https://alchitry.com/news/alchitry-labs-v2-update-3/","title":"Alchitry Labs V2 - Update 3"},"https://alchitry.com/news/alchitry-labs-v2/":{"body":"I am now starting to work on the UI of the Alchitry Labs rewrite!\nAlchitry Labs currently use UI toolkit, SWT. \nThis is the UI toolkit developed and used by Eclipse.\nAt the time I started working on what was then the Mojo IDE, SWT was a solid choice.\nIt allowed me to create a single UI that worked on Windows and Linux with minimal effort, and it looked native on both\nplatforms.\nHowever, it hasn't aged super well.\nI found it to be fairly limited when trying to do anything custom.\nFor example, I wanted the project tree on the left side of the window to stay the same size when you resized the window.\nThe main code editor should be the only thing that changes size to accommodate the new window size.\nSWT doesn't allow for this, and instead you specify the size of each side as a percent.\nMy workaround was to recalculate the percentages every time the window size changes to keep one side a fixed size.\nThis mostly works, but if you resize the window a lot, you may notice the divider jumps around due to rounding errors.\nIn newer versions of SWT, something changed/broke that broke the tooltip window from popping up when hovering over an\nerror in the text editor.\nI spend a stupid amount of time trying to figure out a fix for this before giving up and sticking with an old version\nof the library.\nThis annoyingly prevents other bugs from getting fixed though.\nOne of the worst offenders is the undo/redo bug in the current Alchitry Labs. \nI've spent days trying to get the undo/redo function to be reliable, but for whatever reason, the way SWT handles the\nedit events have prevented me from getting it to always work. V2 already has a fully reliable undo/redo working.\nTLDR, I'm moving to something else.\nJetpack Compose#\n\nIf you do any UI work and haven't tried Jetpack Compose you're \nmissing out.\nThis is a declarative UI framework originally developed for use on Android, but it has since made its way onto more \nplatforms including desktop.\nI find it a joy to use, and it doesn't lock you into anything allowing me to create whatever custom UI elements or \ntweaks I need.\nUnfortunately, the built-in text editor (TextField) has terrible performance if you are trying to edit any decent amount\nof text.\nThis led me to write my own custom editor that has solid performance for thousands of lines of code.\nWhile this was a substantial amount of work, it also opens up potential in the future for doing cool tricks like \ncollapsable blocks. This was impossible with SWT.\nLucid Parser#\n\nI've also implemented the snapshots for $tick and added $silentTick which skips the snapshot step.\nThe snapshots get compiled into a simulation result that holds the value of every signal in the design for every call\nof $tick.\nThis will allow the UI to display the results of the entire simulation.\nThe Repo#\n\nThe Lucid Parser repo has been renamed to Alchitry Labs V2 and now \ncontains the UI and parser code. \nThis is where all the progress can be found.\nThere is a discussion page, or you can \nemail me and let me know your thoughts.\n","id":"https://alchitry.com/news/alchitry-labs-v2/","title":"Alchitry Labs V2"},"https://alchitry.com/news/alchitry-loader-v2/":{"body":"The Alchitry Loader portion of the Alchitry Labs V2 rewrite is mostly done!\n\nThe new loader automatically detects connected boards and lists them in a drop down. This allows you to have more than one board connected without conflict.\nUnder the hood, it now also handles the D2XX driver a bit more elegantly. It first tries to load the proprietary D2XX library (libd2xx) and if it fails, it falls back to the open source libUSB driver.\nOn Windows, you'll almost always be using D2XX from FTDI. However, on Linux, libUSB is the default but you can install libd2xx and it'll be detected and used.\nThere are still a few weird kinks to work out but it is overall usable (and an improvement over the old one).\nOn Windows, I haven't been able to figure out how to configure the installer to not install a shortcut for the command line interface version of the launcher. After running the installer, you'll see a shortcut called \"alchitry\" which doesn't seem to do anything. This is the command line interface launcher.\nThere seems to be a bug in jpackage that ignores the value of the --win-shortcut option and always makes shortcuts. I'll have to dig into more eventually.\nOn Linux, I've been having a hard time getting the window's icon to be set correctly. On Gnome, it seems to be working but on Ubuntu (22.04) it shows the default Java icon and has some kind of secondary ghost window that you can't focus.\nInstallers#\n\nWindows Installer\nLinux Installer\n","id":"https://alchitry.com/news/alchitry-loader-v2/","title":"Alchitry Loader V2"},"https://alchitry.com/news/lucid-v2-update-1/":{"body":"I just pushed what I believe is the last piece of the core Lucid 2 rewrite.\n\nSince the last update, I added $widthOf(), $fixedPoint(), $cFixedPoint(), and $fFixedPoint() functions.\nThe $widthOf() function takes one argument and returns its width (number of bits). If the value is an array, the \nreturned value is also an array with each entry the width of the dimension. \nFor example, $widthOf({8b0, 8b1}) will return an array {8, 2} since the first dimension has two elements and the \ninner dimension has 8. Remember that in Lucid (and all HDLs) arrays are indexed right to left to match bit numbers\ninstead of left to right like most programming languages.\nIf you read the original post, you may remember for enums I presented the syntax\n$widthOf(myFSM) to get the width of the enum. I ended up scrapping this since passing myFSM as an argument would \nbe a weird exception since you can't use enums directly anywhere else. Instead, I added the .WIDTH constant just to \nenums. So you can now get the width of an enum by using myFSM.WIDTH or $widthOf(myFSM.INIT) (where INIT is any \nmember of myFSM).\nFixed Point#\n\nThe fixed point functions work as expected. The basic one, $fixedPoint(), takes three arguments, the value to convert,\nthe total width, and the fractional width. It returns the fixed point value that is closest to the given value.\nThe function $cFixedPoint() takes the same arguments but returns the closet value that is greater than or equal to\nthe given value.\nThe function $fFixedPoint() is the same but returns the closet value that is less than or equal to the given value.\nInterfaces#\n\nI attempted to implement interfaces, but along the way I discovered they were just too complicated to add at this point \nfor what I believe to be a relatively niche feature.\nThey presented many weird cases that would be difficult to deal with such as an array of modules that used an interface.\nIn the end, I decided using structs was a decent compromise to the added complexity.\nNext Step#\n\nThe next step is to add test benches. I think I have most of this flushed out in my mind (again refer to the \nprevious post for details) but now it's time to get it down in code.\nI don't anticipate this being too difficult to write since the groundwork for simulations is already all there. In \nmy tests\nI've already simulated modules of counters.\nOnce that's done, it'll be on to creating the Verilog translator.\nAs before, there is a discussion page setup as part of the repo\nwhere you can let me know your thoughts.\n","id":"https://alchitry.com/news/lucid-v2-update-1/","title":"Lucid V2 - Update 1"},"https://alchitry.com/news/lucid-v2-update-2/":{"body":"Test benches are here!\nI just pushed a working draft of the test bench code that has the necessities for writing quick tests for you modules!\nTest Bench Example#\n\nTake a look at this revolutionary counter module I created. \n\nI designed it so that the output count will increment by one on every rising edge of the clk input. However, does \nit actually work?!? There's no way to know. Oh wait, we could test it.\nHere is my test bench that does just that.\n\nThe insides of a testBench are very similar to a module with a couple of key differences. There are no ports\nor parameters and instead of always blocks you use test and fun blocks.\nOn line 2, we create a signal named clk that will act as our clock.\nOn line 4, we instantiate the device under test or \"dut\". It is convention to call the module being tested \"dut\" but \nthere is nothing special about the name.\nNext, we have our function declaration. Functions have the same properties as tests, but they aren't run directly. \nInstead, functions are little pieces of helper code that can be called from tests.\nHere I defined the very common function of toggling the clock and called it tickClock. This function doesn't have any\nparameters, but it could.\nFor example, we could give it a parameter to repeat a specified number of times.\n\nFunction arguments act the same as module inputs and can be multidimensional arrays or structs.\nTest Bench Functions#\n\nBefore we move on, let me quickly go over the couple of test bench specific functions that I'm using.\nThe function $tick() is at the very core of the simulation. It initiates a simulation tick. So what is a simulation\ntick? This is when the simulator publishes all signal changes and recalculates the outputs for all the pieces in the \ndesign whose input signals changed. Those output changes then trigger other updates if they are used as inputs. This \ncontinues until the results of everything stabilize.\nThe only time it won't stabilize is if you have some kind of dependency loop like a = b and b = ~a. In this case, \nthe simulator will quit after 1000 iterations. I chose this number as a seemingly nice upper bound, but it may change if\nI find designs often need more or fewer iterations. A loop like this would result in faulty hardware, and anything \nrequiring too many iterations to resolve would likely be too complicated to do in a single real clock cycle.\nSo back to the test bench. Before we call $tick(), first we need to set a value to all signals we are using. Signals \ndefault to having a bx value so bad things will happen if we call $tick() before setting a real value. By bad things,\nI mean that bx value will propagate throughout the design contaminating our counter.\nWith clk set to 0, we call $tick() to initialize the design.\nNext, we hit a repeat block that will repeat its contents 100 times and use the signal i as the iteration index.\nThe first line in the loop prints the value of dut.count using the $print() function. This function takes one\nargument, the value to print. It currently outputs the value in the format dut.count = {00011100} : 28 where the value\nis shown in its binary form as well as its decimal value (if it has one).\nThe next line uses the $assert() function to check that the value of the counter matches the loop iteration we are on.\nThe argument to $assert() can be anything, and it is treated as a boolean. That means if it is non-zero, nothing \nhappens, but if it is zero, the simulation is aborted and the $assert() that caused it is called out.\nThis is very useful for checking values quickly without having to look back through the simulation manually to see if \nvalues make sense.\nThe last line in the loop is the call to the function $tickClock() that we already defined.\nFinally, we end our test by checking that the counter output is 100 after the 100 cycles.\nThis example is from one of the tests and can be found in the \nrepo here.\nNext Step#\n\nThe next step is to add snapshots of the entire design every time $tick() is called. This will allow for the \nsimulation results to be shown after it is run. Currently, it just runs discarding all intermediate values.\nI also plan to have a $silentTick() or similarly named function that does a tick without taking a snapshot. This way\nyou can use that when making the clock fall for most designs and avoid the overhead of an entire snapshot.\nAs before, there is a discussion page setup as part of the repo\nwhere you can let me know your thoughts.\n","id":"https://alchitry.com/news/lucid-v2-update-2/","title":"Lucid V2 - Update 2 - Test Benches"},"https://alchitry.com/news/lucid-v2/":{"body":"A full rewrite of the Lucid parser in Alchitry Labs has been a long time coming.\n\nThe current parser has had feature after feature crudely bolted on to a shaky foundation. It was originally only written\nto convert Lucid into Verilog. Later, error checking for signal widths was added. Then full parsing on constant values\nwas added. Then parsing of non-constant values was kind of added. Then... then... then...\nA lot of the code is confusing and many sections are redundant. On top of that, null checks weren't my specialty and\nI often forgot to check when something could've been null resulting in a crash when bad syntax was entered.\nThe new parser is fixing all this while adding many more features. It is written in Kotlin which largely fixes null \nchecks by having null safe types built into the language.\nBreaking Changes#\n\nI'm also taking this opportunity to reimagine some aspects of Lucid. Because of this, Lucid 2 will break compatibility\nwith the original Lucid.\nFor example, currently you can use the .WIDTH property of signals in Lucid to access their dimensions (number of bits).\nIn Lucid 2, this is getting replaced by the $widthOf() function. This will allow you to not only get the widths of \nsignals but also expressions. It also helps clean up the internal code when resolving signals.\nThe fsm type is being removed and being replaced with enum. The fsm type was kind of a strange type in that it \nreally was just a dff with an associated set of constants. The new method is to use enum to declare a set of \nconstants and use a dff to hold them. Here's an example.\n\nThis simplifies things by making dff the only sequential type.\nThe eagle eyed among you may have noticed that there aren't any semicolons in the above code snippet. Semicolons are\noptional in Lucid 2. \nThe var type is also being removed. The only real use for the var type was in for loops which you could still use\na sig type for. It wasn't particularly intuitive as it had the size of a computer Int when everything else a single\nbit.\nSpeaking of for loops, these are replaced with repeat blocks. These have the syntax repeat(count, var) { ... } \nwhere count is the number of times to repeat the block and var is the name to use for the current iteration index.\nThis signal is automatically generated for you and you don't need to declare it somewhere else. It is only visible \ninside the repeat block.\nThere are a handful of other minor changes. When declaring a dff or sig, you can now only declare one per line.\nDeclaring multiple off the same keyword was rarely used and often made the code harder to read. Removing this also\nmade the backend code cleaner.\nThe struct portion of a declaration was moved after the array indices. An old dff declaration with that\nused a struct used to look like this dff<myStruct> myDff[8] (.clk(clk));. It now looks like this \ndff myDff[8]<myStruct> (.clk(clk)). The original style was based on generics in languages like Java, but the new style\nfits better with how you actually index the values. It makes it much clearer that myDff is an array of structs.\nNew Additions#\n\nThere will be some new functions to help when working with fixed point numbers. I haven't nailed all these down yet but\nsomething along the lines of $fixedPoint(3.14159, 8, 4) will generate an 8-bit wide number with 4 bits used for the\ndecimal (aka 8b00110010) that is the closest approximation to the 3.14159. There will also be ceiling and floor \nversions that generate the closet value above or below the given value respectively.\nI'm also planning to implement interfaces. These will basically be like struct but each member will have a direction\nassociated with it. I found myself often creating two struct where one would be for inputs and one would be for \noutputs. For example, the memory.in and memory.out structs used by the \nDDR interface.\nInterfaces will allow combining these into a single port. There will be \"a\" and \"b\" versions of each interface where\nthe \"b\" version is a mirrored copy of \"a\" (inputs are outputs, outputs are inputs). That way a module with an \"a\" port \ncan directly connect to a module with a \"b\" port.\nSimulation#\n\nA big motivator for the rewrite was the potential to do full Lucid simulations. The old code would parse constant \nexpressions, but it only hinted at the possibility to do a full simulation by iterating the parsing.\nThe new code builds a full model of your project complete with signal connections, models for always blocks, and other\ndynamic expressions. This not only helps with more robust error checking (it's hard to miss something when you're \nrequired to actually model it all) but will allow for quick simple simulations to check if your logic is working how\nyou expect.\nMuch of this is already working. The details are more than the scope of this post, but check out the link to the source\nbelow for details on how it works.\nAs part of doing simulations, a new testBench will be created. I haven't nailed down the specifics for this either\njust quiet yet but the current idea is for a testBench to look similar to a module. Inside the testBench, you\nwill be able to instantiate your module to test. You can then test it via test and function blocks.\nThe test blocks will work similar to an always block in that the contents will run sequentially.\nThe function blocks will be the same except they won't run on their own and can instead be called by test blocks.\nI'm imagining these being used for common tasks like cycling a clock. For example, something like \nrepeat(100) { cycleClock() }. The syntax for this is very much still up in the air.\nSource and Discussion#\n\nHead over to our GitHub page to check out the current state of things.\nThere is also a discussion page setup as part of the repo\nwhere you can let me know your thoughts.\n","id":"https://alchitry.com/news/lucid-v2/","title":"Lucid V2"},"https://alchitry.com/tags/":{"body":"","id":"https://alchitry.com/tags/","title":"Tags"},"https://alchitry.com/tutorials/":{"body":"Before you begin, make sure you check out the Setup Tutorials.\nDepending on your background, you may find these Background Tutorials helpful.\nThese are the latest Lucid V2 tutorials. \nFor legacy Lucid tutorials, see Lucid V1.\nFor legacy Verilog tutorials, see Verilog.\nTo get an idea of what you can do with an FPGA, see our Example Projects.\nLucid V2 Tutorials\n","id":"https://alchitry.com/tutorials/","title":"Tutorials"},"https://alchitry.com/tutorials/background/":{"body":"These tutorials may or may not be necessary based on your background. These are more conceptual tutorials and don't require any hardware to follow.\n","id":"https://alchitry.com/tutorials/background/","title":"Background"},"https://alchitry.com/tutorials/background/addition/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/addition/","title":"Addition"},"https://alchitry.com/tutorials/background/combinational-logic/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/combinational-logic/","title":"Combinational Logic"},"https://alchitry.com/tutorials/background/digital-logic/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/digital-logic/","title":"Digital Logic"},"https://alchitry.com/tutorials/background/encodings/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/encodings/","title":"Encodings"},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/how-does-an-fpga-work/","title":"How does an FPGA work?"},"https://alchitry.com/tutorials/background/multiplexers/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/multiplexers/","title":"Multiplexers"},"https://alchitry.com/tutorials/background/subtraction/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/subtraction/","title":"Subtraction"},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/background/what-is-an-fpga/","title":"What is an FPGA?"},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"body":"TODO\n","id":"https://alchitry.com/tutorials/lucid-1-vs-2/","title":"Lucid V1 to V2"},"https://alchitry.com/tutorials/lucid_v1/":{"body":"These are the original Lucid tutorials for the Alchitry boards. For the Mojo, click here.\n","id":"https://alchitry.com/tutorials/lucid_v1/","title":"Lucid V1"},"https://alchitry.com/tutorials/lucid_v1/components/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/components/","title":"Components"},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/","title":"DDR3 Memory"},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/","title":"Hello YOUR_NAME_HERE"},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/io-element/","title":"Io Element"},"https://alchitry.com/tutorials/lucid_v1/mojo/":{"body":"These are the original Lucid V1 tutorials for the Mojo.\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/","title":"Mojo"},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/","title":"Analog Inputs"},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/","title":"Basic CPU"},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/camera/","title":"Camera"},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/components/","title":"Components"},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/","title":"External IO"},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/","title":"HDMI"},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/","title":"Hello YOUR_NAME_HERE"},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/","title":"Io Shield"},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/","title":"Register Interface"},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/","title":"ROMs and FSMs"},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/","title":"SDRAM"},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/servos/","title":"Servos"},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/","title":"Sound Locating"},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/","title":"Synchronous Logic"},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/","title":"Your First FPGA Project"},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/","title":"ROMs and FSMs"},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/","title":"Synchronous Logic"},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"body":"This tutorial will walk you through creating your first project and making the onboard LED light up when you press the\nreset button.\n\nBefore you start you need to have your environment setup.\nHead over to the setup tutorial if you haven’t already.\nCreating a New Project\nLaunch Alchitry Labs. After click through the welcome screen, you should see the following.\n\nClick on File->New Project. In the dialog that pops up enter a Project Name of LEDtoButton. You can leave\nthe default workspace if you want or browse for a different one. This is where all your projects will be stored\nUse the drop-down menu to choose the board you are using.\nLeave the language set to Lucid and From Example set to Base Project. This will copy a bare-bones project as the\nstarting point.\nIt should now look something like this. Note that your workspace will be different.\n\nClick Create to create your project.\nBack in the main window, expand the tree on the left to find the top file inside of Source. This has the name of *\nboard_top.luc*. Double click on it to open it in the editor.\n\nThe top file contains all the external inputs and outputs of your design. Your future projects can be built out of many\nmodules, but they all must be sub-modules to this top module. This will be covered more in a later tutorial. For now, we\nwill make all our edits to this file.\nConveniently, the default file has all the basic inputs and outputs that are hardwired to the FPGA already declared.\nThis way you can just use them without having to look up what pins they connect to.\nNote that if you using the Mojo the top files looks a little difference. You may have noticed the yellow underline under\nall of the inputs. This is because we aren't using them currently and the IDE is just giving us a warning. The Mojo has\nan AVR microcontroller on the board that the FPGA can talk to. There are connections defined in the top module that are\nused for this.\nIf you hover your cursor over a warning or error, text will show up to let you know what is going on. Also when you\nattempt to build your project (click the hammer icon) all the warnings and errors will be printed in the console.\nThe Contents of a Module\nBefore we continue on, let's cover the basics of what makes up a module and what a module even is. A module is way to\norganize your project into smaller pieces broken apart by function. It is very similar to the concept of functions when\nprogramming where you break down your program into smaller more manageable pieces. Modules are also nice because they\ncan be reused in multiple parts of your design.\nModule Declaration\nThe first part of any module is the module declaration. This is lines 1 through 14, reproduced below.\n\nIt always starts off with the module keyword followed by the name of the module. In this case it is au_top. It is\nconvention to name your module the same thing as the file name.\nAfter the module name comes an optional parameter declaration, this isn't used in our module and it will be covered\nin a later tutorial.\nAfter that is the port declaration. This is where you specify all the inputs, outputs, and inouts of\nyour module. An inout is a bi-directional port and will also covered in a later tutorial.\nMost of the ports in this module are single bit signals. However, the outputs led and spi_channel, on the Mojo, are\na multi-bit signals. led consists of 8 bits and spi_channel is 4 bits. This is declared by the [8] and [4] after\nthe signal's names, respectively.\nThe reason led is 8 bits wide, is because the board has 8 LEDs on it! Each bit of the signal connects to one of the\nLEDs on the board.\nWe only care about two of these ports for our project, led and rst_n. As you may have guessed, rst_n connects to\nthe reset button. The _n part of it's name is because the signal is active low (as stated in the comment). This means\nthat the value is typically 1 (high), but when the button is pressed (active) it is 0 (low).\nThe Always Block\nThere is some stuff before the always block, but we will get back to that later (it will make more sense then). So for\nnow, just ignore it.\nAlways blocks are where all the magic happens. It is where you can perform computation and read/write signals. The\nalways block gets its name because it is always happening. When the tools see an always block, they need to generate a\ndigital circuit that will replicate the behavior that the block describes. Let's take a look at the always block in\nour code.\n\nNotice I said the tools need to replicate the block's behavior and not the block. That is because inside an always\nblock, statements that appear lower in the block have priority over earlier statements. This is similar to\nprogramming, and this abstraction makes it so much easier to program complex logic. However, it is important to\nunderstand you are not programming and this is just an abstraction. To make this clear take a look at this example.\n\nWhat would you expect this always block to do? If you have a programming background, you may be tempted to think that\nthe LEDs would continuously turn on and off. You're not in Kansas anymore Dorthy, this isn't programming and that's not\nwhat happens. Remember, there is no processor to run code (that is unless you explicitly make one, like a boss). When\nthe tools see this block, they completely ignore the first line. This is because the second line has higher priory. If\nyou were to synthesize this design, the tools would hard-wire the led signal to 8hFF (all 1s).\nBack to our design. Were we are assigning four signals a value (six on the Mojo). Note that every output of a module *\nmust* have a value assigned to it at all times. Since we aren't using these outputs, they are assigned with some\nreasonable defaults. Let's take a quick detour and look at how values are represented in Lucid.\nRepresenting Values\nA value is made of one or more bits. The number of bits a value has is known as its width. There are a few ways to\nspecify a value, some use an implied width while others allow you to explicitly set a width. If you are unfamiliar with\nbinary or hexadecimal please read the Encodings Tutorial before continuing.\nThe first way to represent a value is to just type a decimal number. For example, 9.\nSometimes it’s easier to specify a number with a different radix than 10 (the implied default). Lucid supports three\ndifferent radix, 10 (decimal), 16 (hexadecimal), and 2 (binary). To specify the radix, prepend d, h, or b to specify\ndecimal, hexadecimal, or binary respectively. For example, hFF has the decimal value 255 and b100 has the decimal value\n4. If you don’t append a radix indicator, decimal is assumed.\nIt is important to remember that all number will be represented as bits in your circuit. When you specify a number this\nway, the width of the number will be the minimum number of bits required to represent that value for decimal. For\nbinary, it is simply the number of digits and for hexadecimal it is four times the number of digits. For example, the\nvalue 7 will be three bits wide (111), 1010 will be four bits wide, and hACB will be 12 bits wide.\nSometimes you need more control over the exact width of a number. In those cases you can specify the number of bits by\nprepending the number of bits and radix to the value. For example, 4d2 will be the value 2 but using 4 bits instead of\nthe minimum 2 (binary value 0010 instead of 10). You must specify the radix when specifying the width to separate the\nwidth from the value.\nIf you specify a width smaller than the minimum number of bits required, the number will drop the most significant bits.\nWhen this happens you will get a warning.\nZ and X\nWhen you specify a decimal number, all the bits in your value will be either 0 or 1. However, each bit can actually be\none of four values, 0, 1, x, or z. The values of 0 and 1 are fairly self explanatory, it just means the bit is high (1)\nor low (0). The value of x means don't care. It means you want to assign a value, but you really don't care if it is\n1 or 0. This is useful for the synthesizer because your circuit may be simpler in one of the cases and it gives the\ntools the freedom to choose. During simulation, x also means unknown. Z means that the bit is high-impedance or\ntri-stated. This means that it is effectively disconnected. Note that FPGAs can't realize high-impedance signals\ninternally, so the only time you should use z is for outputs of the top module.\nBack to our always block, the first two lines connect the input rst_n to the input of the reset_cond module. Modules\ncan be nested which makes it possible to reuse them and helps make your project manageable. This is all covered later in\nmore detail so don't get hung up over this yet. The only important thing to know about these two lines, is that the\nrst_n signal is active low (0 when the button is pressed, 1 otherwise) while the rst signal is active high.\nThe next line assigns the led output to all zeros. This turns off all the LEDs.\nOn the Alchitry boards, the last line connects the serial input pin to the serial output pin effectively echoing\nanything the FPGA receives over the serial port. We could have also tied this pin to 1 to disable it.\nOn the Mojo, the last three lines assign the outputs to z. This is because they aren't being used and we shouldn't drive\nthese as they connect directly to the microcontroller on the Mojo (to use these you have to wait for the microcontroller\nto signal that it is ready first, this is also covered later).\nLooking at this always block, we can see there are no redundant assignments (like in our led on/off example). That means\nthese signals will literally be connected to these values.\nConnecting the Button\nWe are going to modify the module to connect the reset button to the first LED so that when you push the button the LED\nturns on.\nTo do this we need to modify line 21, where led is assigned.\n\nThe output led is an 8 bit array. That means when you assign it a value you need to provide an 8 bit array. However,\nthe signal rst is a single bit wide. To compensate for this we use the concatenation operator.\nTo concatenate multiple arrays into one, you can use the concatenation operator, c{ x, y, z }. Here the arrays (or\nsingle bit values) x, y, and z will be concatenated to form a larger array.\nIn our code we are concatenating the constant 7h0 with rst. The constant here is seven zeros. The 7 represents the\nsize, h represents the number base (in this case hexadecimal) and 0 represents the value. Since we just need a bunch of\nzeros, the number base doesn’t really matter and we could have used 7b0, or 7d0, for binary or decimal respectively.\nNote that values are zero padded if the specified width is larger than the size required to store the value. For\nexample, 4b11 would the same as 4b0011.\nIf you don’t care about how many bits a values takes up, you don’t have to specify it. The minimum number of bits that\nwill still fit the value will be used. For example, b1101 is exactly the same as 4b1101. If you are using decimal,\nyou can even drop the d so 4d12 is the same as d12 which is the same as just 12. However, when you are\nconcatenating values, you should always specify a width to make it obvious how big the array will be.\nBuilding Your Project\nGo ahead and click the little hammer icon in the toolbar to build your project. You may need to first specify where you\ninstalled the builder.\nFor the Au, use Settings->Vivado Location... and point it to the Xilinx/Vivado/YEAR.MONTH folder.\nFor the Cu, use Settings->iCEcube2 Location... and point it to the lscc/iCEcube2 folder. You will also need to use\nSettings->iCEcube2 License Location... to point it to the license file you downloaded when you installed iCEcube2.\nFor the Mojo, use Settings->ISE Location... and point it to the Xilinx/14.7 folder.\nOnce set you should be able to build your project.\nAs the project builds you should see a bunch of text spit out. Just wait for it to finish building. It should look like\nthis.\n\nThe important line here is where it says Finished building project. This means that the IDE was able to find a .bin\nfile after. If you ever get a red message telling you the bin file couldn't be found you should scroll up through the\nbuild messages for the error that caused it to fail.\nLoading Your Project\nWith your project built, plug your board into your computer if you haven’t already.\nIf you are using the Mojo, go to Settings->Serial Port... and select the serial port the Mojo is connected to.\nThe Alchitry boards are detected automatically.\nIt is time to load your project onto the board. You have two options. The first is the hollow arrow, this will write\nyour configuration directly to the FPGA's RAM. The second is the solid arrow, this will write your configuration to the\nFLASH memory on the board (as well as the FPGA). If you program to the FPGA's RAM, your configuration will be lost when\nthe board loses power. However, if you program to the FLASH, your configuration will be automatically loaded when the\nboard is powered up.\nThe Alchitry Cu doesn't support loading directly to the FPGA.\nIf you program to RAM and then power cycle the board, the last configuration written to FLASH will automatically be\nloaded. This is helpful when you want to temporarily try out some configuration.\nIf you want to stop the FPGA from being configured at power up, you can click the eraser icon. This will wipe the FLASH\nmemory and clear the FPGA's current configuration.\nGo ahead and click the arrow to program the FPGA.\n\nNow look at your board. You should see the DONE LED on. This means that the configuration was loaded successfully to\nthe FPGA.\n\nNow push the reset button.\n\nNotice the LED turned on!\nSome Notes on Hardware\nWhen you press the button, how long does it take for the LED to turn on? If this was a processor instead of an FPGA, the\nprocessor would be in a loop reading the button state and turning the LED on or off based on that state. The amount of\ntime between pressing it and when the LED turns on would vary depending on what code the processor was executing and how\nlong it is until it gets back to reading the button and turning the LED on. As you add more code to your loop, this time\nand variation gets bigger.\nHowever, an FPGA is different. With this design (note I said design and not code), the button input is directly\nconnected to the LED output. You can imagine a physical wire bridging the input to the output inside the FPGA. In\nreality, it's not a wire but a set of switches (multiplexers) that are set to route the signal directly to the output.\nWell, this is only partially true since the reset_conditioner is there which does some stuff to clean up the reset\nsignal.\nSince the signal doesn’t have to wait for a processor to read it, it will travel as fast as possible through the silicon\nto light the LED. This is almost instant (again, forget about the reset_conditioner)! The best part is that if you\nwire the button the LED then go on to create some crazy design with the rest of the FPGA, the speed of this will not\nslow down. This is because the circuits will operate independently as they both simply exist. It is this parallelism\nwhere FPGAs get their real power.\nDuplication\nWhat if we want all the LEDs to turn on and off with the press of the button instead of just one?\nWell we could do it using concatenation just like before by replacing line 20 with the following.\n\nHowever, there is a better way! This is where the array duplication syntax comes in handy. The syntax is M x{ A }.\nHere M is the number of times to duplicate A. That means we can make line 20 look like this.\n\nMuch cleaner! This does exactly the same thing as before, but requires a lot less typing.\nArray Indexing\nThere is an alternative way to write the code where we only want one LED to light. This is by assigning the parts of the\nled array separately.\n\nOn line 20, the bit selector [7:1] is used to select the bits 7 through 1 of the led array. These seven bits are set\nto 0.\nOn line 21, [0] is used to select the single bit, 0, and set it to rst.\nThere are two ways to select a group of bits. The first one (and most common) is the one used above where you specify\nthe start and stop bits (inclusive) explicitly. The other way is to specify a start bit and the total number of bits to\ninclude above or below the start bit.\nLine 20 could be rewritten as any of the following.\n\nThe benefit of using the start-width syntax is the width is guaranteed to be constant. This means you can use a signal\nto specify the start index. This will be covered in a later tutorial.\nAlways Blocks\nDue to the nature of always blocks, you could also write the LED assignment as follows.\n\nBecause the second statement has priority over the first, led[0] will actually NEVER have the value 0! It will be\npermanently connected to rst. Note that the second line only assigns the first bit of led. That means that the other\n7 bits will still receive their value from the first statement.\nThis is one of the weird things of working with hardware. The code you write is not run on a processor like it is when\nyou program. Instead, the code you write is interpreted by the tools to figure out what behavior you want. The tools\nthen create a circuit that will match that behavior.\nAlways blocks are an easy way to describe complex behavior, but the way you describe the behavior and it's actual\nimplementation can vary.\nCongratulations! You've finished your first tutorial on Lucid.\n","id":"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/","title":"Your First FPGA Project"},"https://alchitry.com/tutorials/projects/":{"body":"TODO\n","id":"https://alchitry.com/tutorials/projects/","title":"Projects"},"https://alchitry.com/tutorials/projects/clock-clock/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/projects/clock-clock/","title":"Clock Clock"},"https://alchitry.com/tutorials/projects/gpu/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/projects/gpu/","title":"GPU"},"https://alchitry.com/tutorials/projects/hexapod/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/projects/hexapod/","title":"Hexapod"},"https://alchitry.com/tutorials/setup/":{"body":"Depending on your board you will need to install different software to work with it. Find the section below and follow the guides for setting up your board.\nEvery Board\nNo matter what board you have, you will need to install Alchitry Labs. Alchitry Labs is an IDE required to write Lucid code. It has a ton of useful features that are covered on its page.\nIt is now bundled with the Alchitry Loader. If you don’t want to use the Alchitry Labs IDE, you still need the Alchitry Loader to get the .bin files onto your board.\nAu and Au+\nBoth the Au and Au+ require Vivado to build projects. This is software supplied by Xilinx. The install is fairly straightforward but does require you to make an account.\nCu\nUsing the Cu has never been easier. Alchitry Labs 2 now ships with the open source tools required to build projects for the Cu meaning you don't need to setup anything else.\nThe best part is that these even run on Macs (none of the proprietary tools do).\nYou can still choose to use Lattice's propriety toolchain, iCEcube2.\nMojo\nThe Mojo is no longer actively supported and requires Alchitry Labs V1 and the abandoned ISE tool from Xilinx. \nInstalling this on Windows 10 or newer can be a bit finicky. We have a detailed guide to help but with ISE being no longer maintained it is recommended to upgrade to an Au which uses supported tools.\n","id":"https://alchitry.com/tutorials/setup/","title":"Setup"},"https://alchitry.com/tutorials/setup/icecube2/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/setup/icecube2/","title":"iCEcube2 Setup"},"https://alchitry.com/tutorials/setup/ise/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/setup/ise/","title":"ISE Setup"},"https://alchitry.com/tutorials/setup/vivado/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/setup/vivado/","title":"Vivado Setup"},"https://alchitry.com/tutorials/verilog/":{"body":"These tutorials focused on using Verilog without Alchitry Labs.\nYou can find the legacy Verilog Mojo Tutorials here.\n","id":"https://alchitry.com/tutorials/verilog/","title":"Verilog"},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/","title":"Creating a Vivado Project"},"https://alchitry.com/tutorials/verilog/mojo/":{"body":"These are the legacy Verilog tutorials for the Mojo.\nThese were written before the Mojo IDE (now Alchitry Labs) or Lucid were created and are based around using ISE.\n","id":"https://alchitry.com/tutorials/verilog/mojo/","title":"Mojo"},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/","title":"Analog Inputs"},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/","title":"Asynchronous Serial"},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/avr-interface/","title":"AVR Interface"},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/","title":"Creating an ISE Project"},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/","title":"Embedded Processors"},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/external-io/","title":"External IO"},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/","title":"Finite State Machines"},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/","title":"FPGA Timing"},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/hello-world/","title":"Hello World!"},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/","title":"Memory Mapping"},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/","title":"Metastability and Debouncing"},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/","title":"Pulse Width Modulation"},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/sdram/","title":"SDRAM"},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/","title":"Serial Peripheral Interface (SPI)"},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/servos/","title":"Servos"},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/","title":"Synchronous Logic"},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/","title":"Using Core Generator"},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/","title":"Writing Test Benches"},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"body":"TODO: Visit the old page until this is ported\n","id":"https://alchitry.com/tutorials/verilog/verilog-operators/","title":"Verilog Operators"}},"docInfo":{"https://alchitry.com/":{"body":0,"title":0},"https://alchitry.com/alchitry-labs/":{"body":9,"title":2},"https://alchitry.com/boards/":{"body":0,"title":1},"https://alchitry.com/boards/au/":{"body":6,"title":2},"https://alchitry.com/boards/br/":{"body":6,"title":2},"https://alchitry.com/boards/cu/":{"body":6,"title":2},"https://alchitry.com/boards/ft/":{"body":6,"title":2},"https://alchitry.com/boards/io/":{"body":6,"title":2},"https://alchitry.com/news/":{"body":0,"title":1},"https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/":{"body":395,"title":4},"https://alchitry.com/news/alchitry-labs-v2-cli/":{"body":276,"title":6},"https://alchitry.com/news/alchitry-labs-v2-update-1/":{"body":506,"title":5},"https://alchitry.com/news/alchitry-labs-v2-update-2/":{"body":481,"title":5},"https://alchitry.com/news/alchitry-labs-v2-update-3/":{"body":143,"title":5},"https://alchitry.com/news/alchitry-labs-v2/":{"body":298,"title":3},"https://alchitry.com/news/alchitry-loader-v2/":{"body":146,"title":3},"https://alchitry.com/news/lucid-v2-update-1/":{"body":231,"title":4},"https://alchitry.com/news/lucid-v2-update-2/":{"body":419,"title":6},"https://alchitry.com/news/lucid-v2/":{"body":530,"title":2},"https://alchitry.com/tags/":{"body":0,"title":1},"https://alchitry.com/tutorials/":{"body":37,"title":1},"https://alchitry.com/tutorials/background/":{"body":11,"title":1},"https://alchitry.com/tutorials/background/addition/":{"body":6,"title":1},"https://alchitry.com/tutorials/background/combinational-logic/":{"body":6,"title":2},"https://alchitry.com/tutorials/background/digital-logic/":{"body":6,"title":2},"https://alchitry.com/tutorials/background/encodings/":{"body":6,"title":1},"https://alchitry.com/tutorials/background/how-does-an-fpga-work/":{"body":6,"title":2},"https://alchitry.com/tutorials/background/multiplexers/":{"body":6,"title":1},"https://alchitry.com/tutorials/background/subtraction/":{"body":6,"title":1},"https://alchitry.com/tutorials/background/what-is-an-fpga/":{"body":6,"title":1},"https://alchitry.com/tutorials/lucid-1-vs-2/":{"body":1,"title":3},"https://alchitry.com/tutorials/lucid_v1/":{"body":8,"title":2},"https://alchitry.com/tutorials/lucid_v1/components/":{"body":6,"title":1},"https://alchitry.com/tutorials/lucid_v1/ddr3-memory/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/io-element/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/":{"body":5,"title":1},"https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/camera/":{"body":6,"title":1},"https://alchitry.com/tutorials/lucid_v1/mojo/components/":{"body":6,"title":1},"https://alchitry.com/tutorials/lucid_v1/mojo/external-io/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/":{"body":6,"title":1},"https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/sdram/":{"body":6,"title":1},"https://alchitry.com/tutorials/lucid_v1/mojo/servos/":{"body":6,"title":1},"https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/":{"body":6,"title":3},"https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/synchronous-logic/":{"body":6,"title":2},"https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/":{"body":1627,"title":3},"https://alchitry.com/tutorials/projects/":{"body":1,"title":1},"https://alchitry.com/tutorials/projects/clock-clock/":{"body":6,"title":2},"https://alchitry.com/tutorials/projects/gpu/":{"body":6,"title":1},"https://alchitry.com/tutorials/projects/hexapod/":{"body":6,"title":1},"https://alchitry.com/tutorials/setup/":{"body":139,"title":1},"https://alchitry.com/tutorials/setup/icecube2/":{"body":6,"title":2},"https://alchitry.com/tutorials/setup/ise/":{"body":6,"title":2},"https://alchitry.com/tutorials/setup/vivado/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/":{"body":13,"title":1},"https://alchitry.com/tutorials/verilog/creating-a-vivado-project/":{"body":6,"title":3},"https://alchitry.com/tutorials/verilog/mojo/":{"body":17,"title":1},"https://alchitry.com/tutorials/verilog/mojo/analog-inputs/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/avr-interface/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/":{"body":6,"title":3},"https://alchitry.com/tutorials/verilog/mojo/embedded-processors/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/external-io/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/":{"body":6,"title":3},"https://alchitry.com/tutorials/verilog/mojo/fpga-timing/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/hello-world/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/memory-mapping/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/":{"body":6,"title":3},"https://alchitry.com/tutorials/verilog/mojo/sdram/":{"body":6,"title":1},"https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/":{"body":6,"title":4},"https://alchitry.com/tutorials/verilog/mojo/servos/":{"body":6,"title":1},"https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/":{"body":6,"title":2},"https://alchitry.com/tutorials/verilog/mojo/using-core-generator/":{"body":6,"title":3},"https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/":{"body":6,"title":3},"https://alchitry.com/tutorials/verilog/verilog-operators/":{"body":6,"title":2}},"length":85},"lang":"English"}; \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..e61982f --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,305 @@ + + + + https://alchitry.com/ + + + https://alchitry.com/alchitry-labs/ + + + https://alchitry.com/boards/ + + + https://alchitry.com/boards/au/ + + + https://alchitry.com/boards/br/ + + + https://alchitry.com/boards/cu/ + + + https://alchitry.com/boards/ft/ + + + https://alchitry.com/boards/io/ + + + https://alchitry.com/boards/page/1/ + + + https://alchitry.com/news/ + + + https://alchitry.com/news/alchitry-labs-v2-0-5-simulations/ + 2024-02-06 + + + https://alchitry.com/news/alchitry-labs-v2-cli/ + 2023-09-11 + + + https://alchitry.com/news/alchitry-labs-v2-update-1/ + 2023-10-13 + + + https://alchitry.com/news/alchitry-labs-v2-update-2/ + 2024-01-04 + + + https://alchitry.com/news/alchitry-labs-v2-update-3/ + 2024-01-15 + + + https://alchitry.com/news/alchitry-labs-v2/ + 2023-06-07 + + + https://alchitry.com/news/alchitry-loader-v2/ + 2023-09-18 + + + https://alchitry.com/news/lucid-v2-update-1/ + 2023-05-30 + + + https://alchitry.com/news/lucid-v2-update-2/ + 2023-06-01 + + + https://alchitry.com/news/lucid-v2/ + 2023-05-18 + + + https://alchitry.com/news/page/1/ + + + https://alchitry.com/tags/ + + + https://alchitry.com/tutorials/ + + + https://alchitry.com/tutorials/background/ + + + https://alchitry.com/tutorials/background/addition/ + + + https://alchitry.com/tutorials/background/combinational-logic/ + + + https://alchitry.com/tutorials/background/digital-logic/ + + + https://alchitry.com/tutorials/background/encodings/ + + + https://alchitry.com/tutorials/background/how-does-an-fpga-work/ + + + https://alchitry.com/tutorials/background/multiplexers/ + + + https://alchitry.com/tutorials/background/page/1/ + + + https://alchitry.com/tutorials/background/subtraction/ + + + https://alchitry.com/tutorials/background/what-is-an-fpga/ + + + https://alchitry.com/tutorials/lucid-1-vs-2/ + 2024-02-07 + + + https://alchitry.com/tutorials/lucid_v1/ + + + https://alchitry.com/tutorials/lucid_v1/components/ + + + https://alchitry.com/tutorials/lucid_v1/ddr3-memory/ + + + https://alchitry.com/tutorials/lucid_v1/hello-your-name-here/ + + + https://alchitry.com/tutorials/lucid_v1/io-element/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/analog-inputs/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/basic-cpu/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/camera/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/components/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/external-io/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/hdmi/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/hello-your-name-here/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/io-shield/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/page/1/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/page/2/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/register-interface/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/roms-and-fsms/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/sdram/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/servos/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/sound-locating/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/synchronous-logic/ + + + https://alchitry.com/tutorials/lucid_v1/mojo/your-first-fpga-project/ + + + https://alchitry.com/tutorials/lucid_v1/page/1/ + + + https://alchitry.com/tutorials/lucid_v1/roms-and-fsms/ + + + https://alchitry.com/tutorials/lucid_v1/synchronous-logic/ + + + https://alchitry.com/tutorials/lucid_v1/your-first-fpga-project/ + + + https://alchitry.com/tutorials/page/1/ + + + https://alchitry.com/tutorials/projects/ + + + https://alchitry.com/tutorials/projects/clock-clock/ + + + https://alchitry.com/tutorials/projects/gpu/ + + + https://alchitry.com/tutorials/projects/hexapod/ + + + https://alchitry.com/tutorials/projects/page/1/ + + + https://alchitry.com/tutorials/setup/ + + + https://alchitry.com/tutorials/setup/icecube2/ + + + https://alchitry.com/tutorials/setup/ise/ + + + https://alchitry.com/tutorials/setup/page/1/ + + + https://alchitry.com/tutorials/setup/vivado/ + + + https://alchitry.com/tutorials/verilog/ + + + https://alchitry.com/tutorials/verilog/creating-a-vivado-project/ + + + https://alchitry.com/tutorials/verilog/mojo/ + + + https://alchitry.com/tutorials/verilog/mojo/analog-inputs/ + + + https://alchitry.com/tutorials/verilog/mojo/asynchronous-serial/ + + + https://alchitry.com/tutorials/verilog/mojo/avr-interface/ + + + https://alchitry.com/tutorials/verilog/mojo/creating-an-ise-project/ + + + https://alchitry.com/tutorials/verilog/mojo/embedded-processors/ + + + https://alchitry.com/tutorials/verilog/mojo/external-io/ + + + https://alchitry.com/tutorials/verilog/mojo/finite-state-machines/ + + + https://alchitry.com/tutorials/verilog/mojo/fpga-timing/ + + + https://alchitry.com/tutorials/verilog/mojo/hello-world/ + + + https://alchitry.com/tutorials/verilog/mojo/memory-mapping/ + + + https://alchitry.com/tutorials/verilog/mojo/metastability-and-debouncing/ + + + https://alchitry.com/tutorials/verilog/mojo/page/1/ + + + https://alchitry.com/tutorials/verilog/mojo/page/2/ + + + https://alchitry.com/tutorials/verilog/mojo/pulse-width-modulation/ + + + https://alchitry.com/tutorials/verilog/mojo/sdram/ + + + https://alchitry.com/tutorials/verilog/mojo/serial-peripheral-interface/ + + + https://alchitry.com/tutorials/verilog/mojo/servos/ + + + https://alchitry.com/tutorials/verilog/mojo/synchronous-logic/ + + + https://alchitry.com/tutorials/verilog/mojo/using-core-generator/ + + + https://alchitry.com/tutorials/verilog/mojo/writing-test-benches/ + + + https://alchitry.com/tutorials/verilog/page/1/ + + + https://alchitry.com/tutorials/verilog/verilog-operators/ + + diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 0000000..7c8b665 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,492 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tags/page/1/index.html b/tags/page/1/index.html new file mode 100644 index 0000000..6cc4c75 --- /dev/null +++ b/tags/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/background/addition/index.html b/tutorials/background/addition/index.html new file mode 100644 index 0000000..6a30b02 --- /dev/null +++ b/tutorials/background/addition/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Addition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/combinational-logic/index.html b/tutorials/background/combinational-logic/index.html new file mode 100644 index 0000000..1fbfda7 --- /dev/null +++ b/tutorials/background/combinational-logic/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Combinational Logic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/digital-logic/index.html b/tutorials/background/digital-logic/index.html new file mode 100644 index 0000000..37248a6 --- /dev/null +++ b/tutorials/background/digital-logic/index.html @@ -0,0 +1,550 @@ + + + + + + + + +Digital Logic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/encodings/index.html b/tutorials/background/encodings/index.html new file mode 100644 index 0000000..0a62c84 --- /dev/null +++ b/tutorials/background/encodings/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Encodings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/how-does-an-fpga-work/index.html b/tutorials/background/how-does-an-fpga-work/index.html new file mode 100644 index 0000000..129d9bb --- /dev/null +++ b/tutorials/background/how-does-an-fpga-work/index.html @@ -0,0 +1,556 @@ + + + + + + + + +How does an FPGA work? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/index.html b/tutorials/background/index.html new file mode 100644 index 0000000..42ec164 --- /dev/null +++ b/tutorials/background/index.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

These tutorials may or may not be necessary based on your background. These are more conceptual tutorials and don't require any hardware to follow.

+ +
+ + +
+
+

Digital Logic

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Combinational Logic

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

What is an FPGA?

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

How does an FPGA work?

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Encodings

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Multiplexers

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Addition

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Subtraction

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/multiplexers/index.html b/tutorials/background/multiplexers/index.html new file mode 100644 index 0000000..52e2aa0 --- /dev/null +++ b/tutorials/background/multiplexers/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Multiplexers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/page/1/index.html b/tutorials/background/page/1/index.html new file mode 100644 index 0000000..0225d76 --- /dev/null +++ b/tutorials/background/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/background/subtraction/index.html b/tutorials/background/subtraction/index.html new file mode 100644 index 0000000..e140178 --- /dev/null +++ b/tutorials/background/subtraction/index.html @@ -0,0 +1,550 @@ + + + + + + + + +Subtraction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/background/what-is-an-fpga/index.html b/tutorials/background/what-is-an-fpga/index.html new file mode 100644 index 0000000..401800f --- /dev/null +++ b/tutorials/background/what-is-an-fpga/index.html @@ -0,0 +1,556 @@ + + + + + + + + +What is an FPGA? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/index.html b/tutorials/index.html new file mode 100644 index 0000000..abfb799 --- /dev/null +++ b/tutorials/index.html @@ -0,0 +1,531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

Before you begin, make sure you check out the Setup Tutorials.

+

Depending on your background, you may find these Background Tutorials helpful.

+

These are the latest Lucid V2 tutorials.

+

For legacy Lucid tutorials, see Lucid V1.

+

For legacy Verilog tutorials, see Verilog.

+

To get an idea of what you can do with an FPGA, see our Example Projects.

+

Lucid V2 Tutorials

+ +
+ + +
+
+

Lucid V1 to V2

+
+ +
+ + + + + + + + + + + + + + + + +2024-02-07 · 1 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid-1-vs-2/index.html b/tutorials/lucid-1-vs-2/index.html new file mode 100644 index 0000000..1536588 --- /dev/null +++ b/tutorials/lucid-1-vs-2/index.html @@ -0,0 +1,543 @@ + + + + + + + + +Lucid V1 to V2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Lucid V1 to V2

+ + + + +
+ + + + + + + +
+

TODO

+ +
+ + +
+ + + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/components/index.html b/tutorials/lucid_v1/components/index.html new file mode 100644 index 0000000..60b4b1a --- /dev/null +++ b/tutorials/lucid_v1/components/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Components + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/ddr3-memory/index.html b/tutorials/lucid_v1/ddr3-memory/index.html new file mode 100644 index 0000000..b9332b7 --- /dev/null +++ b/tutorials/lucid_v1/ddr3-memory/index.html @@ -0,0 +1,550 @@ + + + + + + + + +DDR3 Memory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/hello-your-name-here/index.html b/tutorials/lucid_v1/hello-your-name-here/index.html new file mode 100644 index 0000000..8a8eff4 --- /dev/null +++ b/tutorials/lucid_v1/hello-your-name-here/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Hello YOUR_NAME_HERE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/index.html b/tutorials/lucid_v1/index.html new file mode 100644 index 0000000..c684a5a --- /dev/null +++ b/tutorials/lucid_v1/index.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

These are the original Lucid tutorials for the Alchitry boards. For the Mojo, click here.

+ +
+ + +
+
+

Your First FPGA Project

+
+ +
+

This tutorial will walk you through creating your first project and making the onboard LED light up when you press the +reset button.

+

+
+ +
+ + + + + + + + + + + + +18 min · Justin Rajewski + +
+ +
+ +
+
+

Synchronous Logic

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Io Element

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Components

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

ROMs and FSMs

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Hello YOUR_NAME_HERE

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

DDR3 Memory

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/io-element/index.html b/tutorials/lucid_v1/io-element/index.html new file mode 100644 index 0000000..f896870 --- /dev/null +++ b/tutorials/lucid_v1/io-element/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Io Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/analog-inputs/index.html b/tutorials/lucid_v1/mojo/analog-inputs/index.html new file mode 100644 index 0000000..a7793e7 --- /dev/null +++ b/tutorials/lucid_v1/mojo/analog-inputs/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Analog Inputs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/basic-cpu/index.html b/tutorials/lucid_v1/mojo/basic-cpu/index.html new file mode 100644 index 0000000..efe240b --- /dev/null +++ b/tutorials/lucid_v1/mojo/basic-cpu/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Basic CPU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/camera/index.html b/tutorials/lucid_v1/mojo/camera/index.html new file mode 100644 index 0000000..2d0fe27 --- /dev/null +++ b/tutorials/lucid_v1/mojo/camera/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Camera + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/components/index.html b/tutorials/lucid_v1/mojo/components/index.html new file mode 100644 index 0000000..0d845a8 --- /dev/null +++ b/tutorials/lucid_v1/mojo/components/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Components + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/external-io/index.html b/tutorials/lucid_v1/mojo/external-io/index.html new file mode 100644 index 0000000..da23024 --- /dev/null +++ b/tutorials/lucid_v1/mojo/external-io/index.html @@ -0,0 +1,561 @@ + + + + + + + + +External IO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/hdmi/index.html b/tutorials/lucid_v1/mojo/hdmi/index.html new file mode 100644 index 0000000..095f1b9 --- /dev/null +++ b/tutorials/lucid_v1/mojo/hdmi/index.html @@ -0,0 +1,561 @@ + + + + + + + + +HDMI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/hello-your-name-here/index.html b/tutorials/lucid_v1/mojo/hello-your-name-here/index.html new file mode 100644 index 0000000..7a5c542 --- /dev/null +++ b/tutorials/lucid_v1/mojo/hello-your-name-here/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Hello YOUR_NAME_HERE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/index.html b/tutorials/lucid_v1/mojo/index.html new file mode 100644 index 0000000..5a6a0b2 --- /dev/null +++ b/tutorials/lucid_v1/mojo/index.html @@ -0,0 +1,749 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

These are the original Lucid V1 tutorials for the Mojo.

+ +
+ + +
+
+

Your First FPGA Project

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Synchronous Logic

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Io Shield

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Components

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

ROMs and FSMs

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Hello YOUR_NAME_HERE

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

External IO

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Analog Inputs

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Servos

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Basic CPU

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/io-shield/index.html b/tutorials/lucid_v1/mojo/io-shield/index.html new file mode 100644 index 0000000..c04e061 --- /dev/null +++ b/tutorials/lucid_v1/mojo/io-shield/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Io Shield + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/page/1/index.html b/tutorials/lucid_v1/mojo/page/1/index.html new file mode 100644 index 0000000..370ea7e --- /dev/null +++ b/tutorials/lucid_v1/mojo/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/lucid_v1/mojo/page/2/index.html b/tutorials/lucid_v1/mojo/page/2/index.html new file mode 100644 index 0000000..391bf57 --- /dev/null +++ b/tutorials/lucid_v1/mojo/page/2/index.html @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

These are the original Lucid V1 tutorials for the Mojo.

+ +
+ + +
+
+

Register Interface

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Camera

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

SDRAM

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

HDMI

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Sound Locating

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/register-interface/index.html b/tutorials/lucid_v1/mojo/register-interface/index.html new file mode 100644 index 0000000..4d013fb --- /dev/null +++ b/tutorials/lucid_v1/mojo/register-interface/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Register Interface + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/roms-and-fsms/index.html b/tutorials/lucid_v1/mojo/roms-and-fsms/index.html new file mode 100644 index 0000000..92f5b73 --- /dev/null +++ b/tutorials/lucid_v1/mojo/roms-and-fsms/index.html @@ -0,0 +1,561 @@ + + + + + + + + +ROMs and FSMs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/sdram/index.html b/tutorials/lucid_v1/mojo/sdram/index.html new file mode 100644 index 0000000..d9da689 --- /dev/null +++ b/tutorials/lucid_v1/mojo/sdram/index.html @@ -0,0 +1,561 @@ + + + + + + + + +SDRAM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/servos/index.html b/tutorials/lucid_v1/mojo/servos/index.html new file mode 100644 index 0000000..1456cc8 --- /dev/null +++ b/tutorials/lucid_v1/mojo/servos/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/sound-locating/index.html b/tutorials/lucid_v1/mojo/sound-locating/index.html new file mode 100644 index 0000000..d45efa6 --- /dev/null +++ b/tutorials/lucid_v1/mojo/sound-locating/index.html @@ -0,0 +1,555 @@ + + + + + + + + +Sound Locating + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/synchronous-logic/index.html b/tutorials/lucid_v1/mojo/synchronous-logic/index.html new file mode 100644 index 0000000..8a8c6f3 --- /dev/null +++ b/tutorials/lucid_v1/mojo/synchronous-logic/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Synchronous Logic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/mojo/your-first-fpga-project/index.html b/tutorials/lucid_v1/mojo/your-first-fpga-project/index.html new file mode 100644 index 0000000..cb8b244 --- /dev/null +++ b/tutorials/lucid_v1/mojo/your-first-fpga-project/index.html @@ -0,0 +1,555 @@ + + + + + + + + +Your First FPGA Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/page/1/index.html b/tutorials/lucid_v1/page/1/index.html new file mode 100644 index 0000000..584f15d --- /dev/null +++ b/tutorials/lucid_v1/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/lucid_v1/roms-and-fsms/index.html b/tutorials/lucid_v1/roms-and-fsms/index.html new file mode 100644 index 0000000..49161c4 --- /dev/null +++ b/tutorials/lucid_v1/roms-and-fsms/index.html @@ -0,0 +1,556 @@ + + + + + + + + +ROMs and FSMs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/synchronous-logic/index.html b/tutorials/lucid_v1/synchronous-logic/index.html new file mode 100644 index 0000000..9506763 --- /dev/null +++ b/tutorials/lucid_v1/synchronous-logic/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Synchronous Logic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/lucid_v1/your-first-fpga-project/index.html b/tutorials/lucid_v1/your-first-fpga-project/index.html new file mode 100644 index 0000000..836096c --- /dev/null +++ b/tutorials/lucid_v1/your-first-fpga-project/index.html @@ -0,0 +1,878 @@ + + + + + + + + +Your First FPGA Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ +
+
+ +

Your First FPGA Project

+ + + + +
+ + + + +
+
+ + Table of Contents + + +
+ +
+
+
+ + + + + +
+

This tutorial will walk you through creating your first project and making the onboard LED light up when you press the +reset button.

+ +

Before you start you need to have your environment setup. +Head over to the setup tutorial if you haven’t already.

+

Creating a New Project

+

Launch Alchitry Labs. After click through the welcome screen, you should see the following.

+

Alchitry Labs

+

Click on File->New Project. In the dialog that pops up enter a Project Name of LEDtoButton. You can leave +the default workspace if you want or browse for a different one. This is where all your projects will be stored

+

Use the drop-down menu to choose the board you are using.

+

Leave the language set to Lucid and From Example set to Base Project. This will copy a bare-bones project as the +starting point.

+

It should now look something like this. Note that your workspace will be different.

+

New Project Dialog

+

Click Create to create your project.

+

Back in the main window, expand the tree on the left to find the top file inside of Source. This has the name of * +board_top.luc*. Double click on it to open it in the editor.

+

Alchitry Labs Open Project

+

The top file contains all the external inputs and outputs of your design. Your future projects can be built out of many +modules, but they all must be sub-modules to this top module. This will be covered more in a later tutorial. For now, we +will make all our edits to this file.

+

Conveniently, the default file has all the basic inputs and outputs that are hardwired to the FPGA already declared. +This way you can just use them without having to look up what pins they connect to.

+

Note that if you using the Mojo the top files looks a little difference. You may have noticed the yellow underline under +all of the inputs. This is because we aren't using them currently and the IDE is just giving us a warning. The Mojo has +an AVR microcontroller on the board that the FPGA can talk to. There are connections defined in the top module that are +used for this.

+

If you hover your cursor over a warning or error, text will show up to let you know what is going on. Also when you +attempt to build your project (click the hammer icon) all the warnings and errors will be printed in the console.

+

The Contents of a Module

+

Before we continue on, let's cover the basics of what makes up a module and what a module even is. A module is way to +organize your project into smaller pieces broken apart by function. It is very similar to the concept of functions when +programming where you break down your program into smaller more manageable pieces. Modules are also nice because they +can be reused in multiple parts of your design.

+

Module Declaration

+

The first part of any module is the module declaration. This is lines 1 through 14, reproduced below.

+
module au_top (
+    input clk,              // 100MHz clock
+    input rst_n,            // reset button (active low)
+    output led [8],         // 8 user controllable LEDs
+    input usb_rx,           // USB->Serial input
+    output usb_tx           // USB->Serial output
+  ) {
+
+

It always starts off with the module keyword followed by the name of the module. In this case it is au_top. It is +convention to name your module the same thing as the file name.

+

After the module name comes an optional parameter declaration, this isn't used in our module and it will be covered +in a later tutorial.

+

After that is the port declaration. This is where you specify all the inputs, outputs, and inouts of +your module. An inout is a bi-directional port and will also covered in a later tutorial.

+

Most of the ports in this module are single bit signals. However, the outputs led and spi_channel, on the Mojo, are +a multi-bit signals. led consists of 8 bits and spi_channel is 4 bits. This is declared by the [8] and [4] after +the signal's names, respectively.

+

The reason led is 8 bits wide, is because the board has 8 LEDs on it! Each bit of the signal connects to one of the +LEDs on the board.

+

We only care about two of these ports for our project, led and rst_n. As you may have guessed, rst_n connects to +the reset button. The _n part of it's name is because the signal is active low (as stated in the comment). This means +that the value is typically 1 (high), but when the button is pressed (active) it is 0 (low).

+

The Always Block

+

There is some stuff before the always block, but we will get back to that later (it will make more sense then). So for +now, just ignore it.

+

Always blocks are where all the magic happens. It is where you can perform computation and read/write signals. The +always block gets its name because it is always happening. When the tools see an always block, they need to generate a +digital circuit that will replicate the behavior that the block describes. Let's take a look at the always block in +our code.

+
17always { +
18 reset_cond.in = ~rst_n; // input raw inverted reset signal +
19 rst = reset_cond.out; // conditioned reset +
20 +
21 led = 8h00; // turn LEDs off +
22 +
23 usb_tx = usb_rx; // echo the serial data +
24} +
+

Notice I said the tools need to replicate the block's behavior and not the block. That is because inside an always +block, statements that appear lower in the block have priority over earlier statements. This is similar to +programming, and this abstraction makes it so much easier to program complex logic. However, it is important to +understand you are not programming and this is just an abstraction. To make this clear take a look at this example.

+
always {
+  led = 8h00;             // turn LEDs off
+  led = 8hFF;             // turn LEDs on
+}
+
+

What would you expect this always block to do? If you have a programming background, you may be tempted to think that +the LEDs would continuously turn on and off. You're not in Kansas anymore Dorthy, this isn't programming and that's not +what happens. Remember, there is no processor to run code (that is unless you explicitly make one, like a boss). When +the tools see this block, they completely ignore the first line. This is because the second line has higher priory. If +you were to synthesize this design, the tools would hard-wire the led signal to 8hFF (all 1s).

+

Back to our design. Were we are assigning four signals a value (six on the Mojo). Note that every output of a module * +must* have a value assigned to it at all times. Since we aren't using these outputs, they are assigned with some +reasonable defaults. Let's take a quick detour and look at how values are represented in Lucid.

+

Representing Values

+

A value is made of one or more bits. The number of bits a value has is known as its width. There are a few ways to +specify a value, some use an implied width while others allow you to explicitly set a width. If you are unfamiliar with +binary or hexadecimal please read the Encodings Tutorial before continuing.

+

The first way to represent a value is to just type a decimal number. For example, 9.

+

Sometimes it’s easier to specify a number with a different radix than 10 (the implied default). Lucid supports three +different radix, 10 (decimal), 16 (hexadecimal), and 2 (binary). To specify the radix, prepend d, h, or b to specify +decimal, hexadecimal, or binary respectively. For example, hFF has the decimal value 255 and b100 has the decimal value +4. If you don’t append a radix indicator, decimal is assumed.

+

It is important to remember that all number will be represented as bits in your circuit. When you specify a number this +way, the width of the number will be the minimum number of bits required to represent that value for decimal. For +binary, it is simply the number of digits and for hexadecimal it is four times the number of digits. For example, the +value 7 will be three bits wide (111), 1010 will be four bits wide, and hACB will be 12 bits wide.

+

Sometimes you need more control over the exact width of a number. In those cases you can specify the number of bits by +prepending the number of bits and radix to the value. For example, 4d2 will be the value 2 but using 4 bits instead of +the minimum 2 (binary value 0010 instead of 10). You must specify the radix when specifying the width to separate the +width from the value.

+

If you specify a width smaller than the minimum number of bits required, the number will drop the most significant bits. +When this happens you will get a warning.

+

Z and X

+

When you specify a decimal number, all the bits in your value will be either 0 or 1. However, each bit can actually be +one of four values, 0, 1, x, or z. The values of 0 and 1 are fairly self explanatory, it just means the bit is high (1) +or low (0). The value of x means don't care. It means you want to assign a value, but you really don't care if it is +1 or 0. This is useful for the synthesizer because your circuit may be simpler in one of the cases and it gives the +tools the freedom to choose. During simulation, x also means unknown. Z means that the bit is high-impedance or +tri-stated. This means that it is effectively disconnected. Note that FPGAs can't realize high-impedance signals +internally, so the only time you should use z is for outputs of the top module.

+

Back to our always block, the first two lines connect the input rst_n to the input of the reset_cond module. Modules +can be nested which makes it possible to reuse them and helps make your project manageable. This is all covered later in +more detail so don't get hung up over this yet. The only important thing to know about these two lines, is that the +rst_n signal is active low (0 when the button is pressed, 1 otherwise) while the rst signal is active high.

+

The next line assigns the led output to all zeros. This turns off all the LEDs.

+

On the Alchitry boards, the last line connects the serial input pin to the serial output pin effectively echoing +anything the FPGA receives over the serial port. We could have also tied this pin to 1 to disable it.

+

On the Mojo, the last three lines assign the outputs to z. This is because they aren't being used and we shouldn't drive +these as they connect directly to the microcontroller on the Mojo (to use these you have to wait for the microcontroller +to signal that it is ready first, this is also covered later).

+

Looking at this always block, we can see there are no redundant assignments (like in our led on/off example). That means +these signals will literally be connected to these values.

+

Connecting the Button

+

We are going to modify the module to connect the reset button to the first LED so that when you push the button the LED +turns on.

+

To do this we need to modify line 21, where led is assigned.

+
21led = c{7h00, rst}; // connect rst to the first LED +
+

The output led is an 8 bit array. That means when you assign it a value you need to provide an 8 bit array. However, +the signal rst is a single bit wide. To compensate for this we use the concatenation operator.

+

To concatenate multiple arrays into one, you can use the concatenation operator, c{ x, y, z }. Here the arrays (or +single bit values) x, y, and z will be concatenated to form a larger array.

+

In our code we are concatenating the constant 7h0 with rst. The constant here is seven zeros. The 7 represents the +size, h represents the number base (in this case hexadecimal) and 0 represents the value. Since we just need a bunch of +zeros, the number base doesn’t really matter and we could have used 7b0, or 7d0, for binary or decimal respectively.

+

Note that values are zero padded if the specified width is larger than the size required to store the value. For +example, 4b11 would the same as 4b0011.

+

If you don’t care about how many bits a values takes up, you don’t have to specify it. The minimum number of bits that +will still fit the value will be used. For example, b1101 is exactly the same as 4b1101. If you are using decimal, +you can even drop the d so 4d12 is the same as d12 which is the same as just 12. However, when you are +concatenating values, you should always specify a width to make it obvious how big the array will be.

+

Building Your Project

+

Go ahead and click the little hammer icon in the toolbar to build your project. You may need to first specify where you +installed the builder.

+

For the Au, use Settings->Vivado Location... and point it to the Xilinx/Vivado/YEAR.MONTH folder.

+

For the Cu, use Settings->iCEcube2 Location... and point it to the lscc/iCEcube2 folder. You will also need to use +Settings->iCEcube2 License Location... to point it to the license file you downloaded when you installed iCEcube2.

+

For the Mojo, use Settings->ISE Location... and point it to the Xilinx/14.7 folder.

+

Once set you should be able to build your project.

+

As the project builds you should see a bunch of text spit out. Just wait for it to finish building. It should look like +this.

+

Alchitry Labs Project Built

+

The important line here is where it says Finished building project. This means that the IDE was able to find a .bin +file after. If you ever get a red message telling you the bin file couldn't be found you should scroll up through the +build messages for the error that caused it to fail.

+

Loading Your Project

+

With your project built, plug your board into your computer if you haven’t already.

+

If you are using the Mojo, go to Settings->Serial Port... and select the serial port the Mojo is connected to.

+

The Alchitry boards are detected automatically.

+

It is time to load your project onto the board. You have two options. The first is the hollow arrow, this will write +your configuration directly to the FPGA's RAM. The second is the solid arrow, this will write your configuration to the +FLASH memory on the board (as well as the FPGA). If you program to the FPGA's RAM, your configuration will be lost when +the board loses power. However, if you program to the FLASH, your configuration will be automatically loaded when the +board is powered up.

+

The Alchitry Cu doesn't support loading directly to the FPGA.

+

If you program to RAM and then power cycle the board, the last configuration written to FLASH will automatically be +loaded. This is helpful when you want to temporarily try out some configuration.

+

If you want to stop the FPGA from being configured at power up, you can click the eraser icon. This will wipe the FLASH +memory and clear the FPGA's current configuration.

+

Go ahead and click the arrow to program the FPGA.

+

Alchitry Labs Programming

+

Now look at your board. You should see the DONE LED on. This means that the configuration was loaded successfully to +the FPGA.

+

Done LED

+

Now push the reset button.

+

Button Pressed

+

Notice the LED turned on!

+

Some Notes on Hardware

+

When you press the button, how long does it take for the LED to turn on? If this was a processor instead of an FPGA, the +processor would be in a loop reading the button state and turning the LED on or off based on that state. The amount of +time between pressing it and when the LED turns on would vary depending on what code the processor was executing and how +long it is until it gets back to reading the button and turning the LED on. As you add more code to your loop, this time +and variation gets bigger.

+

However, an FPGA is different. With this design (note I said design and not code), the button input is directly +connected to the LED output. You can imagine a physical wire bridging the input to the output inside the FPGA. In +reality, it's not a wire but a set of switches (multiplexers) that are set to route the signal directly to the output. +Well, this is only partially true since the reset_conditioner is there which does some stuff to clean up the reset +signal.

+

Since the signal doesn’t have to wait for a processor to read it, it will travel as fast as possible through the silicon +to light the LED. This is almost instant (again, forget about the reset_conditioner)! The best part is that if you +wire the button the LED then go on to create some crazy design with the rest of the FPGA, the speed of this will not +slow down. This is because the circuits will operate independently as they both simply exist. It is this parallelism +where FPGAs get their real power.

+

Duplication

+

What if we want all the LEDs to turn on and off with the press of the button instead of just one?

+

Well we could do it using concatenation just like before by replacing line 20 with the following.

+
20led = c{rst,rst,rst,rst,rst,rst,rst,rst}; +
+

However, there is a better way! This is where the array duplication syntax comes in handy. The syntax is M x{ A }. +Here M is the number of times to duplicate A. That means we can make line 20 look like this.

+
20led = 8x{rst}; +
+

Much cleaner! This does exactly the same thing as before, but requires a lot less typing.

+

Array Indexing

+

There is an alternative way to write the code where we only want one LED to light. This is by assigning the parts of the +led array separately.

+
20led[7:1] = 7h0; // turn these LEDs off +
21led[0] = rst; // connect rst to led[0] +
+

On line 20, the bit selector [7:1] is used to select the bits 7 through 1 of the led array. These seven bits are set +to 0.

+

On line 21, [0] is used to select the single bit, 0, and set it to rst.

+

There are two ways to select a group of bits. The first one (and most common) is the one used above where you specify +the start and stop bits (inclusive) explicitly. The other way is to specify a start bit and the total number of bits to +include above or below the start bit.

+

Line 20 could be rewritten as any of the following.

+
led[7:1] = 7b0;  // select bits 7-1
+led[7-:7] = 7b0; // select 7 bits starting from 7 and going down
+led[1+:7] = 7b0; // select 7 bits starting from 1 and going up
+
+

The benefit of using the start-width syntax is the width is guaranteed to be constant. This means you can use a signal +to specify the start index. This will be covered in a later tutorial.

+

Always Blocks

+

Due to the nature of always blocks, you could also write the LED assignment as follows.

+
led = 8b0;              // turn the LEDs off
+led[0] = rst;           // connect rst to led[0]
+
+

Because the second statement has priority over the first, led[0] will actually NEVER have the value 0! It will be +permanently connected to rst. Note that the second line only assigns the first bit of led. That means that the other +7 bits will still receive their value from the first statement.

+

This is one of the weird things of working with hardware. The code you write is not run on a processor like it is when +you program. Instead, the code you write is interpreted by the tools to figure out what behavior you want. The tools +then create a circuit that will match that behavior.

+

Always blocks are an easy way to describe complex behavior, but the way you describe the behavior and it's actual +implementation can vary.

+

Congratulations! You've finished your first tutorial on Lucid.

+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/page/1/index.html b/tutorials/page/1/index.html new file mode 100644 index 0000000..5d12ca1 --- /dev/null +++ b/tutorials/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/projects/clock-clock/index.html b/tutorials/projects/clock-clock/index.html new file mode 100644 index 0000000..bb30dd8 --- /dev/null +++ b/tutorials/projects/clock-clock/index.html @@ -0,0 +1,556 @@ + + + + + + + + +Clock Clock + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/projects/gpu/index.html b/tutorials/projects/gpu/index.html new file mode 100644 index 0000000..a7361d9 --- /dev/null +++ b/tutorials/projects/gpu/index.html @@ -0,0 +1,550 @@ + + + + + + + + +GPU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/projects/hexapod/index.html b/tutorials/projects/hexapod/index.html new file mode 100644 index 0000000..74289ef --- /dev/null +++ b/tutorials/projects/hexapod/index.html @@ -0,0 +1,550 @@ + + + + + + + + +Hexapod + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/projects/index.html b/tutorials/projects/index.html new file mode 100644 index 0000000..b8c985f --- /dev/null +++ b/tutorials/projects/index.html @@ -0,0 +1,574 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

TODO

+ +
+ + +
+
+

GPU

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Clock Clock

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Hexapod

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/projects/page/1/index.html b/tutorials/projects/page/1/index.html new file mode 100644 index 0000000..eadce0e --- /dev/null +++ b/tutorials/projects/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/setup/icecube2/index.html b/tutorials/setup/icecube2/index.html new file mode 100644 index 0000000..b52f967 --- /dev/null +++ b/tutorials/setup/icecube2/index.html @@ -0,0 +1,556 @@ + + + + + + + + +iCEcube2 Setup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/setup/index.html b/tutorials/setup/index.html new file mode 100644 index 0000000..f2e713c --- /dev/null +++ b/tutorials/setup/index.html @@ -0,0 +1,586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

Depending on your board you will need to install different software to work with it. Find the section below and follow the guides for setting up your board.

+

Every Board

+

No matter what board you have, you will need to install Alchitry Labs. Alchitry Labs is an IDE required to write Lucid code. It has a ton of useful features that are covered on its page.

+

It is now bundled with the Alchitry Loader. If you don’t want to use the Alchitry Labs IDE, you still need the Alchitry Loader to get the .bin files onto your board.

+

Au and Au+

+

Both the Au and Au+ require Vivado to build projects. This is software supplied by Xilinx. The install is fairly straightforward but does require you to make an account.

+

Cu

+

Using the Cu has never been easier. Alchitry Labs 2 now ships with the open source tools required to build projects for the Cu meaning you don't need to setup anything else.

+

The best part is that these even run on Macs (none of the proprietary tools do).

+

You can still choose to use Lattice's propriety toolchain, iCEcube2.

+

Mojo

+

The Mojo is no longer actively supported and requires Alchitry Labs V1 and the abandoned ISE tool from Xilinx.

+

Installing this on Windows 10 or newer can be a bit finicky. We have a detailed guide to help but with ISE being no longer maintained it is recommended to upgrade to an Au which uses supported tools.

+ +
+ + +
+
+

Vivado Setup

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

iCEcube2 Setup

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

ISE Setup

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/setup/ise/index.html b/tutorials/setup/ise/index.html new file mode 100644 index 0000000..c3b34e7 --- /dev/null +++ b/tutorials/setup/ise/index.html @@ -0,0 +1,550 @@ + + + + + + + + +ISE Setup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/setup/page/1/index.html b/tutorials/setup/page/1/index.html new file mode 100644 index 0000000..e4a0d24 --- /dev/null +++ b/tutorials/setup/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/setup/vivado/index.html b/tutorials/setup/vivado/index.html new file mode 100644 index 0000000..434359e --- /dev/null +++ b/tutorials/setup/vivado/index.html @@ -0,0 +1,550 @@ + + + + + + + + +Vivado Setup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/creating-a-vivado-project/index.html b/tutorials/verilog/creating-a-vivado-project/index.html new file mode 100644 index 0000000..fb5d5d7 --- /dev/null +++ b/tutorials/verilog/creating-a-vivado-project/index.html @@ -0,0 +1,550 @@ + + + + + + + + +Creating a Vivado Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/index.html b/tutorials/verilog/index.html new file mode 100644 index 0000000..3294656 --- /dev/null +++ b/tutorials/verilog/index.html @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

These tutorials focused on using Verilog without Alchitry Labs.

+

You can find the legacy Verilog Mojo Tutorials here.

+ +
+ + +
+
+

Verilog Operators

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Creating a Vivado Project

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/analog-inputs/index.html b/tutorials/verilog/mojo/analog-inputs/index.html new file mode 100644 index 0000000..25ba66d --- /dev/null +++ b/tutorials/verilog/mojo/analog-inputs/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Analog Inputs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/asynchronous-serial/index.html b/tutorials/verilog/mojo/asynchronous-serial/index.html new file mode 100644 index 0000000..638bca8 --- /dev/null +++ b/tutorials/verilog/mojo/asynchronous-serial/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Asynchronous Serial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/avr-interface/index.html b/tutorials/verilog/mojo/avr-interface/index.html new file mode 100644 index 0000000..f08bdc6 --- /dev/null +++ b/tutorials/verilog/mojo/avr-interface/index.html @@ -0,0 +1,561 @@ + + + + + + + + +AVR Interface + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/creating-an-ise-project/index.html b/tutorials/verilog/mojo/creating-an-ise-project/index.html new file mode 100644 index 0000000..ab898be --- /dev/null +++ b/tutorials/verilog/mojo/creating-an-ise-project/index.html @@ -0,0 +1,555 @@ + + + + + + + + +Creating an ISE Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/embedded-processors/index.html b/tutorials/verilog/mojo/embedded-processors/index.html new file mode 100644 index 0000000..fece787 --- /dev/null +++ b/tutorials/verilog/mojo/embedded-processors/index.html @@ -0,0 +1,555 @@ + + + + + + + + +Embedded Processors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/external-io/index.html b/tutorials/verilog/mojo/external-io/index.html new file mode 100644 index 0000000..422ef12 --- /dev/null +++ b/tutorials/verilog/mojo/external-io/index.html @@ -0,0 +1,561 @@ + + + + + + + + +External IO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/finite-state-machines/index.html b/tutorials/verilog/mojo/finite-state-machines/index.html new file mode 100644 index 0000000..dd81664 --- /dev/null +++ b/tutorials/verilog/mojo/finite-state-machines/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Finite State Machines + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/fpga-timing/index.html b/tutorials/verilog/mojo/fpga-timing/index.html new file mode 100644 index 0000000..3f2ba0c --- /dev/null +++ b/tutorials/verilog/mojo/fpga-timing/index.html @@ -0,0 +1,561 @@ + + + + + + + + +FPGA Timing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/hello-world/index.html b/tutorials/verilog/mojo/hello-world/index.html new file mode 100644 index 0000000..416c936 --- /dev/null +++ b/tutorials/verilog/mojo/hello-world/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Hello World! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/index.html b/tutorials/verilog/mojo/index.html new file mode 100644 index 0000000..d1f2264 --- /dev/null +++ b/tutorials/verilog/mojo/index.html @@ -0,0 +1,750 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

These are the legacy Verilog tutorials for the Mojo.

+

These were written before the Mojo IDE (now Alchitry Labs) or Lucid were created and are based around using ISE.

+ +
+ + +
+
+

Creating an ISE Project

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Synchronous Logic

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Pulse Width Modulation

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Writing Test Benches

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

External IO

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Metastability and Debouncing

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

FPGA Timing

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Finite State Machines

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Hello World!

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Servos

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/memory-mapping/index.html b/tutorials/verilog/mojo/memory-mapping/index.html new file mode 100644 index 0000000..b1661b3 --- /dev/null +++ b/tutorials/verilog/mojo/memory-mapping/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Memory Mapping + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/metastability-and-debouncing/index.html b/tutorials/verilog/mojo/metastability-and-debouncing/index.html new file mode 100644 index 0000000..4341ef9 --- /dev/null +++ b/tutorials/verilog/mojo/metastability-and-debouncing/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Metastability and Debouncing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/page/1/index.html b/tutorials/verilog/mojo/page/1/index.html new file mode 100644 index 0000000..dc59095 --- /dev/null +++ b/tutorials/verilog/mojo/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/verilog/mojo/page/2/index.html b/tutorials/verilog/mojo/page/2/index.html new file mode 100644 index 0000000..939150b --- /dev/null +++ b/tutorials/verilog/mojo/page/2/index.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+

These are the legacy Verilog tutorials for the Mojo.

+

These were written before the Mojo IDE (now Alchitry Labs) or Lucid were created and are based around using ISE.

+ +
+ + +
+
+

Analog Inputs

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

AVR Interface

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Asynchronous Serial

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Serial Peripheral Interface (SPI)

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Using Core Generator

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Memory Mapping

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

SDRAM

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ +
+
+

Embedded Processors

+
+ +
+ + + + + + + + + + + + +1 min · Justin Rajewski + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/pulse-width-modulation/index.html b/tutorials/verilog/mojo/pulse-width-modulation/index.html new file mode 100644 index 0000000..36b52df --- /dev/null +++ b/tutorials/verilog/mojo/pulse-width-modulation/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Pulse Width Modulation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/sdram/index.html b/tutorials/verilog/mojo/sdram/index.html new file mode 100644 index 0000000..fdbf97c --- /dev/null +++ b/tutorials/verilog/mojo/sdram/index.html @@ -0,0 +1,561 @@ + + + + + + + + +SDRAM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/serial-peripheral-interface/index.html b/tutorials/verilog/mojo/serial-peripheral-interface/index.html new file mode 100644 index 0000000..c6c9955 --- /dev/null +++ b/tutorials/verilog/mojo/serial-peripheral-interface/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Serial Peripheral Interface (SPI) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/servos/index.html b/tutorials/verilog/mojo/servos/index.html new file mode 100644 index 0000000..c5f6ff0 --- /dev/null +++ b/tutorials/verilog/mojo/servos/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Servos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/synchronous-logic/index.html b/tutorials/verilog/mojo/synchronous-logic/index.html new file mode 100644 index 0000000..3794ae1 --- /dev/null +++ b/tutorials/verilog/mojo/synchronous-logic/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Synchronous Logic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/using-core-generator/index.html b/tutorials/verilog/mojo/using-core-generator/index.html new file mode 100644 index 0000000..f082b3a --- /dev/null +++ b/tutorials/verilog/mojo/using-core-generator/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Using Core Generator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/mojo/writing-test-benches/index.html b/tutorials/verilog/mojo/writing-test-benches/index.html new file mode 100644 index 0000000..b1b5f0b --- /dev/null +++ b/tutorials/verilog/mojo/writing-test-benches/index.html @@ -0,0 +1,561 @@ + + + + + + + + +Writing Test Benches + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/verilog/page/1/index.html b/tutorials/verilog/page/1/index.html new file mode 100644 index 0000000..0eb33f3 --- /dev/null +++ b/tutorials/verilog/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/tutorials/verilog/verilog-operators/index.html b/tutorials/verilog/verilog-operators/index.html new file mode 100644 index 0000000..b322a21 --- /dev/null +++ b/tutorials/verilog/verilog-operators/index.html @@ -0,0 +1,550 @@ + + + + + + + + +Verilog Operators + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +