【正文】
OMPONENT。COMPONENT SpeakeraPORT(clk: IN STD_LOGIC。 Tone: IN INTEGER RANGE 0 TO 161FFF。 fullspks: OUT STD_LOGIC)。END COMPONENT。SIGNAL Tone: INTEGER RANGE 0 TO 161FFF。SIGNAL ToneIndex: INTEGER RANGE 0 TO 15。BEGINu1: NoteTabs PORT MAP(clk=CLK4MHZ,ToneIndex=ToneIndex)。u2: ToneTaba PORT MAP(Index=ToneIndex, Tone=Tone)。u3: Speakera PORT MAP(clk=CLK4MHZ, Tone=Tone, fullspks=SPKOUT)。END。揚(yáng)聲器發(fā)生及分頻模塊library ieee。use 。entity Speakera isPORT(clk: IN STD_LOGIC。 Tone: IN INTEGER RANGE 0 TO 161FFF。 fullspks: OUT STD_LOGIC)。END 。architecture one of Speakera issignal CLK4MHz:std_logic。beginprocess(clk)variable t:integer range 0 to 160FFF。variable ff:std_logic。beginif clk39。event and clk=39。139。 thenif t2 thent:=t+1。elset:=0。ff:=not ff。 反向end if。end if。clk4MHz=ff。end process。process(CLK4MHz, Tone)variable Count11: integer range 0 to 20。variable ft:std_logic。begin if CLK4MHz39。event and CLK4MHz=39。139。 thenif Count1115 thenCount11:=Count11+1。elsecount11:=Tone。ft:=not ft。end if。end if。fullspks=ft。end process。END。音符預(yù)置數(shù)模塊library ieee。use 。entity ToneTaba isPORT(index: IN INTEGER RANGE 0 TO 15。 Tone: OUT INTEGER RANGE 0 TO 8191)。END。architecture one of ToneTaba isbegin process(index)begin case Index iswhen 0 = Tone=8191。when 1 = Tone=4369。when 2 = Tone=4786。when 3 = Tone=5157。when 4 = Tone=5328。when 5 = Tone=5640。when 6 = Tone=5918。when 7 = Tone=6166。when 8 = Tone=6380。when 9 = Tone=6488。when 10 = Tone=6674。when 11 = Tone=6859。when 12 = Tone=6916。when 13 = Tone=3089。when 14 = Tone=3646。when 15 = Tone=4141。when others=NULL。end case。end process。end。音符儲存模塊library ieee。use 。entity NoteTabs isPORT(clk: IN STD_LOGIC。 ToneIndex: OUT INTEGER RANGE 0 TO 15)。END。architecture one of NoteTabs issignal CLK4Hz:std_logic。beginp2:process(clk) variable n:integer range 0 to 6249999。 分頻系數(shù)為6249999variable dd:std_logic。beginif clk39。event and clk=39。139。 thenif n6249999 thenn:=n+1。elsen:=0。dd:=not dd。 end if。end if。clk4Hz =dd。end process p2。process(clk4Hz)VARIABLE Counter :integer range 0 to 130。begin IF clk4Hz39。event AND clk4Hz=39。139。THEN if counter=128 then if counter=127 then counter:=0。 end if。 CASE counter IS when 00=ToneIndex=7。when 01=ToneIndex=7。when 02=ToneIndex=8。when 03=ToneIndex=8。when 04=ToneIndex=9。when 05=ToneIndex=9。when 06=ToneIndex=10。when 07=ToneIndex=10。when 08=ToneIndex=11。when 09=ToneIndex=11。when 10=ToneIndex=9。when 11=ToneIndex=9。when 12=ToneIndex=8。when 13=