Ó²¼þµç×ÓÇÙµç·ģ¿éÉè¼Æ
Ò»¡¢ÊµÑéÄ¿µÄ£º
ѧϰÀûÓÃÊý¿Ø·ÖƵÆ÷Éè¼ÆÓ²¼þµç×ÓÇÙʵÑé¡£ ¶þ¡¢ÊµÑéÔÀí£º
ʵÑéÓÃFPGAʵÏÖÀÖÇúµÄ²¥·ÅÔÀí£º ? ·ÖËIJ½
1¡¢½«´ý²¥·ÅµÄ¡¶Áº×£¡·ÒôÀÖÒô·û´æÈëROM 2¡¢ÒÔ4HZƵÂʶÁÈ¡ROM
3¡¢¸ù¾Ý1MHZµÄÄÚ²¿Ê±ÖÓÒªÇ󣬽«¶Á³öµÄÒô·û»»Ëã³ÉÓ¦¼ÆÊýµÄÊýÖµ 4¡¢ÒÔ1MHZΪÄÚ²¿Ê±ÖÓ£¬ÊµÏÖ·ûºÏÒªÇóµÄ·½²¨Ðźš£
ͼ1 Ó²¼þµç×ÓÇٵ緽ṹ
Ö÷ϵͳÓÉÎå¸öÄ£¿é×é³É£¬songer.vÊǶ¥²ãÉè¼ÆÎļþ£¬ÆäÄÚ²¿ÓÐÎå¸ö¹¦ÄÜÄ£¿é£¨Èçͼ1Ëùʾ£©£ºSpeakera.v ºÍToneTaba.v£¬NoteTabs.v£¬div_50_12M.v,div_50_4HZ.v¡£
Ä£¿éToneTabaÊÇÒô½×·¢ÉúÆ÷£¬µ±8λ·¢Éù¿ØÖÆÊäÈëIndexÖÐijһλΪ¸ßµçƽʱ£¬Ôò¶ÔӦijһÒô½×µÄÊýÖµ½«´Ó¶Ë¿ÚToneÊä³ö£¬×÷Ϊ»ñµÃ¸ÃÒô½×µÄ·ÖƵԤÖÃÖµ£»Í¬Ê±ÓÉCodeÊä³ö¶ÔÓ¦¸ÃÒô½×¼òÆ×µÄÏÔʾÊýÂ룬Èç¡®5¡¯£¬²¢ÓÉHighÊä³öָʾÒô½×¸ß8¶ÈÏÔʾ¡£
Ä£¿éSpeakeraÖеÄÖ÷Òªµç·ÊÇÒ»¸öÊý¿Ø·ÖƵÆ÷£¬ËüÓÉÒ»¸ö³õÖµ¿ÉÔ¤Öõļӷ¨¼ÆÊýÆ÷¹¹³É£¬µ±Ä£¿éSpeakeraÓɶ˿ÚTone»ñµÃÒ»¸ö2½øÖÆÊýºó£¬½«ÒÔ´ËֵΪ¼ÆÊýÆ÷µÄÔ¤ÖÃÊý£¬¶Ô¶Ë¿ÚClk12MHZÊäÈëµÄƵÂʽøÐÐ·ÖÆµ£¬Ö®ºóÓÉSpkoutÏòÑïÉùÆ÷Êä³ö·¢Éù¡£
Ôö¼ÓÒ»¸öNoteTabsÄ£¿éÓÃÓÚ²úÉú½ÚÅÄ¿ØÖÆ£¨IndexÊý¾Ý´æÁôʱ¼ä£©ºÍÒô½×Ñ¡ÔñÐźţ¬¼´ÔÚNoteTabsÄ£¿é·ÅÖÃÒ»¸öÀÖÇúÇúÆ×ÕæÖµ±í£¬ÓÉÒ»¸ö¼ÆÊýÆ÷µÄ¼ÆÊýÖµÀ´¿ØÖÆ´ËÕæÖµ±íµÄÊä³ö£¬¶øÓɴ˼ÆÊýÆ÷µÄ¼ÆÊýʱÖÓÐźÅ×÷ΪÀÖÇú½ÚÅÄ¿ØÖÆÐźţ¬´Ó¶ø¿ÉÒÔÉè¼Æ³öÒ»¸ö´¿Ó²¼þµÄÀÖÇú×Ô¶¯ÑÝ×àµç·¡£
div_50_12M.vÊÇÓÉÓÚʵÑé°åÉÏ£¬Ö»ÓÐ50MHZÓÐÔ´¾§Õñ£¬¹Ê½«ÓÃ50MHZ½øÐÐ·ÖÆµÊµÏÖ12.5MHZµÄʱÖÓ£¬ÔÚºóÐøÄ£¿éSpeakera.vÖÐÔÙ·ÖÆµµÃµ½½üËÆ1MHZʱÖÓ¡£
div_50_4HZ.vÊÇÓÃϵͳÐèÒª4HZƵÂʶÁROM£¬ÓÚÊÇÓÃ50MHZ£¬·ÖƵµÃµ½4HZƵÂÊ¡£
Èý¡¢ÊµÑéÄÚÈÝ£º
1£®×Ô¼º±àд12.5 MHZºÍ4HZµÄ·ÖƵ³ÌÐòdiv_50_12MºÍdiv_50_4HZ¡£ÓÃCLOCK=50MHZ(PIN_N2)µÄÊäÈëÆµÂʽÓÈë²¢½øÐÐ·ÖÆµµÃ12.5MHz£¬´ËÐźÅ×÷ΪSpeakeraÄ£¿éµÄÊäÈëÆµÂÊ£»ÓÃCLOCK=50MHZµÄÊäÈëÆµÂʽÓÈë²¢½øÐÐ·ÖÆµµÃ4Hz£¬´ËÐźÅ×÷ΪNoteTabsÄ£¿éµÄÊäÈëÆµÂÊ¡£
2£®MusicÄ£¿éÓÃROMµÄIP CORE´æ·Å¡°Áº×£¡±ÀÖÇúÑÝ×àÊý¾Ý£¬±àд²¢¼ÓÔØ.COEÎļþ·ÅÖÃÁº×£¡±ÀÖÇúÑÝ×àÊý¾Ý¡£
3£®±àÒëÊÊÅäÒÔÉÏÎļþ£¬¸ø³ö·ÂÕæ²¨ÐΣ¬×îºó½øÐÐÏÂÔØºÍÓ²¼þ²âÊÔʵÑé¡£ 4£®Ñ¡ÔñLD5~LD2·¢¹â¹ÜÏÔʾCode[3]~Code[0]±íʾÇÙÒô¼òÆ×Â룬·¢¹â¹ÜLD7ÏÔʾ¸ß8¶È£¬SPEAKOUT½Ó·äÃùÆ÷¶Ë¿Ú¡£
¹¤³Ì·Ö²¼£º
¶¥²ãÄ£¿é£ºsonger.v
module songer(clk_50M,reset,Code1,High1,Spkout); input clk_50M;//CLK=50MHZ input reset;
output[3:0] Code1; output High1,Spkout; wire[10:0] Tone;
wire[3:0] ToneIndex;
wire clk_4HZ,clk_12M; NoteTabs u0( .Clk(clk_4HZ), .ToneIndex(ToneIndex) );
ToneTaba u1( .Index(ToneIndex), .Code(Code1), .High(High1), .Tone(Tone) ); Speakera u2( .Clk(clk_12M), .Tone(Tone), .SpkS(Spkout) );
div_50_12M u3(clk_50M,clk_12M,reset); div_50_4HZ u4(clk_50M,clk_4HZ,reset); endmodule
NoteTabsÄ£¿é£º
module NoteTabs(Clk,ToneIndex); input Clk;
output[3:0] ToneIndex; reg[7:0] Counter;
always@(posedge Clk ) begin if(Counter>=138) Counter<=8'b00000000; else Counter<=Counter+1'b1; end
Music u5( .address(Counter), .clock(Clk), .q(ToneIndex) ); endmodule
ToneTabaÄ£¿é£º
module ToneTaba (Index,Code,High,Tone); input[3:0] Index; output[3:0] Code; output High; output[10:0] Tone; reg[3:0] Code; reg High; reg[10:0] Tone; always @ (Index) begin
case(Index)
4'b0000 :begin Tone<=11'b11111111111;Code<=4'b0000;High<=1'b0;end//2047 4'b0001 :begin Tone<=11'b01100000101;Code<=4'b0001;High<=1'b0;end//773 4'b0010 :begin Tone<=11'b01110010000;Code<=4'b0010;High<=1'b0;end//912 4'b0011 :begin Tone<=11'b10000001100;Code<=4'b0011;High<=1'b0;end//1036