FizzBuââzzãã¹ãã¯ã1ãã100ãŸã§ã®æ°åãçæããããã°ã©ã ãäœæããŸãã3ã®åæ°ã¯ãFizzããšããåèªã«ã5ã®åæ°ã¯ãBuzzããšããåèªã«ã15ã®åæ°ã¯ãFizzBuââzzãã«çœ®ãæããããŸãã ãã®ãããªããã°ã©ã ã¯æ°è¡ã®ã³ãŒãã§å®è£ ãããŠãããããã€ã³ã¿ãã¥ãŒã®éã«ãããã°ã©ãã³ã°ã®æ¹æ³ããŸã£ããããããªã人ãé€å€ããããšããããããŸãã

ã·ãªã¢ã«-USBããŒãã«æ¥ç¶ãããMojo FPGAããŒãã ããŒãäžã®å€§ããªãããã¯Spartan 6 FPGAã§ãã
FizzBuââzzãã³ãŒãã§ã¯ãªãããžã¿ã«ããžãã¯ã«å®è£ ããã®ã¯ç¡æå³ã§ãããåŠã¶ã«ã¯è¯ãäŸã®ããã«æããŸããã 1 ãã®ãããžã§ã¯ãã§ã¯ãåå¿è åãã«ã·ã³ãã«ãªMojo V3 FPGAéçºããŒãã䜿çšããŸããã ã¶ã€ãªã³ã¯ã¹ã®Spartan 6ãã¡ããªã®FPGAãã€ã³ã¹ããŒã«ãããŠãããããã¯æå°ã®FPGAã®1ã€ã§ããã9,000ã®ããžãã¯ã»ã«ãš11,000ã®ããªã¬ãŒãåããŠãããããå€ãã®ããšãå¯èœã§ãã
FPGAã·ãªã¢ã«åºå
FPGAã«FizzBuââzzãå®è£ ãããšã¯ã©ãããæå³ã§ããïŒ ããã¯ãããŒãããã®æ±çšå ¥åºåã€ã³ã¿ãŒãã§ãŒã¹ïŒGPIOïŒã®æ¥ç¹ãäœã«ã§ãæ¥ç¶ã§ããããšãæå³ããŸãããã®ãããFizzBuââzzåºåã¯ãLEDã7ã»ã°ã¡ã³ãã€ã³ãžã±ãŒã¿ãŒãLCDãVGAã¢ãã¿ãŒãªã©ã®ããŸããŸãªåœ¢åŒã§è¡šç€ºãããŸãã ã·ãªã¢ã«ãã£ãã«ãä»ãã端æ«ãžã®ããã¹ãåºåã¯ããæšæºãã®FizzBuââzzããã°ã©ã ã®ç²Ÿç¥ãšæãäžèŽããŠãããšå€æããŸããã ãããã£ãŠãæåã«ããããšã¯ãã·ãªã¢ã«åºåãFPGAã«å®è£ ããããšã§ãã
ã·ãªã¢ã«éä¿¡ã®åºæ¬çãªèãæ¹ã¯ããããã1ã€ãã€éä¿¡ããããšã§ãã RS-232ã·ãªã¢ã«ããŒãã¯ã1960幎ã«ãã¬ã¿ã€ããšã¢ãã ãæ¥ç¶ããããã«èæ¡ããããã·ãªã¢ã«ããŒã¿éä¿¡çšã®ã·ã³ãã«ãªãããã³ã«ã§ãã 以äžã®å³ã¯ããFãæåïŒãã€ããª01000110ïŒããã£ãã«ãä»ããŠé 次éä¿¡ãããæ¹æ³ã瀺ããŠããŸãã æåã«ãæåã®éå§ã瀺ãéå§ãããïŒãŒãïŒãéä¿¡ãããŸãã 2 次ã«ãæåã®8ããããéã®é åºã§éä¿¡ãããŸãã æåŸã«ãã¹ãããããããéä¿¡ãããŸãã æåéã§ã¯ãããŒã¯æ¬¡ã®æåãéä¿¡ããããŸã§åŸ æ©ã¢ãŒãïŒ1ïŒã®ãŸãŸã§ãã 9600ããŒã®äŒéé床ã§ã¯ãåãããã®äŒéã«ã¯1/9600ç§ããããŸãã ããªãã£ããããš1ã¹ããããããã®ãªã8ããŒã¿ãããã䜿çšãããã®ãããã³ã«ã¯ã8N1ãšããŠç¥ãããŠããŸãã ã·ãªã¢ã«ããŒã¿è»¢éã«ã¯å€ãã®ãããã³ã«ããããŸããã9600 8N1ã¯éåžžã«äžè¬çã§ãã

ãFãæåã®ââ9600ããŒ/ 8N1ã·ãªã¢ã«äŒé
ãã®ã·ãªã¢ã«äŒéãå®è£ ããæåã®ã¹ãããã¯ãåãããã«1/9600ç§ééãäœæããããšã§ãã ãã®ééã¯ãMojoããšã«5208ã¯ããã¯ãã«ã¹ãã«ãŠã³ãããããšã§æž¬å®ãããŸãã 3 0ã5207ãå®æçã«ã«ãŠã³ãããããã®13ãããã«ãŠã³ã¿ãŒãäœæããŸãããåçŽãªã¹ããŒããã·ã³ã¯ãåã€ã³ã¿ãŒãã«ã§åºåããããããã远跡ããŸãã ã¹ã¿ãŒããããã§éå§ãã8ããŒã¿ããããšã¹ãããããããåŠçãããšãã«ç¶æ ãå€æŽããŸãã ç¶æ ã¯4ãããã¬ãžã¹ã¿ã«æ ŒçŽãããŸãïŒäžè¬ã«ãFPGAã§ã¯ãå€æ°ã®ã¯ããã¯ãã«ã¹ãã«ãŠã³ã¿ãŒãããã³ã¹ããŒããã·ã³ãåŠçããå¿ èŠããããŸãïŒã
FPGAã§ééããã³ç¶æ ã¬ãžã¹ã¿ãäœæããããã«ãVerilogããŒããŠã§ã¢èšè¿°èšèªã§ã³ãŒããèšè¿°ããŸããã Verilogã®è©³çŽ°ã¯èª¬æããŸãããã©ã®ããã«æ©èœããããç解ããŠãã ããã 次ã®ã³ãŒãã§ã¯ãæåã®è¡ã§13ããã
counter
ã¬ãžã¹ã¿ãš4ããã
state
ã¬ãžã¹ã¿ãæå®ããŠããŸãã ã«ãŠã³ã¿ãŒã¯5207ã«å¢åããããã®åŸ0ã«ãªã»ãããããŸããã
state
1ãã€å¢åãããŠæ¬¡ã®åºåããããåŠçããŸãã ïŒ
<=
ã¯æ¯èŒæŒç®åã§ã¯ãªãä»£å ¥æŒç®åã§ããããšã«æ³šæããŠãã ãã4 ïŒ
always @(posedge clk)
ã¯ãæç¶ãåãããã¯ãã¯ããã¯åšæ³¢æ°ã®æ£ã®ãšããžã§ããªã¬ãŒãããããšã瀺ããŸãã
reg [12:0] counter; reg [3:0] state; always @(posedge clk) begin if (counter < 5207) begin counter <= counter + 1; end else begin counter <= 0; state <= state + 1; end end
ããã¯éåžžã®ããã°ã©ã ã³ãŒãã®ããã«èãããŸããããŸã£ããç°ãªãæ¹æ³ã§åäœããŸãã äžè¬çãªããã°ã©ãã³ã°èšèªã§ã¯ãããã°ã©ã ã¯è¡ããšã«å®è¡ããããããéåžžãæäœã¯é 次å®è¡ãããŸãã ããšãã°ãããã»ããµã¯
counter
ã®å€ããã§ãã¯ããŸãã 次ã«ã
counter
1ãè¿œå ããŸãã ãã ããVerilogã«ã¯ããã»ããµãå®è¡å¯èœããã°ã©ã ã¯ãããŸããã 代ããã«ãã³ãŒãã¯æäœçšã®ããŒããŠã§ã¢ãäœæããŸãã ããšãã°ã
counter
ãå¢ããã«ã¯1ã€ã®è¿œå ã¹ããŒã ãäœæããã
state
ãå¢ããã«ã¯å¥ã®ã¹ããŒã ãäœæãããŸãã 5207ãšã®æ¯èŒã®ããã«è¿œå ã®ããžãã¯ãäœæãããŸããã·ãªã¢ã«ããã»ããµãšã¯ç°ãªããFPGAã¯ãã¹ãŠã䞊åã«å®è¡ããŸãã ããšãã°ãFPGAã¯5207æ¯èŒãåæã«å®è¡ãã
counter
å¢ãããŠãªã»ããããåã¯ããã¯ãµã€ã¯ã«ã§
state
ãå¢ãããŸãã ãã®ãããé«åºŠãªäžŠåã¿ã¹ã¯ã§ã¯ãFPGAã¯ããã»ããµãããã¯ããã«é«éã«ãªããŸãã
ã³ãŒãã®æ¬¡ã®éšåã¯ãåç¶æ ã«å¯Ÿå¿ããããããåºåããŸãã åãšåãããã«ãéåžžã®ããã°ã©ã ã³ãŒãã®ããã«èŠããŸãããé£ç¶ããŠå®è¡ãããæäœã§ã¯ãªããããŒããŠã§ã¢åè·¯ãçæããŸãã ãã®å Žåãã³ãŒãã¯è«çã²ãŒãïŒæ¬è³ªçã«ãã«ããã¬ã¯ãµïŒãäœæããŠãæ£ãã
out
å€ãéžæ
out
ãŸãã
case (state) IDLE: out = MARK; // high START: out = SPACE; // low BIT0: out = char1[0]; BIT1: out = char1[1]; ... BIT6: out = char1[6]; STOP: out = MARK; default: out = MARK; endcase
å®æ°ãèšå®ããã«ãŠã³ã¿ãŒãåæåããåæåã®éä¿¡ãéå§ããã³åæ¢ããã³ãŒãããŸã ãããŸãããäžèšã®ã³ãŒãã¯ãVerilogãã©ã®ããã«æ©èœãããã®äžè¬çãªã¢ã€ãã¢ãæäŸããŸãã ã·ãªã¢ã«ããŒã¿åºåã®ãã¹ãŠã®ã³ãŒãã¯ãã¡ããã芧ãã ãã ã
FizzBuââzzã¢ã«ãŽãªãºã
次ã®ã¹ãããã¯ãç¹ã«ã·ãªã¢ã«ãªã³ã¯ãä»ããŠéä¿¡ãããã®ã決å®ããããšã§ãã ASCIIæåã§1ãã100ãŸã§ã®æ°åãå€æããæ¹æ³ã¯ïŒ ããã¯ãã€ã¯ãããã»ããµã§ã¯ç°¡åã§ãããããžã¿ã«ããžãã¯ã§ã¯å°é£ã§ãã åé¡ã¯ã2é²æ°ã10é²æ°ã«å€æããã«ã¯10ãš100ã§é€ç®ããå¿ èŠããããé€ç®ããã«ãã«å®è£ ããã«ã¯éåžžã«äžäŸ¿ã§ããããšã§ãã 䜿ãããšã«ããŸãã
3æ¡ã®æ°åãåå¥ã«ä¿åãã2é²10é²ã«ãŠã³ã¿ãŒïŒBCDïŒã ããã«ãããã«ãŠã³ã¿ãŒãå°ãè€éã«ãªããŸãããããŒããã«ãŠã³ã¿ãŒåè·¯ã«å°å ¥ãããŠã9ããããæ¹åãŸãã¯å¥ã®æ¹åã«ãªãŒããŒãããŒãããšãã«ã«ãŠã³ãããã»ã¹ãä¿®æ£ãããããã«ããããã§ãã ãããããã®åŸãçªå·ã®çºè¡ãç°¡çŽ åããŸããã
3æ¡ã®ã«ãŠã³ã¿ãŒçšã®BCDã¢ãžã¥ãŒã«ïŒ ãœãŒã¹ã³ãŒã ïŒãäœæããŸããã 3ã€ã®4ãããã«ãŠã³ã¿ãŒ
digit2
ã
digit1
ãããã³
digit0
ãŸãã
increment
ãã©ã°ã¯ãã«ãŠã³ã¿ãŒã®å¢å ã瀺ããŸãã éåžžã
digit0
ã®ã¿
digit0
ã ãããã9ã«éãããš0ã«å€ããã
digit1
ãå¢å ããŸãã
digit1
ã9ã«ãªããšã0ã«ãªãã
digit2
ãå¢å ããŸãã ãããã£ãŠã000ãã999ãŸã§ã®ã«ãŠã³ãããŠã³ããããŸãã
if (increment) begin if (digit0 != 9) begin // Regular increment digit 0 digit0 <= digit0 + 1; end else begin // Carry from digit 0 digit0 <= 0; if (digit1 != 9) begin // Regular increment digit 1 digit1 <= digit1 + 1; end else begin // Carry from digit 1 digit1 <= 0; digit2 <= digit2 + 1; end end end
åãšåãããã«ãããã¯éåžžã®ããã°ã©ã ã®ããã«èŠããã ãã§ãããå®éã«ã¯ãã³ãŒãã¯åã¯ããã¯ãµã€ã¯ã«ã§æ°ããå€
digit2
ã
digit1
ããã³
digit0
ãçæãã
digit2
è«çã²ãŒãã«
digit1
ãŸãã ã·ã¹ãã ã¯åœä»€ãé çªã«å®è¡ããªããããããã©ãŒãã³ã¹ã¯åœä»€ã®æ°ã«ãã£ãŠå¶éãããããã«ããäŒæããä¿¡å·ã®é 延ã«ãã£ãŠã®ã¿å¶éãããŸãã
次ã®ã¿ã¹ã¯ã¯ã3ãš5ã«ããé€ç®æ§ããã§ãã¯ããããšã§ããåçŽãªé€ç®ãšããŠãæ®ãã®é€ç®ããã€ã¯ãããã»ããµã§å®è£ ããã®ã¯ç°¡åã§ãããããžã¿ã«ããžãã¯ã§ã¯å°é£ã§ãã çµã¿èŸŒã¿ã®é€ç®æäœã¯ãªãããã倧éã®ãã«ããäœæããå¿ èŠããããŸãã IDEã¯æ®ããåå²ããããã«ããããåæã§ããŸãããããã¯ç¡å³ã§ãã 代ããã«ã3ãš5ã§å²ã£ãæ®ãã®ã«ãŠã³ã¿ãŒãäœæããŸãããããšãã°ãmod3ã¯åã«0ã1ã2ã0ã1ã2 ... 5ãåºåããŸãã
FizzBuââzzã®æåŸã®éšåã¯ãåè¡ãæåããšã«è¡šç€ºããã³ãŒãã§ãã ããã°ã©ã ã§ã¯ãåæåã«å¯ŸããŠé 次åºåããã·ãŒãžã£ãåŒã³åºãããšãã§ããŸãã ããããFPGAã§ã¯ãå¥ã®ã¹ããŒããã·ã³ã䜿çšããŠåºåã«éä¿¡ãããæåã远跡ããå¿ èŠããããŸãã åæ¡ãASCIIã«å€æãããšãããã€ããª11ã¯ãããã«å¥åŠãª
2'b11
æ§æã䜿çšããŠé£çµãããããšã«æ³šæããŠãã ããã ããã«èšèŒãããŠããã³ãŒãã¯å°ãåçŽåãããŠããŸãã å®å šãªã³ãŒãã«ã¯ãå é ã«ãŒãã®ãã§ãã¯ãå«ãŸããŠãããããã001ãã¯ã1ããšããŠåºåãããŸãã
state <= state + 1; // Different state from serial if (mod3 == 0 && mod5 != 0) begin // Fizz case (state) 1: char <= "F"; 2: char <= "i"; 3: char <= "z"; 4: char <= "z"; 5: char <= "\r"; 6: begin char <= "\n"; state <= NEXT; // Done with output line end endcase end else if (mod3 != 0 && mod5 == 0) begin ... Buzz case omitted ... end else if (mod3 == 0 && mod5 == 0) begin ... Fizzbuzz case omitted ... end else begin // No divisors; output the digits of the number. case (state) 1: char <= {2'b11, digit2[3:0]}; 2: char <= {2'b11, digit1[3:0]}; 3: char <= {2'b11, digit0[3:0]}; 4: char <= "\r"; 5: begin char <= "\n"; state <= NEXT; end endcase end
ãã¹ãŠããŸãšãããšãæçµçãªFizzBuââzzã¹ããŒã ã¯å€æ°ã®ã¹ããŒããã·ã³ãšã«ãŠã³ã¿ãŒã§æ§æãããŸãã ã¡ã€ã³ã¹ããŒããã·ã³ã¯äžèšã®ã³ãŒããå¶åŸ¡ããæååã®æåã移åããŸãã ã·ã³ãã«ããšã«ãã¹ããŒããã·ã³ã¯ã·ãªã¢ã«åºåã¢ãžã¥ãŒã«ãã¢ã¯ãã£ãã«ããã·ã³ãã«ã®åºåãåŸ ã¡ãŸãã ã¢ãžã¥ãŒã«å ã§ãã¹ããŒããã·ã³ã¯ã·ã³ãã«ã®åããããééããŸãã ããŒã¡ãŒã¿ãŒããããå¹ ãã«ãŠã³ããããŸã§åŸ æ©ããŸãã ã·ã³ãã«è»¢éãå®äºãããšãã·ãªã¢ã«åºåã¢ãžã¥ãŒã«ã¯ã¡ã€ã³ã¹ããŒããã·ã³ã«ä¿¡å·ãéä¿¡ããŸãã ãããã圌ã¯ãã®è¡ã®æ¬¡ã®ãã£ã©ã¯ã¿ãŒã«è¡ããŸãã ã©ã€ã³ãå®äºãããšãã¡ã€ã³ã¹ããŒããã·ã³ã¯BCDã«ãŠã³ã¿ãŒïŒ1ãã100ãŸã§ã«ãŠã³ãïŒãã€ã³ã¯ãªã¡ã³ããã次ã®ã©ã€ã³ã®åºåãéå§ããŸãã
ããã°ã©ãã³ã°èšèªã§ã¯ãé 次æäœãã«ãŒãããµãã«ãŒãã³åŒã³åºããªã©ãç°¡åã«å®è¡ã§ããŸãã ããããFPGAã§ã¯ãã¹ããŒããã·ã³ãšã«ãŠã³ã¿ãŒã䜿çšããŠãäœãèµ·ãã£ãŠããããæ瀺çã«è¿œè·¡ããå¿ èŠããããŸãã ãã®ä»£ããã«ãFPGAã¯åŒ·åãªäžŠè¡æ§ãšå¶åŸ¡ãæäŸããŸãã
FPGAã§FizzBuââzzãå®è¡ãã
Verilogã³ãŒããã³ã³ãã€ã«ããã«ã¯ãXilinx ISEããŒã«ã䜿çšããŸããïŒä»¥äžãåç §ïŒã ãã®éçºç°å¢ã§ã¯ãã³ãŒããèšè¿°ããŠã·ãã¥ã¬ãŒãããFPGAã«ããŒãããããã®è«çåè·¯ãåæã§ããŸãã ISEããŒã«ã¯éåžžã«åçŽã§ãMojoãã¥ãŒããªã¢ã«ã§èª¬æãããŠããŸãã åæããã»ã¹ã¯ã³ã³ãã€ã«ãããã¯ããã«é ããªããŸããç§ã®FizzBuââzzããã°ã©ã ã®å ŽåãçŽ45ç§ããããŸããã

ã¶ã€ãªã³ã¯ã¹ISEããŒã«ã§Verilogã³ãŒããèšè¿°ããããšã«ãããFPGAæ©èœãããã°ã©ã ã§ããŸãã
ã·ãã¥ã¬ãŒã¿ãŒ7ã§ã³ãŒããæ©èœããã ãUSBã±ãŒãã«çµç±ã§FPGAããŒãã«ããŠã³ããŒãããŸããã FPGAåºåãã³ãUSB-to-serial 6ã¢ããã¿ãŒã«æ¥ç¶ããŸãã 端æ«ãšãã¥ã¬ãŒã¿ïŒ
screen
ïŒã䜿çšããŠãã³ã³ãã¥ãŒã¿ãŒã«ã·ãªã¢ã«åºåã衚瀺ããŸããã MojoããŒãã®ãªã»ãããã¿ã³ãã¯ãªãã¯ããŸãã-ïŒå°ãäœåã«ãããã°ããåŸïŒFizzBuââzzåºåã衚瀺ãããŸããïŒäžïŒã

ã¿ãŒããã«ãšãã¥ã¬ãŒã¿ãŒã§ã®FizzBuââzz FPGAåºåã®æåã®ããŒãž
äžã®ç»åã¯ãFPGAã䜿çšããçã®ã·ãªã¢ã«åºåããŒã¿ã瀺ããŠããŸãïŒé»è²ïŒã ããã¯ãFPGAããŒãäžã®FizzBuââzzåè·¯ã®æçµçµæã§ãããã«ã¹åã§ãã ãªã·ãã¹ã³ãŒãã«ã¯ã埩å·åãããASCIIæåïŒç·è²ïŒã衚瀺ãããŸãã ç»åã§ã¯ã2ã3ãããã³4ã®FizzBuââzzåºåïŒCRããã³LFã¯åŸ©åž°ããã³æ¹è¡æåã§ãïŒã

FizzBuââzzåºåã®éå§æã®ã·ãªã¢ã«ããŒã¿åºåä¿¡å·ïŒé»è²ïŒã ASCIIã®ãã³ãŒã-ç·
FPGAå éšã§ã¯äœãèµ·ãããŸããïŒ
Verilogåè·¯ã®èšè¿°ãããžã¿ã«ããžãã¯ã«å€æããæ¹æ³ãšãFPGAããã®ããžãã¯ãã©ã®ããã«å®è£ ããããå°ããããšãã§ããŸãã ISEåæããŒã«ã¯ãVerilogèšè¿°ã䜿çšããŠãFPGAå ã§ã®å®è£ ã«é©ããåè·¯ãçæããŸãã ãŸããVerilogã³ãŒããããããããªã¹ãããåæããããžãã¯ãšæ¥ç¶ãå®çŸ©ããŸãã 次ã«ãç¹å®ã®ãããïŒãã®å Žåã¯Spartan 6ïŒã®æ©èœã«åŸã£ãŠããªã¹ããFPGAããªããã£ãã«å€æããŸãã æåŸã«ãä¿¡å·çµè·¯ãæå°åããããã®æé©åæé ãéå§ãããŸãã

FizzBuââzzåè·¯å³
äžã®å³ã¯ãåæããŒã«ã«ãã£ãŠçæããã圢åŒã®FizzBuââzzãã§ãŒã³ã瀺ããŠããŸãã ã芧ã®ãšãããVerilogã³ãŒãã¯å€§ããªã¹ããŒã ã®ããŒã«ã«å€ãããŸãã åãããã¯ã¯ãããªã¬ãŒãè«çèŠçŽ ããã«ããã¬ã¯ãµããŸãã¯ãã®ä»ã®èŠçŽ ã§ãã ãããã¯ã¯ãã«ãŠã³ã¿ãŒãç¶æ ã¬ãžã¹ã¿ãŒãããã³FizzBuââzzããžãã¯ã§æ§æãããŠããŸãã ããžãã¯ãšã¬ã¡ã³ãã¯å€æ°ããããã«èŠããŸãããå®éã«äœ¿çšãããŠãããããé»åã¯2ïŒ æªæºã§ãã ã¯ããŒãºã¢ããïŒäžïŒã¯ããªã¬ãŒãã€ã¢ã°ã©ã ïŒãfdreããšããã©ãã«ïŒã瀺ããŠããŸã8 BCDã«ãŠã³ã¿ãŒããã®ã«ãã¯ã¢ããããŒãã«ïŒãlut5ããšããã©ãã«ïŒã Verilogã§äŸ¿å©ãªã®ã¯ãé«ã¬ãã«ã§åè·¯ãèšèšããããšã§ã-ãããŠãããã¯äœã¬ãã«ã®åè·¯ã«å€ãããŸãã ããã¯RTLïŒ ã¬ãžã¹ã¿è»¢éã¬ãã« ïŒãšåŒã°ããäœã¬ãã«ã®ããŒããŠã§ã¢å®è£ ãæ°ã«ããã«ã¬ãžã¹ã¿ãšãããã«é«ã¬ãã«ã®æäœãé©çšã§ããŸãã ããšãã°ã
count + 1
ãšèšè¿°ããã ãã§ããã€ããªå ç®åè·¯ãååŸã§ããŸãã

詳现ãªããªã¬ãŒãšæ€çŽ¢ããŒãã«ã®å³
FPGAã¯ãè«çåŒã«èå³æ·±ãææ³ã䜿çšããŠããŸãã åã ã®ã²ãŒãããªã³ã¯ãã代ããã«ãã«ãã¯ã¢ããããŒãã«ïŒLUTïŒã䜿çšãããŸããããã«ãããä»»æã®ããžãã¯ãå®è£ ããã®ã«äŸ¿å©ã§ãã åããŒãã«ã«ã¯6ã€ã®å ¥åã©ã€ã³ãããããã6ã€ã®å ¥åä¿¡å·ã§ä»»æã®çµã¿åããããžãã¯ãå®è£ ã§ããŸãã å ¥åä¿¡å·ãš64ãããã®ççå€è¡šã®64ã®ç°ãªãçµã¿åãããå€æããŸããã ãã®ããŒãã«ã64ãããã€ã¡ãŒãžãšããŠä¿åãããšãLUTã¯ä»»æã®è«çé¢æ°ãå®è£ ã§ããŸãã
ããšãã°ãåºåãã³ã®ããžãã¯ã®äžéšã¯ã以äžã®ããžãã¯åè·¯ãšåçã§ãã ã«ãã¯ã¢ããããŒãã«ã«
FFFFA8FFFFA8A8A8
64ãããå€ãæ ŒçŽããããšã§å®è£ ãããŸãã Spartan 6ãããã§ã¯ããã®LUTã¯64ãããã®ã¹ã¿ãã£ãã¯RAMã«ãããFPGAã®åæåäžã«ããŒããããŸãã ãããã«ã¯5720ã®åå¥ã®ããŒãã«ããããããå€ãã®ä»»æã®ã¹ããŒã ãå®è£ ããããã«ããã°ã©ã ã§ããŸãã

FPGAã®åäžã®ã«ãã¯ã¢ããããŒãã«ã«ãã£ãŠå®è£ ãããããžãã¯ãšã¬ã¡ã³ã
ã¿ã¹ã¯ã®æåŸã®éšåã¯ãåè·¯ãã©ã³ãã ã«æ¥ç¶ãããããªãã¯ã¹ã¹ã€ããã§ãã Spartan 6ã§ã¯ãè€æ°ã®LUTãããªã¬ãŒããã«ããã¬ã¯ãµãæ§æå¯èœãªããžãã¯ããã㯠ïŒCLBïŒã«çµã¿èŸŒãŸããŠããŸã 9 ã 以äžã«ç€ºãããã«ããããã®CLBã¯ãããªãã¯ã¹ã¹ã€ããã§æ¥ç¶ãããŠããŸãã åãããªãã¯ã¹ã¹ã€ãããããã¯ã¯ç°ãªããã¹ãæ¥ç¶ããããã«ããã°ã©ã ãããŠãããããFPGAæ¥ç¹ãèªç±ã«é 眮ã§ããŸãã FPGAåæããã»ã¹ã®éèŠãªéšåã¯ãé ç·è·é¢ãæå°åããããã®ãããã¯ã®é 眮ã§ãã ããã¯ãä¿¡å·ã®äŒæé 延ãæå°éã«æãããããããã³çžäºæ¥ç¶ãã¹ã®äºåãä¿æããããã«å¿ èŠã§ãã

Spartan 6 FPGAãããªãã¯ã¹ã¹ã€ããã£ãŒã§ã¯ãCLBéã®ä»»æã®æ¥ç¶ãå¯èœã§ãã ãŠãŒã¶ãŒããã¥ã¢ã«ãã
FPGAãè©Šãã¹ãã§ããïŒ
å人çã«ã¯ãæåã¯FPGAã«äžå®ãæããŸããããªããªãããããã¯æããŠå¥åŠã«æããããã§ãã åŠç¿æ²ç·ã¯ãããŸãããFPGAã¯æã£ãã»ã©è€éã§ã¯ãããŸããã æ°ããããã°ã©ãã³ã°ãã©ãã€ã ã«èå³ãããå ŽåãFPGAã¯ç°ãªãè§åºŠããç©äºã衚瀺ããŸãã ã·ãŒã±ã³ã·ã£ã«æäœãªã©ãåœç¶ã®ããšãšæããããã®ãåé¢ã«åºãŠããŸãã é«ãåæå®è¡æ§ãè©Šãããšãã§ããŸãã ãŸããFPGAã䜿çšãããšãããžã¿ã«åè·¯ã®åäœãããããç解ã§ããŸãã
ãã ããLED /ã¹ã€ããã®æ¥ç¶ã«å°ãªããšãå°ãæ £ããŠããããåºæ¬çãªããžã¿ã«ããžãã¯ïŒãã«ããããªã¬ãŒãã¹ããŒããã·ã³ïŒãç解ããŠããªãå Žåã¯ãFPGAã®å®éšããå§ãããŸããã ããããArduinoã«æ £ããŠããã®ã§ããã°ãFPGAã¯è³¢ã次ã®ã¹ãããã§ãã
ãããããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã€ã¯ãã³ã³ãããŒã©ãŒã¯FPGAãããåªããŠãããããã°ã©ãã³ã°ãç°¡åã§ãã é«ãããŒã¿ã¬ãŒããåæå®è¡æ§ãå¿ èŠãªãå ŽåãFPGAã¯ããããåé·ã«ãªããŸãã ç§ã®å Žåããã€ã¯ãã³ã³ãããŒã©ãŒã¯3ã¡ã¬ãããã€ãŒãµãããã²ãŒããŠã§ã€ã«ã»ãšãã©å¯Ÿå¿ããŠããªãã£ãããã次ã®ãããžã§ã¯ãã§ã¯FPGAãæ€èšããŸãã
Mojoã¯æåããè¯ãããŒãã§ããïŒ
Mojo FPGAéçºããŒãã¯AdafruitãšSparkfunãã販売ãããŠããã®ã§ãããã«ãŒã«ãšã£ãŠè¯ãéžæã ãšæããŸããã ãã®ããŒãã¯FPGAããã°ã©ãã³ã°ã®åå¿è åãã«èšèšãããŠããããã®åœ¹å²ã«ããŸã察å¿ããŠããŸãã Mojoã®äœæè ã¯ãVerilogãã¥ãŒããªã¢ã«ã®å€§èŠæš¡ãªã³ã¬ã¯ã·ã§ã³ãäœæããŸããã 10 ã ããã¥ã¢ã«ãç¹å®ã®ããŒãåãã«æžãããŠããå ŽåãããŒããšããŒã«ã®åé¡ãããè¿ éã«è§£æ±ºã§ããŸãã Mojoã¯æšæºã®USBã±ãŒãã«ã§ããã°ã©ã ãããŠããŸã-ç¹å¥ãªJTAGã¢ããã¿ãŒããã䟿å©ã§ãã

Spartan-6 FPGAããããæèŒããMojo FPGA
Mojoã«ã¯å€ãã®I / Oãã³ããããŸããã8åã®LEDãé€ããåšèŸºæ©åšã¯è²©å£²ãããŠããŸããã ãã¿ã³ã7ã»ã°ã¡ã³ããã£ã¹ãã¬ã€ãVGAåºåãã»ã³ãµãŒãªã©ãããå Žåã¯ãããŒãã§å®éšããæ¹ãå¿«é©ã§ãã ïŒMojoã«æ¥ç¶ããã®ã¯é£ãããããŸããããMojoãå«ãããšäŸ¿å©ã§ãïŒã ããã«ãäžéšã®éçºããŒãã«ã¯å€éšRAMããããŸãããMojoã«ã¯ãããŸããã ããã¯ã倧éã®ã¡ã¢ãªãå¿ èŠãšããããžãã¯ã¢ãã©ã€ã¶ãŒãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã®åé¡ã§ãã 11 ïŒãã ããMojoã¯IO ããããŸãã¯RAMãããã§æ¡åŒµã§ããŸãïŒã
Mojoã䜿ãå§ããã®ã«é©ããæ¬ã¯ã FPGAããã°ã©ãã³ã°ã§ãã ãŸããã¯ããã«å®äŸ¡ãªãã¶ãŒããŒãPapilo Oneããã³Elbert 2ã«ã€ããŠã説æããŠããŸãã ä»ã®ãªãã·ã§ã³ãã芧ã«ãªãããå Žåã¯ã FPGAéçºããŒãã®ãªã¹ããã芧ãã ããã
ãããã«
FizzBuââzzã¿ã¹ã¯ã¯FPGAã«å®è£ ããã®ã¯å®çšçã§ã¯ãããŸããããèå³æ·±ãããšã«ãFPGAããã°ã©ãã³ã°ã«ã€ããŠå€ãã®ããšãåŠã³ãŸããã ãããããã¡ããã圌ããFizzBuââzzã«ã€ã³ã¿ãã¥ãŒãé Œããšãç§ã¯ä»äºã«å°±ããŸããïŒ ç§ã®ã³ãŒãã¯GitHubã«ãããŸãããç§ã¯ãŸã ãã®ããžãã¹ãå§ããã°ããã§ãã
ã¡ã¢ãšãªã³ã¯
1. FPGAã«ãã€ã¯ãããã»ããµãå®è£ ããã®ã¯ç°¡åãªäœæ¥ã§ãã ããšãã°ãSpartan 6ãããã§ã¯ãIDEãŠã£ã¶ãŒãã®ããã€ãã®ãã¿ã³ãæŒãããšãã§ããŸã ãããã«ãããMicroBlazeããã»ããµçšã®åè·¯ãçæãããŸã ã ãããã£ãŠãé ã®ãã人ã¯Cã®æ°è¡ã§FizzBuââzzã³ãŒããæžãããããFPGAå ã®ããã»ããµãŒã§å®è¡ããŸãã ããããç§ã«ãšã£ãŠã¯ç°¡åãããŸãã â
2.éå§ããããå¿ èŠã§ããããããªããšãæåã®æåã®ãããã1ã®å Žåãã¬ã·ãŒããŒã¯æåã®å§ãŸããå€å¥ã§ããŸããã â
3. Mojoã®ã¯ããã¯åšæ³¢æ°ã¯50 MHzã§ããããã9600ããŒã®å Žåãåãããã«ã¯æ倧50,000,000 / 9,600ãã€ãŸãçŽ5,208ã¯ããã¯ãµã€ã¯ã«ããããŸãã ããã¯éåžžã«é«éã§ã¯ãªããããå®éšã§ã¯ã³ãŒãã1000äžããŒã®é床ã§å®è¡ããŸããïŒåãããã§æ倧5ã¯ããã¯ãµã€ã¯ã«ãã«ãŠã³ãããŸãïŒ-ãããŠåè·¯ã¯çãæ®ããŸããïŒUSB-ã·ãªã¢ã«ã€ã³ã¿ãŒãã§ãŒã¹ã¯230400ããŒãŸã§ã®é床ãããµããŒãããªããããçµæã確èªããŸãããªã·ãã¹ã³ãŒãã§ïŒã â
4. Verilogã§ã¯ã
<=
ã¯éããããã³ã°å²ãåœãŠæŒç®åã§ããã
=
ã¯ããããã³ã°å²ãåœãŠæŒç®åã§ãã ãã³ããããã³ã°å²ãåœãŠã¯äžŠè¡ããŠçºçããéåžžã¯ã·ãŒã±ã³ã·ã£ã«ããžãã¯ïŒã¯ããã¯ããªã¬ãŒïŒã«äœ¿çšãããŸãã ãããã¯å²ãåœãŠã¯ãçµã¿åããããžãã¯ïŒã¯ããã¯ãªãïŒã«äœ¿çšãããŸãã ããã¯å°ããããã«ããã§ãã詳现ã¯ãã¡ããã芧ãã ããã â
5. 2é²æ°ã§ã¯ãªã2é²æ°10é²æ°ã®ã«ãŠã³ã¿ãŒã䜿çšããããã5ã§é€ç®ããæ®ãã®éšåã¯ãæåŸã®æ¡ãèŠãŠã»ãŒèªæã«æ±ºå®ãããŸãã ãããã3ã§é€ç®ããããšã®æ®ãã¯äºçŽ°ãªããšã§ã¯ãªãã®ã§ããªãã·ã§ã³ãã«ãŠã³ã¿ãŒã®ãŸãŸã«ããŠããå¿ èŠããããŸããã â
6.ã·ãªã¢ã«ããŒãããªããããã·ãªã¢ã«å ¥åãã³ã³ãã¥ãŒã¿ã«çŽæ¥éãããšã¯ã§ããŸããã§ããã 代ããã«ã USB-ã·ãªã¢ã«ã¢ããã¿ãŒ ãAdafruitã®FTDI Friendã䜿çšããŸããã ãã®ã¢ããã¿ã¯ãå ã®RS-232ã®äžå¿«ãª+/- 15ãã«ããšã¯ç°ãªãã3.3ãã«ãã®ä¿¡å·ãåä¿¡ã§ããŸãã â
7. FPGAã®ãããã°ã¯ãããã°ã©ã ã®ãããã°ãšã¯ãŸã£ããç°ãªããŸãã FPGAã¯æ¬è³ªçã«ãã©ãã¯ããã¯ã¹ã§ãããããæåã«ã·ãã¥ã¬ãŒã¿ã§ãã¹ãŠã確èªããå¿ èŠããããŸããããããªããšãLEDãç¹æ» ããŠãFPGA-hellãã«ãªããäœãèµ·ãã£ãŠããã®ããç解ããããšããŸãããããã°ã®ããã»ã¹ã§ãåè·¯ãã·ãã¥ã¬ãŒãããã«ã¯ãããã¹ããã³ãã-Verilogã³ãŒããäœæããå¿ èŠããããŸããVerilogã³ãŒãã¯ãç°ãªãæéã«ç°ãªãå ¥åããŒã¿ãæäŸããŸãïŒäŸïŒã次ã«ãã·ãã¥ã¬ãŒã¿ãŒïŒäžèšïŒãå®è¡ããåºåãæ£ããããšã確èªããŸããã¶ã€ãªã³ã¯ã¹ISimã·ãã¥ã¬ãŒã¿ãŒã䜿çšãããšãFPGAåè·¯ããã§ãã¯ã§ããåé¡ãçºçããå Žåã¯ãã·ãã¥ã¬ãŒã¿ãŒã䜿çšããŠå éšä¿¡å·ã調ã¹ãŠåé¡ãç¹å®ã§ããŸããå®éã®FPGAã§å®è¡ããŠãããšãã«ã·ãã¥ã¬ãŒã¿ã§å®å šã«ãã¹ãããåŸãç§ã®ã³ãŒãã«ã¯æãäºçŽ°ãªåé¡ãããããŸãããäž»ãªãã®ã¯ãééã£ãé£çµ¡å ã«ã·ãªã¢ã«åºåãå²ãåœãŠããããåºåããªãã£ãããšã§ãã

â
8. Spartan 6 FPGAã¯ãããã€ãã®ã¿ã€ãã®ããªã¬ãŒããµããŒãããŠããŸããFDREã¯ãåæãªã»ãã/ã»ããå ¥åããã³ã¯ããã¯æäœãåããDããªã¬ãŒã§ãã â
9. Spartan 6 FPGAïŒCLBïŒã®æ§æå¯èœãªããžãã¯ãããã¯ã¯éåžžã«è€éã§ãã LUTã¢ãžã¥ãŒã«ã8ã€ã®ããªã¬ãŒãã¯ã€ããã«ããã¬ã¯ãµãŒãããžãã¯ãåæ£RAMãããã³ã·ããã¬ãžã¹ã¿ãå«ãŸããŠããŸãããããã®ãããã¯ã®ã³ã³ããŒãã³ããå ãã¯ãã ä»ããããšãæè»æ§ããããã«äœäžããŸããããããªãã¯ã¹ã¹ã€ããã®èšèšã¯å€§å¹ ã«ç°¡çŽ åãããŸãã CLBã®è©³çŽ°ã«ã€ããŠã¯ãCLB ãŠãŒã¶ãŒã¬ã€ããåç §ããŠãã ããã Spartan 6 FPGAã«ã¯ã18Ã18ãããããã°ããä¹ç®ã§ããã¯ããã¯ãããã¯ãDSPãããã¯ãªã©ãä»ã®ã¿ã€ãã®ãããã¯ããããŸãã â
10. Verilogã®ä»£ããã«VHDLããããŸããããã¯éçºç°å¢ã§ããµããŒããããŠããŸããMojo ã¯ãMojoããŒã ãéçºããããã·ã³ãã«ãªFPGAèšèªã§ããLucidããµããŒãããŠããŸããMojo ã®Lucidã¬ã€ããèšèªã説æãããã®ããŒãã«é¢ããæ¬ããããŸãããã ããLucidãããæšæºèšèªãåŠã¶æ¹ãè¯ããšå€æããŸããã â
11. Mojoã«ã¯å€éšRAMã¯ãããŸãããã576ãããããã®å éšã¡ã¢ãªããããŸããããã¯ãã¡ã¬ãã€ãã®å€éšDRAMãæèŒããããŒããšæ¯ã¹ããšãããããã§ãã â