ãŒãæ¥
é±æ«ãæ¥ãåã«ãå®è£ ã«ã€ããŠå°ãèããæéããããŸããã ã¿ã¹ã¯ãç°¡çŽ åããããããã¿ã³ãšLCDã¹ã¯ãªãŒã³ãåããåå¥ã®ããã€ã¹ãšããŠã§ã¯ãªããUSBçµç±ã§PCã«æ¥ç¶ããããã€ã¹ãšããŠãžã§ãã¬ãŒã¿ãŒãäœæããããšã«ããŸããã ãã®ããã«ãUSB2RS232ããŒãããããŸãã ãã©ã€ããŒããŒãã¯ïŒCDCïŒãå¿ èŠãšããªããããLinuxã§åäœãããšæããŸãïŒèª°ãã«ãšã£ãŠãããã¯éèŠã§ãïŒã ãŸããRS232ãä»ããã¡ãã»ãŒãžã®åä¿¡ã§æ¢ã«äœæ¥ãããšããäºå®ãé ããŸããã RS232ãæäœããããã®ã¢ãžã¥ãŒã«ã¯ã opencores.comããæ¢è£œã®ãã®ãåããŸãã
æ£åŒŠæ³¢ä¿¡å·ãçæããã«ã¯ãDACãå¿ èŠã§ãã å ã®ãããžã§ã¯ãã®ããã«ãDACã®ã¿ã€ããéžæããŸãã-8ãããã®R2R ã ã¡ã¬ãã«ãçšåºŠã®é«åšæ³¢æ°ã§äœæ¥ã§ããŸãã FPGAã¯ããã«å¯ŸåŠããªããã°ãªããªããšç¢ºä¿¡ããŠããŸã
COMããŒããä»ããŠããŒã¿ãéä¿¡ããããã®ããã°ã©ã ãæžãããšã«ã€ããŠã¯ãç§ã¯èããŸããã äžæ¹ã§ã¯ãDelphi7ã§èšè¿°ã§ããŸãããã§ã«ãã®ãããªããã°ã©ã ãèšè¿°ããçµéšããããå®è¡å¯èœãã¡ã€ã«ã®ãµã€ãºã¯å€§ãããããŸããã ãŸããhtmlããŒãžã§SerialãJavaã¹ã¯ãªãããšããŠåäœãããããã«äœããæžãçããããšããŸããããå€ããå°ãªããChromeã·ãªã¢ã«APIãä»ããŠã®ã¿åäœããŸãããããã®ããã«ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸã...äžè¬ã«ããããæ¶ããŸãã ç§èªèº«ã®é©æ°ãšããŠãPyQt5ãè©ŠããŸãããããã®ãããªãããžã§ã¯ããé åžãããšãã¯ãããããã®ã©ã€ãã©ãªããã©ãã°ããå¿ èŠããããŸãã PyQtãããžã§ã¯ããexeãã¡ã€ã«ã§åéããããšãããšã10 MB以äžã«ãªããŸããã ã€ãŸããc ++ \ Qt5ã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ãããåªããŠããããã§ã¯ãããŸããã Pythonã®éçºçµéšã¯ãããŸããããQt5ã§éçºçµéšãããããšãèæ ®ãã䟡å€ããããŸãã ãããã£ãŠãéžæè¢ã¯Qt5ã«èœã¡ãŸããã 5çªç®ã®ããŒãžã§ã³ã§ã¯ãã·ãªã¢ã«ãæäœããããã®ã¢ãžã¥ãŒã«ãç»å ŽããŸããããç§ã¯ãã§ã«ãããæäœããŠããŸããã ãŸããQt5ã®ã¢ããªã±ãŒã·ã§ã³ã¯Linuxããã³Macã«ç§»æ€ã§ãïŒäžéšã®äººã ã«ãšã£ãŠããã¯éèŠã§ãïŒãããŒãžã§ã³5.2以éãQWidgetsã®ã¢ããªã±ãŒã·ã§ã³ã¯ã¹ããŒããã©ã³ã«ç§»æ€ããããšããã§ããŸãïŒ
ä»ã«äœãå¿ èŠã§ããïŒ FPGAãæèŒãããã¶ãŒããŒãã 2ã€ãããŸãïŒ10,000ã»ã«ã®å Žåã¯cyclone iv EP4CE10E22C8Nã5,000ã»ã«ã®å Žåã¯Cyclone ii EP2C5ïŒã ãã䟿å©ãªã³ãã¯ã¿ã®ããã ãã«ãå·ŠåŽã®ãã®ãéžæããŸãã ããªã¥ãŒã ã®é¢ã§ã¯ããããžã§ã¯ãã¯å€§ãããªãããšãæå³ããŠããªãããã2ã€ã®ãããã«ãé©åããŸãã é床ã«éãã¯ãããŸããã äž¡æ¹ã®ããŒãã«ã¯ããªã³ããŒããã®50 MHzãªã·ã¬ãŒã¿ããããFPGAå ã«ã¯PLLããããããã䜿çšããŠåšæ³¢æ°ã200 MHzã«äžããããšãã§ããŸãã
åæ¥
ã·ã³ã»ãµã€ã¶ãŒãããžã§ã¯ãã§æ¢ã«DDSã¢ãžã¥ãŒã«ã䜿çšãããããããã«ã¯ãã ããŠãåãäžããDACãæµæã«ã¯ãã ä»ããå§ããŸããã ãã¬ããããŒããåããŸããã ã€ã³ã¹ããŒã«ã¯ã©ããã³ã°ã䜿çšããŠè¡ãããŸããã ãã¯ãããžãŒã«åœ±é¿ãäžããå¯äžã®å€æŽç¹ã¯ãTTã€ã³ãžã±ãŒã¿ãŒãã©ãã¯ã¹ã²ã«ãæ¯æããŠã é«ã¡ããã©ãã¯ã®é žæ§F38NãæŸæ£ããããšã§ãã ãã®æè¡ã®æ¬è³ªã¯ç°¡åã§ããã©ãã¯ãããªã³ãåºæ¿ã«ã¯ãã ä»ãããæµæåšãããªã³ãåè·¯åŽããã¯ãã ä»ãããŸãã æ¬ èœããŠããæ¥ç¶ã¯ã©ãããããŸãã ããã§ããã©ãã¯ã¯FPGAããŒãã«çŽæ¥æ¿å ¥ã§ãããšããç¹ã§äŸ¿å©ã§ãã
æ®å¿µãªãããèªå® ã§ã¯æµæåš1ããã³2ãããªãŒã ã¯ãããŸããã§ããã åºã«è¡ãæéã¯ãããŸããã§ããã ã«ãŒã«ã®1ã€ãæŸæ£ããå€ãäžèŠãªããŒãããæµæãåé€ããå¿ èŠããããŸããã 䜿çšãããæµæåšã¯15Kãš30Kã§ããã çµæã¯ãã®ãããªãã©ã³ã±ã³ã·ã¥ã¿ã€ã³ã§ãïŒ
ãã®åŸãQuartusãèµ·åãããããžã§ã¯ããäœæããŸãã
ãããžã§ã¯ããäœæããããã¿ãŒã²ããããã€ã¹ãèšå®ããå¿
èŠããããŸããAssigmentsã¡ãã¥ãŒ-> Device
次ã«ãåãå Žæã§ãããã€ã¹ãšãã³ã®ãªãã·ã§ã³ããã¿ã³ãã¯ãªãã¯ããŸãããã³ãæ©èœããªãããã«èšå®ãããŠããããã§ãã ãéåžžã®I / OãšããŠäœ¿çšããããªã©ã®ãã¹ãŠãèšå®ããŸã
次ã«ãåãå Žæã§ãããã€ã¹ãšãã³ã®ãªãã·ã§ã³ããã¿ã³ãã¯ãªãã¯ããŸãããã³ãæ©èœããªãããã«èšå®ãããŠããããã§ãã ãéåžžã®I / OãšããŠäœ¿çšããããªã©ã®ãã¹ãŠãèšå®ããŸã
ãã®ãããžã§ã¯ãã§ã¯ãã¢ã³ãããŒãžãåºå®åšæ³¢æ°DDSã¡ã€ã³ã¢ãžã¥ãŒã«ããã³ã£ããããããŸããã
1000 Hzãžã§ãã¬ãŒã¿ãŒã¢ãžã¥ãŒã«
module signal_generator(clk50M, signal_out); input wire clk50M; output wire [7:0] signal_out; wire clk200M; osc osc_200M reg [31:0] accumulator; assign signal_out = accumulator[31:31-7]; // 1000 //50 000 000 Hz - //2^32 = 4 294 967 296 - DDS - 32 // 1000Hz / 50 000 000 Hz / 2 * 4294967296 => 42949,67296 always @(posedge clk50M) begin accumulator <= accumulator + 32'd42949; end endmodule
ãã®åŸããStart Compilationããã¯ãªãã¯ããŠããããžã§ã¯ãã®ã¡ã€ã³ã¢ãžã¥ãŒã«ã«å ¥å/åºåã©ã€ã³ããããããããã©ã®ç©çPINã«æ¥ç¶ãããŠããããéçºç°å¢ãçåã«æããŸããã ã»ãšãã©èª°ã«ã§ãæ¥ç¶ã§ããŸãã ã³ã³ãã€ã«åŸã衚瀺ãããè¡ãFPGAãããã®å®éã®PINã«å²ãåœãŠãŸãã
å²ãåœãŠ->ãã³ãã©ã³ããŒã¡ãã¥ãŒé
ç®
HS_OUTãkey0ããã³key1è¡ã§ã¯ããŸã 泚æãæããªãã§ãã ããããããã¯åŸã§ãããžã§ã¯ãã«è¡šç€ºãããŸãããæåã¯ç»é¢ãäœæã§ããŸããã§ããã
ååãšããŠãLocationåã«PIN_nnã®ã¿ããç»é²ãããã ãã§ååã§ããæ®ãã®ãã©ã¡ãŒã¿ãŒïŒI / OæšæºãçŸåšã®ã¹ãã¬ã³ããã¹ã«ãŒã¬ãŒãïŒã¯ããã©ã«ãã®ãŸãŸã«ããããããã©ã«ãã§æäŸããããã®ãšåãïŒããã©ã«ãïŒãéžæããŠèŠåããªãããã«ããããšãã§ããŸãã®ã
ååãšããŠãLocationåã«PIN_nnã®ã¿ããç»é²ãããã ãã§ååã§ããæ®ãã®ãã©ã¡ãŒã¿ãŒïŒI / OæšæºãçŸåšã®ã¹ãã¬ã³ããã¹ã«ãŒã¬ãŒãïŒã¯ããã©ã«ãã®ãŸãŸã«ããããããã©ã«ãã§æäŸããããã®ãšåãïŒããã©ã«ãïŒãéžæããŠèŠåããªãããã«ããããšãã§ããŸãã®ã
ããŒãäžã®ã¹ãããçªå·ã«å¯Ÿå¿ããPINãèŠã€ããæ¹æ³ã¯ïŒ
ã³ãã¯ã¿ã®ãã³çªå·ã¯ããŒãäžã§çœ²åãããŠããŸã
ãŸããã³ãã¯ã¿ãã³ãæ¥ç¶ãããFPGAãã³ã«ã€ããŠã¯ãFPGAã«ãŒãã«ä»å±ã®ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã
ãŸããã³ãã¯ã¿ãã³ãæ¥ç¶ãããFPGAãã³ã«ã€ããŠã¯ãFPGAã«ãŒãã«ä»å±ã®ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã
ãã³ãå²ãåœãŠãåŸããããžã§ã¯ããå床ã³ã³ãã€ã«ããUSBããã°ã©ããŒã䜿çšããŠãã©ãã·ã¥ããŸãã USB Byte blasterããã°ã©ããŒçšã®ãã©ã€ããŒãã€ã³ã¹ããŒã«ããŠããªãå Žåã¯ãQuartusãã€ã³ã¹ããŒã«ãããŠãããã©ã«ããŒã«ããããšãWindowsã«æå®ããŸãã ãã®åŸã圌女ã¯èªåèªèº«ãèŠã€ããã§ãããã
ããã°ã©ããŒãJTAGã³ãã¯ã¿ãŒã«æ¥ç¶ããå¿ èŠããããŸãã ããã°ã©ãã³ã°ã®ã¡ãã¥ãŒé ç®ã¯ãããŒã«->ããã°ã©ããã§ãïŒãŸãã¯ããŒã«ããŒã®ã¢ã€ã³ã³ãã¯ãªãã¯ããŸãïŒã ãã¹ã¿ãŒãããã¿ã³ã楜ãããæåãããã¡ãŒã ãŠã§ã¢ã¯ãã§ã«FPGAå ã«ããããã§ã«åäœããŠããŸãã FPGAããªãã«ããªãã§ãã ããããªãã«ãããšããã¹ãŠãå¿ããŠããŸããŸãã
ããŒã«->ããã°ã©ããŒ
DACã¯FPGAããŒãã³ãã¯ã¿ã«æ¥ç¶ãããŸãã C1-112Aãªã·ãã¹ã³ãŒããDACåºåã«æ¥ç¶ããŸãã äœçžã¢ãã¥ã ã¬ãŒã¿ã®ã¯ãŒãDDSã®äžäœéšåã8ãããåºåã«åºåããããããçµæã¯ãã®ããããã«ãªãã¯ãã§ãã ãããŠããªãŒããŒãããŒãããŸã§åžžã«å¢å ããŸãã
çŽ1.5æéãåšæ³¢æ°ã1000 Hzã®å Žåã次ã®æ³¢åœ¢ã衚瀺ãããŸãã
çãäžã®ãã®ããããã«ã¯å°ããªéªšæããããŸãã ããã¯ãæµæã«ã¯ããŸããŸãªå€ãããããã§ãã
æ確ã«ããå¿ èŠããããã1ã€ã®éèŠãªç¹ã¯ãDDSãžã§ãã¬ãŒã¿ãŒãåäœããå¯èœæ§ã®ããæ倧åšæ³¢æ°ã§ãã TimeQuestãã©ã¡ãŒã¿ãæ£ããæ§æãããšããCompilation Reportãã§ã³ã³ãã€ã«ããåŸãåè·¯ã®é床ãäœè£ãæã£ãŠ200 MHzãè¶ ããŠããããšãããããŸãã ããã¯ãPLLã䜿çšããŠ50 MHzçºæ¯åšã®åšæ³¢æ°ã«4ãæããããšãæå³ããŸãã200MHzã®åšæ³¢æ°ã§DDSäœçžããããªãŒã®å€ãå¢ãããŸãã ãã®æ¡ä»¶ã§ååŸã§ããæçµçãªåšæ³¢æ°ç¯å²ã¯0ã100 MHzã§ãã åšæ³¢æ°èšå®ç²ŸåºŠïŒ
200 000 000 (clk) / 2^32 (DDS) = 0,047
ã€ãŸããã0.05 HzãããåªããŠããŸãã ãã®ãããªåäœåšæ³¢æ°ç¯å²ïŒ0ã100 MHzïŒã®çºé»æ©ã®ãã«ãåæ°ã®ç²ŸåºŠã¯ååã§ãããšèããŠããŸãã 誰ãã粟床ãäžããå¿ èŠãããå Žåãããã®DDS容éãå¢ããããšãã§ããŸãïŒè«çåè·¯ã®é床ãå ç®åšã§ãããããCLK = 200 MHzã§ããããšãTimeQuest Timing Analyzerã§ç¢ºèªããããšãå¿ããªãã§ãã ããïŒãåºç¯å²ã®åšæ³¢æ°ã¯å¿ èŠãããŸããã
TimeQuest Timing Analyzer
ç»é¢ã§ãã®ãããããèŠãåŸã家æã®ããã§ç§ã¯ãã®åœïŒäŒæ¥ïŒã«è¡ãããšãäœåãªããããŸããã ããã§ã¯ãã±ãããåãã調çããã°ãªã«ããŸããããããŠãå€æ¹ã«åŸ ã£ãŠãããšããé©ããçããŸããã§ããã ãã§ã«å€ã«è¿ã¥ããŠãå¯ãåã«ãä»ã®åšæ³¢æ°ã®æ³¢åœ¢ãèŠãããšã«ããŸããã
åšæ³¢æ°ã100 kHzã®å Žå
250 kHzã®åšæ³¢æ°ã®å Žå
500 kHzã®åšæ³¢æ°ã®å Žå
åšæ³¢æ°1 MHzã®å Žå
ç¹ã«1 MHzïŒæ²æšã§äŸ¡å€ã®ãªãã¡ã¬ãã«ãïŒïŒã§ã波圢ãç§ãã²ã£ããè¿ãããšãé ããŸããã ä»ã®ããã€ãã®æ³šæã®é »åºŠãååŸããäºå®ã§ããã R2R DACã«ã€ããŠèªãã åŸãåé¡ã®åå ãæããã«ãªããŸãã-æµ®é容éã ãããã£ãŠãç¿æ¥ã®èšç»ã§ã¯ãç§ãæã£ãŠãã100ããã³200ãªãŒã ã®æµæåšã§DACãäœæãããã®ãããªé«åšæ³¢ã§ã®äœæ¥ãå¿ èŠãšããªãå°æ¥ã®éçºã®ããã«ãã®DACãæ®ãããšã決å®ãããŸãããéžã®æ»ãããã«ãç¬èªã®ãã©ã¹ãããããã§ãã
äºæ¥ç®
DACã100ãªãŒã ã®æµæåšãš200ãªãŒã ã®æµæåšã§ã©ã®ããã«æ©èœãããããããããã£ããããããã«ã¯ãã ããŠãåãäžããŸããã ä»åã¯DACãããæ£ç¢ºã§ããããšãå€æããã€ã³ã¹ããŒã«ã«ãããæéãççž®ãããŸããã
DACãFPGAããŒãã«é 眮ãããªã·ãã¹ã³ãŒãã«æ¥ç¶ããŸã
1 MHz-INããã§ãã¯ããŸãïŒ å®å šã«ç°ãªãåé¡ïŒ
10 MHzãèŠã
25 MHzãèŠã
10 MHzã®ã®ãããã®åœ¢ç¶ã¯ãæ£ãã圢ç¶ãšåæ§ã§ãã ãããã25 MHzã§ã¯æ¢ã«å®å šã«ãçŸãããããŸãããã ãã ããC1-112aã®åž¯åå¹ ã¯10 MHzã§ããããããã®å Žåãçç±ã¯ãã§ã«ãªã·ãã¹ã³ãŒãã«ããå¯èœæ§ããããŸãã
ååãšããŠãDACã®ãã®åé¡ã¯ã¯ããŒãºããšèŠãªãããšãã§ããŸãã ããã§ã¯ãé«éåºå波圢ãèŠãŠã¿ãŸãããã ãããè¡ãã«ã¯ãæäžäœããããå¥ã®PIN FPGAã«åºåããŸãã ãã®ã©ã€ã³ã®ããŒã¿ã¯ãDDSããããªãŒã®æäžäœãããããååŸããŸãã
assign hs_out = accumulator[31];
1 MHzã®èè¡
5 MHzã®èè¡
25 MHzã®èè¡
50 MHzã®èè¡ã¯ã»ãšãã©èŠããŸãã
ããããFPGAåºåã¯æµæã«è² è·ããããå¿ èŠããããšæããŸãã ãããããåç·ã¯ããæ¥åŸé ã«ãªãã§ãããã
ãµã€ã³ã¯è¡šã«åŸã£ãŠè¡ãããŸãã ããŒãã«ã®ãµã€ãºã¯8ãããã®256å€ã§ãã 1ã€ä»¥äžã䜿çšã§ããŸããããã§ã«æºåãã§ããŠããmifãã¡ã€ã«ããããŸãã ãŠã£ã¶ãŒãã䜿çšããŠãmifãã¡ã€ã«ããã®ãµã€ã³ããŒãã«ããŒã¿ã䜿çšããŠROMèŠçŽ ãäœæããŸãã
ROMã®äœæ-ããŒã«-> Mega Wizard Plugin manager
1ã€ã®ããŒãROMãéžæããã¢ãžã¥ãŒã«ã«ååãä»ããŸã
åæãã
ããã§ãåæããŸã
åç §ã䜿çšããŠãsineããŒãã«ãæã€mifãã¡ã€ã«ãèŠã€ããŸã
ããã§ãäœãå€æŽããŸãã
sine_rom_bb.vã¢ãžã¥ãŒã«ã®ãã§ãã¯ãå€ããŸã-å¿ èŠãããŸããã 次ã®ä»äžãã Quartusã¯ã¢ãžã¥ãŒã«ããããžã§ã¯ãã«è¿œå ããããã«èŠæ±ããŸã-åæããŸãã ãã®åŸãã¢ãžã¥ãŒã«ã¯Verilogã®ä»ã®ã¢ãžã¥ãŒã«ãšåãããã«äœ¿çšã§ããŸãã
1ã€ã®ããŒãROMãéžæããã¢ãžã¥ãŒã«ã«ååãä»ããŸã
åæãã
ããã§ãåæããŸã
åç §ã䜿çšããŠãsineããŒãã«ãæã€mifãã¡ã€ã«ãèŠã€ããŸã
ããã§ãäœãå€æŽããŸãã
sine_rom_bb.vã¢ãžã¥ãŒã«ã®ãã§ãã¯ãå€ããŸã-å¿ èŠãããŸããã 次ã®ä»äžãã Quartusã¯ã¢ãžã¥ãŒã«ããããžã§ã¯ãã«è¿œå ããããã«èŠæ±ããŸã-åæããŸãã ãã®åŸãã¢ãžã¥ãŒã«ã¯Verilogã®ä»ã®ã¢ãžã¥ãŒã«ãšåãããã«äœ¿çšã§ããŸãã
DDSããããªã¯ãŒãã®äžäœ8ãããã¯ROMã¢ãã¬ã¹ãšããŠäœ¿çšãããããŒã¿åºåã¯ãµã€ã³å€ã§ãã
ã³ãŒã
//sine rom wire [7:0] sine_out; sine_rom sine1(.clock(clk200M), .address(accumulator[31:31-7]), .q(sine_out));
ç°ãªãåšæ³¢æ°ã§ã®æ£åŒŠæ³¢ã®æ³¢åœ¢ã¯åãããã«èŠããŸãã
å¿ èŠã«å¿ããŠãæµæã®åºããã«é¢é£ããDACã®åé¡ãæ€èšã§ããŸãã
ããŠããã®é±æ«ã¯çµãããŸããã ããããPCãã管çããããã®ãœãããŠã§ã¢ã¯ãŸã äœæãããŠããŸããã ç· ãåãã«éã«åããªãã£ããšããäºå®ãèªããªããã°ãªããŸããã
3æ¥ç®
æéãã»ãšãã©ãªãã®ã§ãããã°ã©ã ãæ¥ãã§ïŒæé«ã®äŒçµ±ã§ïŒæžããŸãã å Žæã§ã¯ãæåæ°ãæžãããããŒããŒãããæ å ±ãå ¥åãã䟿å©ããæžããããã«ããŠã£ãžã§ããã®ååã«ããã€ãã³ããã£ã«ã¿ãŒãé©çšãããŸãã ãç解ãšã容赊ãã ããã
ã€ã³ã¿ãŒãã§ãŒã¹
GitHubãœãŒã¹ã³ãŒãã Windowsçšã«æ§ç¯ãããã¢ããªã±ãŒã·ã§ã³ãæ¢ã«ãããŸãã
ã³ãŒãã¯5ã»ã³ããšåããããç°¡åã§ãã ãšããããã·ãªã¢ã«ããŒãã¢ãžã¥ãŒã«ã.proãããžã§ã¯ããã¡ã€ã«ã«è¿œå ããå¿ èŠããããŸãã
QT += core gui serialport
COMããŒããéã
QSerialPort serial; ... serial.setPortName(ui->lbSerialPortInfo->currentText()); serial.setBaudRate(QSerialPort::Baud115200); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); serial.open(QIODevice::ReadWrite);
ã¡ãã»ãŒãžã®äœæãšéä¿¡
QByteArray source; QDataStream stream(&source, QIODevice::ReadWrite); stream << (qint8)(01); // set freq msg stream << waveform; stream << adder32; serial.write(source);
4æ¥ç®
æ¥ãã§ãUARTããŒã¿ã®åä¿¡ãå®äºããŠããŸãã UARTãä»ããŠã¡ãã»ãŒãžãåä¿¡ããã«ã¯ãããã€ãã®ã¢ãžã¥ãŒã«ãé 眮ããå¿ èŠããããŸãã 1ã€ã®ããŒãžã§ãã¬ãŒã¿ã2çªç®-ã¬ã·ãŒãã åä¿¡æ©ã115200ã§åäœããããã«ã¯ãã¡ã€ã³ã¯ããã¯åšæ³¢æ°ã200 MHzã§ãããšããäºå®ã«åºã¥ããŠèšç®ãè¡ãå¿ èŠããããŸãã
baud_genã¢ãžã¥ãŒã«
parameter global_clock_freq = 200000000; parameter baud_rate = 115200; // - UART // first register: // baud_freq = 16*baud_rate / gcd(global_clock_freq, 16*baud_rate) //Greatest Common Divisor - . http://www.alcula.com/calculators/math/gcd/ // second register: // baud_limit = (global_clock_freq / gcd(global_clock_freq, 16*baud_rate)) - baud_freq // parameter GCD = (baud_rate==115200) ? 12800 : 0; parameter baud_freq = 16*baud_rate / GCD; parameter baud_limit = (global_clock_freq / GCD) - baud_freq; wire uart_clk; baud_gen BG(.clock(clk), .reset(rst), .ce_16(uart_clk), .baud_freq(baud_freq), .baud_limit(baud_limit));
ã¡ãã»ãŒãžãåä¿¡ããããã®ã¢ãžã¥ãŒã«ãé 眮ããuart_clkãšFPGAã®ç©çå ¥åããã®ä¿¡å·ãäŸçµŠãããŸãã
Uart_rxã¢ãžã¥ãŒã«
//RCV wire [7:0] uart_command; wire uart_data_ready; uart_rx URX(.clock(clk), .reset(rst), .ce_16(uart_clk), .ser_in(rx), .rx_data(uart_command), .new_rx_data(uart_data_ready) );
次ã«ãããããã¹ãŠãåå¥ã®ã¢ãžã¥ãŒã«ã«é 眮ããŸãããã®ã¢ãžã¥ãŒã«ã¯ã波圢ã®æ°ãšå¢åã®å€ã®ã¿ãDDSãã§ãŒãºã®ããããªãŒã¬ãžã¹ã¿ã«åºåããŸãã
Ctrl.vã¢ãžã¥ãŒã«
module ctrl(clk, rst, rx, wf, adder); input wire clk, rst, rx; output wire [7:0] wf; //wave form output wire [31:0] adder;// adder value reg [7:0] wf_reg; initial wf_reg <= 8'd0; reg [31:0] adder_reg; initial adder_reg <= 32'd1073741;
uart_rxã¢ãžã¥ãŒã«ã¯1ãã€ãã®æ å ±ãåä¿¡ãããšã1ã¯ããã¯ãµã€ã¯ã«ã®éãuart_data_readyè¡ããŠãããã«å ¥ããŸãã ãã®æç¹ã§ãåä¿¡ãããã€ãã¯uart_commandè¡ã«ãããŸãã ã¡ãã»ãŒãžãåä¿¡ããããã«ãã¹ããŒããã·ã³ãäœæããŠããŸãã
ã¹ããŒããã·ã³
//rcv state machine parameter SM_READY = 4'd0; parameter SM_FRQ_WF = 4'd1; parameter SM_FRQ_DDS1 = 4'd2; parameter SM_FRQ_DDS2 = 4'd3; parameter SM_FRQ_DDS3 = 4'd4; parameter SM_FRQ_DDS4 = 4'd5; //messages parameter CMD_SETFREQ = 8'd1; reg [3:0] rcv_state; initial rcv_state <= SM_READY; always @ (posedge clk) begin if (uart_data_ready==1) begin if (rcv_state==SM_READY) begin rcv_state = (uart_command==CMD_SETFREQ) ? SM_FRQ_WF : rcv_state; end else if (rcv_state==SM_FRQ_WF) begin wf_reg <= uart_command; rcv_state <= rcv_state + 1'b1; end else if (rcv_state==SM_FRQ_DDS1) begin adder_reg <= (adder_reg << 8) + uart_command; rcv_state <= rcv_state + 1'b1; end else if (rcv_state==SM_FRQ_DDS2) begin adder_reg <= (adder_reg << 8) + uart_command; rcv_state <= rcv_state + 1'b1; end else if (rcv_state==SM_FRQ_DDS3) begin adder_reg <= (adder_reg << 8) + uart_command; rcv_state <= rcv_state + 1'b1; end else if (rcv_state==SM_FRQ_DDS4) begin adder_reg <= (adder_reg << 8) + uart_command; rcv_state <= SM_READY; end else begin rcv_state <= SM_READY; end end //ucom_ready end
ã¢ãžã¥ãŒã«åºåã«ããŒã¿ãåºåããŸã
ãããã«
assign adder = adder_reg; assign wf = wf_reg;
ã¡ã€ã³ã¢ãžã¥ãŒã«ã«åä¿¡ã¢ãžã¥ãŒã«ãè¿œå ããŸãã
ã¡ã€ã³ã¢ãžã¥ãŒã«ã«ctrlã¢ãžã¥ãŒã«ãè¿œå ããŸã
//rs232 rcvr wire [31:0] adder_value; wire [7:0] waveform; ctrl ctrl_0(.clk(clk200M), .rst(rst), .rx(RS232in), .wf(waveform), .adder(adder_value));
å¢åå€ã¯ã¢ãã¥ã ã¬ãŒã¿ãã§ãŒãºã«è¿œå ãããŸã
ãµã€ã¯ã«ããšã«ããããªãŒã®äŸ¡å€ãé«ãã
always @(posedge clk200M) begin accumulator <= accumulator + adder_value; end
äœçžã¢ãã¥ã ã¬ãŒã¿å€ã®å€ãéšåãããæ®ãã®æ³¢åœ¢ãååŸããŸãã ãããŠãéžæãããã©ãŒã ã«å¿ããŠ-åºåã«æ¥ç¶ããŸãã
波圢
// wave_forms parameter SINE = 8'd0; parameter SAW = 8'd1; parameter RAMP = 8'd2; parameter TRIA = 8'd3; parameter SQUARE = 8'd4; parameter SAWTRI = 8'd5; parameter NOISE = 8'd6; wire [7:0] saw_out = accumulator[31:31-7]; wire [7:0] noise_out = 8'd127; //! wire [7:0] ramp_out = -saw_out; wire [7:0] square_out = (saw_out > 127) ? 8'b11111111 : 1'b00000000; wire [7:0] saw_tri_out = (saw_out > 7'd127) ? -saw_out : 8'd127 + saw_out; wire [7:0] tri_out = (saw_out>8'd191) ? 7'd127 + ((saw_out << 1) - 9'd511) : (saw_out>8'd063) ? 8'd255 - ((saw_out << 1) - 7'd127) : 7'd127 + (saw_out << 1); //sine rom wire [7:0] sine_out; sine_rom sine1(.clock(clk200M), .address(saw_out), .q(sine_out)); wire [7:0] signal = (waveform == SINE) ? sine_out : (waveform == SAW) ? saw_out : (waveform == RAMP) ? ramp_out : (waveform == TRIA) ? tri_out : (waveform == SQUARE) ? square_out : (waveform == SAWTRI) ? saw_tri_out : (waveform == NOISE) ? noise_out : 8'd127; //TODO
ãããããã«æ©èœããããšã¯ã»ãšãã©é©ããŸããã§ããã ç§ãèŠã€ããå¯äžã®ãšã©ãŒã¯èšç®ã«ãããŸããïŒç®çã®åšæ³¢æ°ãCLKã§é€ç®ããããã«2ã€ã§é€ç®ããŠãããããããªãŒå®¹éãä¹ç®ããŸããã ãã ããããããªãŒã®å€ã0ããMAXã«å€åãããšãã«1æéãååŸãããããããã¯å¿ èŠãããŸããã åšæ³¢æ°ã¢ãã¥ã ã¬ãŒã¿ã®é«æ¬¡ããããèè¡åºåãšããŠäœ¿çšããå Žåã«ã®ã¿ãããã«2ã§é€ç®ããŸãïŒãã®å Žåãåšæ³¢æ°ã¯2åäœããªããŸãïŒã ããããç§ã¯èè¡ã®é åæžãããçŽããŸããã
4æ¥ç®
æ¯æ¥èšäºãæžãã®ã«è²»ãããæéãå«ããããšãã§ããŸãã
æ€èšŒã«é²ã¿ãŸãã ãŸãã¯ãªã·ãã¹ã³ãŒãã
28ã100 MHzã®ç¡ç·åšæ³¢æ°ã§ã¯ãããŒãã®é£ã«ã¢ã³ãããé 眮ããŠãSDRã¬ã·ãŒããŒã䜿çšããŠãžã§ãã¬ãŒã¿ãŒãèŽãããšã«ããŸããã
çµè«
ITã§ããããããšã§ãããã¿ã€ãã³ã°ã§ãšã©ãŒã2ã2.5åçºçããŸããã ç®æšã¯éæãããŠããŸãïŒæ倧100 MHzã®ãžã§ãã¬ãŒã¿ãŒãèã«åãä»ããããŠããŸãã ãã ãããã®ã¯ã©ãããæ¬æ Œçãªãžã§ãã¬ãŒã¿ãŒãšåŒã¶ã«ã¯ãããã«äœæ¥ããå¿ èŠããããŸãã ãããã£ãŠãéçºã®å€§ããªèŠéãããããŸãã ç· ãåãã«å€±æãããããååãšããŠã§ããããšã¯è¿œå ããŸããã§ããã1ïŒãã€ãºãžã§ãã¬ãŒã¿ã 2ïŒãŠãŒã¶ãŒãèªåã§æããŠã§ãŒããžã§ãã¬ãŒã¿ãŒã 3ïŒããžã¿ã«ã·ãŒã±ã³ã¹ãžã§ãã¬ãŒã¿ãŒã ãžã§ãã¬ãŒã¿ãŒã«ã¯ãŸã æ¯å¹ ãšãã€ã¢ã¹ã®èª¿æŽã¯ãããŸããã
10000åäž227åã®ã»ã«ã䜿çšããŸãããä»ã«ãããžã§ã¯ãã«è¿œå ã§ãããã®ã®ãªã¹ãïŒ
- DACãå±éãã
- çæãããä¿¡å·ã§åºåæ°ãå¢ãã
- 倧容éã®DACããããé©çšãã
- æ¯å¹ ããã³ãªãã»ããå¶åŸ¡ãå®è£ ãã
- 移æ€æ§ã®ããã«ãã³ã³ãããŒã«ãLCDã¹ã¯ãªãŒã³ãè¿œå
- ãã€ãºãžã§ãã¬ãŒã¿ãŒããã³ãã®ä»ã®åçŽãªæ³¢åœ¢ãè¿œå ãã
- ä»»æ波圢ãããŒãããæ©èœãè¿œå ããŸã
誰ã§ãèªåã§ãããè¡ãããšãã§ããå¿ èŠãªæ©èœãåãããããžã§ã¯ããæ¡åŒµã§ãããšæããŸãã è¿œå ã¯æåããè¡ããããç°¡åã§ãã å¶åŸ¡ã³ãã³ãã®åœ¢åŒã¯éåžžã«åçŽãªã®ã§ããžã§ãã¬ãŒã¿ãŒã¯ãã€ã¯ãã³ã³ãããŒã©ãŒããå¶åŸ¡ã§ããŸãã
ãœãŒã¹ã³ãŒãïŒ https : //github.com/UA3MQJ/fpga-signal-generator
ã¢ããã°ãšã®ãªã³ã¯
å®å šãªãªã¹ãããã¯ã»ã©é ã
æ©èœçãªDDSãžã§ãã¬ãŒã¿ãŒã AVRããŒã¹ã«ãã£ãŠäœæãããŸããã åšæ³¢æ°0 ... 65534 Hzã
DDSãžã§ãã¬ãŒã¿ãŒGK101ã®æŠèŠã ã¢ã«ãã©ã®MAX240 FPGAã§äœæã æ倧10 MHzã®åšæ³¢æ°ã
PIC16F870ã®ãã«ããã¡ã³ã¯ã·ã§ã³ãžã§ãã¬ãŒã¿ãŒã åšæ³¢æ°ç¯å²ïŒ11 Hz-60 kHzã
ã¢ããã°é¢æ°çºçåšã åšæ³¢æ°ç¯å²ã¯20 Hzã300 kHzã§ã
AD9833ã®USBãã¡ã³ã¯ã·ã§ã³ãžã§ãã¬ãŒã¿ãŒã DDSãããã«åºã¥ããŠããŸãã
Mini DDSã¯ãæãã·ã³ãã«ãª137 kHzãã©ã³ã¹ããã¿ãªã©ã§ãã åšæ³¢æ°136 kHzã
DDSã¯ãPLMã§ããžã£ã³ããŒãå¶åŸ¡ãåããæ©èœãžã§ãã¬ãŒã¿ã§ãã