![ç»å](https://habrastorage.org/getpro/habr/post_images/2b4/b75/c18/2b4b75c189373ef0599c5558eccd4d21.png)
äœåãç§ã¯ãã®èšäºãæžãå§ãããããæããŸããã 圌ããããæããã®ã¯ãç§ã«ã¯ãã®è©±é¡ã幟åç©è°ãéžããŠããããã ããã§ãã ç§ãçºæããèªè»¢è»ã¯ãäžéšã®äººã«ãšã£ãŠãšãã§ããªãããšãã§ããªãããã«èŠããäžè¬çã«ã¯å®å šã«æ£ãããšã¯éããŸããã ããã...
äžè¬ã«ãé»åããã€ã¹ã®éçºã®åéã«ã¯ãããã°ãããã«éãªãåã£ãäžçãããã€ãããããã«æããŸãã ããšãã°ããã€ã¯ãã³ã³ãããŒã©ã«åºã¥ããããã€ã¹ã®éçºãããã䞊è¡ããŠãFPGAã«åºã¥ããããã€ã¹ã®éçºããããŸãã ãããã®è¶ å°ååè·¯ã®åäœåçã¯æ ¹æ¬çã«ç°ãªããåçãšéçºæ¹æ³ã䜿çšãããããã°ã©ãã³ã°ããã³ãããã°èšèªã¯ãŸã£ããåãã§ãã ãã¡ãããå çŽ ããŒã¹ã®éžæã¯ã¿ã¹ã¯ã«å€§ããäŸåããŸãã ãã ãããããã®äžçããã€ã¯ãã³ã³ãããŒã©ãŒã®äžçãããã³FPGAã®äžçãã»ãšãã©éè€ããªãããšã¯æ¢ã«æããã§ãã ãã¯ãããžãŒã®æ¥ç¹ã«äœãããã®ã§ããããïŒ
äžè¬çã«ãç§èªèº«ã¯FPGAã奜ã¿ãFPGAããã°ã«ãåå ããŠããŸãããæè¿ãåœç€Ÿã¯STM32ãã€ã¯ãã³ã³ãããŒã©ãŒã«åºã¥ããããã€ã¹ã®éçºãå§ããŸããã å®éãç§ãã¡ãåºäŒã£ãäž»ãªåé¡ã¯å®å šã«æè¡çãªãã®ã§ã¯ãªããçµç¹çãªãã®ã§ããã
äºå®ãããã€ã¹ã®éçºã«é¢ããå¥çŽãç· çµãããŠããã«ãããããããããã€ã¹ã®æè¡ä»æ§ãå€å°èª¿æŽãããŠããã«ããããããã顧客ãæ¯é±æ°ããã¢ã€ãã¢ãèŠä»¶ãèããåžæãæãã€ããããšããããŸãã ãã¡ãããç§ãã¡ã¯åœŒããå°çã«éãããšã¯ã§ããŸããããç§ãã¡ã¯ææ ¢ããŠããããžã§ã¯ããå®è¡ããããšã«æ±ºããŸããã
äž»ãªçµç¹äžã®åé¡-ã³ã³ãããŒã©ãŒå¶åŸ¡ã¢ã«ãŽãªãºã ãå€æŽããããã®èŠæ±ãå€ãããããããã¯ãã°ãã°éåžžã«ççŸããŠããŸããã ããã«ã顧客èªèº«ããããã©ã®ããã«æ©èœããããåããããã©ã®ããã«ãã¹ãŠããã§ãã¯ããããç解ããŠããŸããã§ããã ããèšãæ¹ãæ£ç¢ºã§ãã ãŠãããã«ç¹å®ã®ã³ã³ãããŒã©ãŒãæã¡ãããããŒãžã£ãŒãããŸãã ã³ã³ãããŒã©ãŒãšãŠãããã«å¿ èŠãªç¹å®ã®æ©èœããããŒãžã£ãŒèªèº«ã¯æ£ç¢ºã«ç¥ãããèŠä»¶ã¯ããã€ã¹ã®æäœæ§ããã§ãã¯ããããšã«ãªã£ãŠãã1人ã®ãšã³ãžãã¢ãçå®ããªããã°ãªããŸããã§ããã é»åããã€ã¹ã®çµéšããªãããããšã³ãžãã¢ã«ã¯ã³ã³ãããŒã©ã®æäœæ§ã確èªããç¬èªã®æ¹æ³ããããŸããã
以äžã«äŸã瀺ããŸãã ã¹ã¿ã³ãã€ã¢ãŒãã§ã¯ãã³ã³ãããŒã©ãŒãåã«[ã¹ã¿ãŒã]ãã¿ã³ãæŒãããã®ãåŸ ã€å Žåãã³ã³ãããŒã©ãŒã¯1æ¥ã«1åã10ç§é液äœããã³ãã³ã°ãããã³ãããªã³ã«ããå¿ èŠããããŸãã ããã¯ããã³ãè ºã®è é£ã«å¯Ÿããäžçš®ã®ä¿è·ã§ãã ç§ãå°ãããšã; ããã®æ©èœãã©ã®ããã«ãã§ãã¯ããŸããã-圌ãã¯ãããŒãŠã§ã€ããšçããŸãã å人çã«ãç§ã¯ã·ã§ãã¯ãåããŠããŸãã ãã¡ãããããšã©ãŒãªãã§ãããã°ã©ã ãäœæããããšããŸãããåä¿¡åŽã¯äœããã®åœ¢ã§è²¬ä»»ãå ±æãããã¹ããå®æœããå¿ èŠããããšæããŸãã
次ã«ãåé¡ã®æè¡é¢ã«é²ã¿ãŸãã
äœããã®çš®é¡ã®ãã€ã¯ãã³ã³ãããŒã©ãŒãœãããŠã§ã¢ãã¹ããå¿ èŠã§ãããšå€æããŸããã
éåžžããœãããŠã§ã¢ã®äžçã§ã¯ãåäœãã¹ããšããæŠå¿µããããŸãã ãããŠååãšããŠããã®ææ³ã¯ãã€ã¯ãã³ã³ãããŒã©ãŒããã°ã©ã ã«ããçšåºŠé©ããŠããŸãã çŸåšããã€ã¯ãã³ã³ãããŒã©ãŒçšã®ããã°ã©ã ã¯éåžžã®Cèšèªã§æžãããŠããããšãå€ããããåäœãã¹ãå šè¬ã«åé¡ã¯ãªãã¯ãã§ãã ããã...ãã¹ãŠããã€ã¯ãã³ã³ãããŒã©ãŒã®åäœãã¹ãã§ç°¡åã«ãã§ãã¯ã§ããããã§ã¯ãããŸããã
ã¿ã€ããŒãDMAãã£ãã«ãã·ãªã¢ã«ããŒããå²ã蟌ã¿ãªã©ãå éšããŒããŠã§ã¢ããã€ã¹ã®ããã°ã©ãã³ã°ã«é¢é£ãããã¹ãŠã®ãã®-ããã«ã¯åé¡ããããŸãã ããã§ããããã°ã®ããã«ããªã·ãã¹ã³ãŒãã䜿çšããŠãå ¥åãšåºåã§åä¿¡ããããã€ã¯ãã³ã³ãããŒã©ãŒã®ä¿¡å·ã確èªããŸãã äžè¬ã«ãå²ã蟌ã¿åŠçã«ãããæéã枬å®ããããšã¯äžèŠãªã¿ã¹ã¯ã§ã¯ãããŸããã ãããŠãããã§ãã
åäœãã¹ãã«ã¯ãã1ã€åŸ®åŠãªéãããããŸãã ãœãããŠã§ã¢ã®åŸæ¥ã®åäœãã¹ãã¯ããŒã¿æåã§ããããã«æããŸãã ã€ãŸããéåžžãåäœãã¹ãããã°ã©ã ã¯ããã§ãã¯å¯Ÿè±¡ã®é¢æ°ã®å ¥åã«ããŸããŸãªäºæ³ããŒã¿ãé ä¿¡ããåŠçãããåºåããŒã¿ãèŠä»¶ãæºãããŠãããã©ããããã§ãã¯ããŸãã ããã ãã§ã
å ¥åä¿¡å·ããã»ããµãšããŠæ©èœããé»åããã€ã¹ã®å Žåããæéã®æµããã®æŠå¿µã¯åºæ¬çã«éèŠã§ãã ã€ãŸããéåžžãèŠä»¶ã¯æ¬¡ã®ãšããã§ããç·æ¥äºæ ãçºçããã¢ã©ãŒã ã»ã³ãµãŒAãããªã¬ãŒãããå Žåãã¢ã¯ãã¥ãšãŒã¿ãŒB ã CãN1ç§ééã§é çªã«ãªãã«ãã N2ç§ä»¥å ã§N3ç§ä»¥å ã«Dããã€ã¹ããªãã«ããŸãã
ãœãããŠã§ã¢å¶åŸ¡ã¢ã«ãŽãªãºã ããã¹ãããã«ã¯ãæéã®çµéãèæ ®ããŠäœããã®ä¿¡å·ã·ãã¥ã¬ãŒã¿ãŒã䜿çšããã®ãè¯ãããšã¯æããã§ãã ãããŠããã®ãããªããŒã«ã¯ãFPGAã·ã¹ãã éçºè ã«ãšã£ãŠã®æŠåšã§ãã
FPGAããŒã¹ã®é»åããã€ã¹ã®éçºè ã¯éåžžãVerilogãŸãã¯VHDLããŒããŠã§ã¢èšè¿°èšèªã䜿çšããŸãã åæã«ãFPGAã®ã³ãŒãã«å ããŠããããããã¹ããã³ããäœæãããŸããããã¯ãéåžžã®Cããã°ã©ãã®åäœãã¹ãã®ãããªãã®ã§ãã
Verilog HDLã䜿çšããŠããŸãã
ãã¹ããã³ãããã°ã©ã ã¯ããã°ã©ããŒèªèº«ãäœæããåæã«FPGAãããã§èãããããã¹ãŠã®å ¥åå¹æãã·ãã¥ã¬ãŒãããããšããŸãã åºåä¿¡å·ã¯ãã¹ããã³ãèªäœã§åæãããäºæ³ããããã®ã«åŸã£ãŠãã§ãã¯ãããŸãã
åæã«ãVerilogã·ãã¥ã¬ãŒã¿ãŒèªäœãã·ã¹ãã å ã®æéã®çµéãç£èŠããŸãã
FPGAããã°ã©ããŒãè¡ãããšã®ç°¡åã§å®å šã«æœè±¡çãªäŸãèããŠã¿ãŸãããã
ããšãã°ãéåæãªã»ããïŒsample.vïŒã䜿çšããåçŽãªãã€ããªã«ãŠã³ã¿ãŒãèšè¿°ããã¢ãžã¥ãŒã«ã¯æ¬¡ã®ãšããã§ãã
module sample( input wire reset, input wire clk, output reg [3:0]cnt ); always @(posedge clk or posedge reset) if(reset) cnt <= 0; else cnt <= cnt + 1; endmodule
ãã®ãããªã³ãŒãã¯ãVerilog HDLèšèªãç¥ããªãããã°ã©ããŒã§ãç解ã§ãããšæããŸãã resetãšclkã® 2ã€ã®å ¥åããããŸãã ãŸããåºå4ãããä¿¡å·[3ïŒ0] cntããããŸãã åžžã«ã¯ããã¯ä¿¡å·ã®ãšããžã§ãã«ãŠã³ã¿ã®å€ãå¢å ããŸãã ãããŠåžžã«ããŠãããããªã»ããæã«è¡šç€ºããããšãã«ãŠã³ã¿ãŒã¯ãŒãã«ãªã»ãããããŸãã
ãã®ã¢ãžã¥ãŒã«ã¯åæãããŠããŸããã€ãŸããã³ã³ãã€ã«ããŠFPGAã«çž«ã蟌ãäºå®ã§ãã
çŸåšãããšãã°ãããã°ã©ããŒã¯èªåã®ã¢ãžã¥ãŒã«ã®æ©èœããã¹ãããããšèããŠããŸãã 圌ã¯ããã¹ãåè·¯ã§ããVerilogã§ããã€ã¯ãåè·¯ïŒtestbench.vïŒã®å ¥åä¿¡å·ãã·ãã¥ã¬ãŒãããããã°ã©ã ãäœæããŸãã
`timescale 1ms / 1 ms module testbench(); reg tb_rst, tb_clk; wire [3:0]value; always #5 tb_clk = ~tb_clk; initial begin $dumpfile("waves.vcd"); $dumpvars(0,testbench); $display("starting testbench!!!!"); tb_rst = 1; tb_clk = 0; #10; tb_rst = 0; #73; tb_rst = 1; #11; tb_rst = 0; #134; tb_rst = 1; #57; tb_rst = 0; #200; $display("finished OK!"); $finish; end sample my_sample_inst( .reset(tb_rst), .clk(tb_clk), .cnt( value ) ); wire fail; assign fail = (tb_rst & value!=0 ); endmodule
ãã®ã¢ãžã¥ãŒã«ã¯åæããããã³ã³ãã€ã«ããŠFPGAã«çž«ãä»ããããšã¯ã§ããŸãããããããžã§ã¯ããã·ãã¥ã¬ãŒãããããã«å¿ èŠã§ãã è¡ã«æ³šæããŠãã ãã
sample my_sample_inst( .reset(tb_rst), .clk(tb_clk), .cnt( value ) );
ããã¯ããã¹ããã³ãã«æ¿å ¥ããããµã³ãã«ã¢ãžã¥ãŒã«ã®ãã¹ãã€ã³ã¹ã¿ã³ã¹ã§ãã 次ã®ããã«ãªããŸãã
![ç»å](http://habrastorage.org/files/eb4/6d5/435/eb46d54353b340229106685e0e4c58e8.png)
ãããžã§ã¯ãã®å¹çæ§ã®åºæºãããå¯èœæ§ã¯éåžžã«é«ãã§ãã ãªã»ããä¿¡å·ã®éãã«ãŠã³ã¿åºåä¿¡å·ã¯åžžã«ãŒãã§ããå¿ èŠããããŸãã ã€ãŸãããã¹ããã³ãã§ãšã©ãŒä¿¡å·ãç¹å®ã§ããŸãã
wire fail; assign fail = (tb_rst & value!=0 );
ãã®ä¿¡å·ã¯ãããã°ã©ã ã§ç£èŠããããšããåºåã¿ã€ã ãã£ãŒãã§ç®ã§èŠãããšãã§ããŸãã
ç§ã¯ããã·ã³ãã«ãªç¡æã®VerilogHDL IcarusVerilogã·ãã¥ã¬ãŒã¿ãŒã䜿çšããŸãã ã€ã³ã¹ããŒã«ãšæäœãç°¡åã§ãã ã·ãã¥ã¬ãŒã¿ãŒãã³ã³ãã€ã«ããŠå®è¡ããŸãã
![ç»å](http://habrastorage.org/files/13a/5fd/8f5/13a5fd8f587746f68e103da32245d761.png)
ç§ã®ãã¹ããã³ãã¯ããã°ã©ã ã®è¡ã«æè¬ããŸã$ dumpfileïŒ "waves.vcd"ïŒ; ããã³$ dumpvarsïŒ0ããã¹ããã³ãïŒ; wave.vcdã¿ã€ãã³ã°ãã£ãŒããã¡ã€ã«ãäœæããŸãã ãŸãããããã®ã¿ã€ãã³ã°ãã£ãŒãã¯ãå¥ã®åªããç¡æã®GtkWaveããŒã«ã§è¡šç€ºã§ããŸãã
![ç»å](http://habrastorage.org/files/bb9/fa4/18a/bb9fa418a8e94de8ae23f4835b51f462.png)
ãããã£ãŠãFPGAããã°ã©ããŒãã§ããæãåçŽãªæ¹æ³ã¯ããã¹ããã³ãããã¹ãæžã¿ã¢ãžã¥ãŒã«ã«æžã蟌ã¿ãçµæã®ã¿ã€ã ãã€ã¢ã°ã©ã ã®ãã¡ã€ã«ãçæããFPGAããæ£ããå¿çãè¿ããããã©ããã調ã¹ãããšã§ãã
次ã«ãåæ§ã®ãã¹ãæè¡ããã€ã¯ãã³ã³ãããŒã©ãŒã«é©çšããæ¹æ³ã説æããŸãã
Verilogãã¹ããã³ãã«å床泚æãæããšã$ãã£ã¹ãã¬ã€ïŒ..ïŒãªã©ã®ã·ã¹ãã æ©èœãããã€ããããŸãã
ã ããããã«ã Verilog HDLã·ãã¥ã¬ãŒã¿ãŒã§ã¯ãå¿ èŠãªã·ã¹ãã é¢æ°ãCèšèªã§èªåã§è¿œå ã§ããããšãããããŸããã ãããŠãCèšèªã®å Žæããããšããã¹ããã³ãã®Verilogã³ãŒãããã€ã¯ãã³ã³ãããŒã©ãŒã®Syshã³ãŒããšå¯Ÿè©±ã§ããå Žæã衚瀺ãããŸãã
äžè¬ã«ãCèšèªãžã®Verilogã·ãã¥ã¬ãŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãVerilogæç¶ãåã€ã³ã¿ãŒãã§ã€ã¹ïŒVPIïŒãšåŒã°ããŸãã ããªãã¯åœŒã«ã€ããŠé·ãé話ãããšãã§ããŸããããã¯å€§ããªå¥ã®ãããã¯ã§ãã 詳现ã«ã€ããŠã¯ãããšãã°ãã¡ããã芧ãã ãã ã
ãããã©ã®ããã«äœ¿çšãããããæš¡åŒçã«èª¬æãããã ãã§ãã
ãã€ã¯ãã³ã³ãããŒã©ã®ãããžã§ã¯ãã¯ãå€ãã®ãã¡ã€ã«ã§æ§æã§ããŸãã ç§ãã¡ã®ã¿ã¹ã¯ã¯ãç¹å®ã®ãã€ã¯ãã³ã³ãããŒã©ãŒã®ããŒããŠã§ã¢æ©èœããå¶åŸ¡ã¢ã«ãŽãªãºã èªäœãåé¢ããããšã§ãã
ãã€ã¯ãã³ã³ãããŒã©ãŒã®ãããžã§ã¯ãããã¡ã€ã«ã§æ§æãããŠãããšä»®å®ããŸãã
Main.c Dma.c Serial.c Interrupts.c âŠ. Algorithm.c
ãã€ã¯ãã³ã³ãããŒã©ãŒå ¥åã©ã€ã³ããã®å²ã蟌ã¿ãã³ãã©ãŒã¯ãInterrupts.cãã¡ã€ã«ã«èšè¿°ãããŠããŸãã ãããã¯æ¬¡ã®ãããªãã®ã§ãã
void EXTI9_5_IRQHandler(void) { Int val; disableGlobalInterrupts(); EXTI_ClearITPendingBit(EXTI_Line6); val = GPIO_ReadInputDataBit(MY_PORT, MY_SIGNAL); Algo_set_value( val ); enableGlobalInterrupts(); }
ãã€ã¯ãã³ã³ãããŒã©ãŒã®å ¥åã©ã€ã³äžã®ä¿¡å·ãå€åãããšãå²ã蟌ã¿ãçºçããã©ã€ã³äžã®å€ãèªã¿åãããã®å€ãAlgo_set_valïŒïŒé¢æ°ã«ãã£ãŠåŠçã¢ã«ãŽãªãºã ã«éä¿¡ãããŸãã å¶åŸ¡ã¢ã«ãŽãªãºã å šäœã¯ãAlgorithm.cãã¡ã€ã«ã«èšè¿°ãããŠããŸãã
Algorithm.cãã¡ã€ã«ã¯ããã€ã¯ãã³ã³ãããŒã©ãŒã®ãããžã§ã¯ããšVerilog VPIã¢ãžã¥ãŒã«ã®ãããžã§ã¯ãã«åæã«é¢äžããŠããŸãã
![ç»å](http://habrastorage.org/files/1f4/b7e/8a1/1f4b7e8a1c0b459a9fbd03988ed95017.png)
ãããã£ãŠããå¶åŸ¡ã¢ã«ãŽãªãºã ããéçºããå Žåãäž»ã«Verilogã·ãã¥ã¬ãŒã¿çšã®Algorithm.cãšãšãã«VPIã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããŸãã Verilogãã¹ããã³ãã§ç¹å®ã®æ°ããã·ã¹ãã é¢æ°$ intïŒïŒãåŒã³åºãããšã«ãããããæç¹ã§ã®ãã€ã¯ãã³ã³ãããŒã©ãŒå²ã蟌ã¿ã®çºçãã·ãã¥ã¬ãŒãããŸãã åæ§ã«ãã¢ã«ãŽãªãºã ã®å éšå€æ°ãèªã¿åããVerilogãã¹ããã³ãã«æž¡ãããšãã§ããŸããããã«ã¯ãæ°ãã$ getpinïŒ..ïŒã·ã¹ãã é¢æ°ã䜿çšããŸãã Verilogãã¹ããã³ãã¯ããã€ã¯ãã³ã³ãããŒã©ãŒå¶åŸ¡ã¢ã«ãŽãªãºã ã®å ¥åã®åœ±é¿ãšæéã®æµããã·ãã¥ã¬ãŒãã§ããããšãããããŸããã
å ¥åå¹æãšå¿çã®ã¿ã€ã ãã£ãŒããèªç±ã«äœ¿çšã§ããããšã¯æ³šç®ã«å€ããŸãã ãããã¯ãæ £ããããã«é¡§å®¢ã«èŠããããšãã§ããŸã-GtkWaveããã°ã©ã ã¯ãããã衚瀺ããããã«äœ¿çšãããŸãã 顧客ã¯ãããŸããŸãªã»ã³ãµãŒããã®å ¥åã®åœ±é¿ãèªåã®å¶åŸ¡ã¢ã«ãŽãªãºã ã§ã©ã®ããã«å¿çããããèªåã®ç®ã§èŠãããšãã§ããŸãã 顧客ã¯ãå ¥åä¿¡å·ããã®åœ±é¿ã®èãããããã¹ãŠã®çµã¿åãããšããã€ã¯ãã³ã³ãããŒã©ãŒãšåŒã°ããããã©ãã¯ããã¯ã¹ãã®ãã¹ãŠã®å¿çã確èªããå¿ èŠããããŸãã
å°ãªããšãæéå³ã§ã¯ãæ¯æ¥10ç§éãã³ããäºå®äžã©ã®ããã«ãªã³ã«ãªãããèŠãããšãã§ããŸã...
æåŸã®ã¹ãããã¯ãVerilogã·ãã¥ã¬ãŒã¿ãŒã®VPIã¢ãžã¥ãŒã«ã®ã³ã³ãã€ã«ãåæ¢ãïŒçŽ«è²ã®ãããã¯ïŒããã€ã¯ãã³ã³ãããŒã©ãŒãããžã§ã¯ãã®ã³ã³ãã€ã«ãéå§ããŸãïŒãªã¬ã³ãžè²ã®ãããã¯ïŒã
ããã§ãã¢ã«ãŽãªãºã ã®æ©èœã¯ãVerilogã·ãã¥ã¬ãŒã¿ã®ä»®æ³å¹æããã§ã¯ãªããå ¥åã©ã€ã³ãšã¿ã€ããŒããã®ç©ççãªäžæããåŒã³åºãããŸãã
念ã®ãããVerilogãã¹ããã³ãã䜿çšããŠããDMAãã¿ã€ããŒãGPIOãªã©ã®åšèŸºæ©åšã®ã¬ãžã¹ã¿ãŒã®ããã°ã©ãã³ã°ã®æ£ç¢ºæ§ã確èªããªãããšãæ¹ããŠç¢ºèªããŸãã ãå¶åŸ¡ã¢ã«ãŽãªãºã ãã®ã¿ããã¹ãããŸãã ç§ã®æèŠã§ã¯ãããã¯éåžžã«éèŠã§ãã
ãŸãããã®ãããªãã®ã