⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speakera.vhd

📁 上个用VHDL语言写的音乐程序,希望对大家能够有帮助
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY Speakera IS
    PORT (  clk  : IN STD_LOGIC;
             Tone : IN INTEGER RANGE 0 TO 16#7FF#;
             SpkS : OUT STD_LOGIC  );
END;
ARCHITECTURE one OF Speakera IS
  SIGNAL  clk1 	:   STD_LOGIC;
  SIGNAL 	QN		: 	STD_LOGIC_VECTOR(3 DOWNTO 0);	     
  SIGNAL PreCLK : STD_LOGIC;
    SIGNAL FullSpkS : STD_LOGIC;
BEGIN
 PROCESS (clk)				-- *** COUNTER
		BEGIN
				IF clk1 = '1' THEN
					QN <= "0101";		-- Set Counter	
				ELSIF clk'event AND clk='1' THEN
					QN <= QN - 1;		-- COUNTER - 1 
				END IF;
		END PROCESS;			

		clk1 <= QN(1);
		
DivideCLK : PROCESS(clk1)
        VARIABLE Count4 : INTEGER RANGE 0 TO 15;
    BEGIN
        PreCLK <= '0';
                --  将CLK进行16分频,PreCLK为CLK的16分频
        IF Count4 > 11  THEN  
            PreCLK <= '1';
            Count4 := 0;
        ELSIF clk1'EVENT AND clk1 = '1' THEN
            Count4 := Count4 + 1;            
        END IF;
    END PROCESS;
    GenSpkS : PROCESS(PreCLK, Tone)
        VARIABLE Count11 : INTEGER RANGE 0 TO 16#7FF#;
BEGIN
            -- 11位可预置计数器
        IF PreCLK'EVENT AND PreCLK = '1' THEN
            IF Count11 = 16#7FF# THEN
                Count11 := Tone;
                FullSpkS <= '1';                
            ELSE
                Count11 := Count11 + 1;
                FullSpkS <= '0';                
            END IF;
        END IF;
    END PROCESS;
    DelaySpkS : PROCESS(FullSpkS)
        VARIABLE Count2 : STD_LOGIC;
BEGIN
                 -- 将输出再进行2分频,将脉冲展宽,以使扬声器有足够功率发音
        IF FullSpkS'EVENT AND FullSpkS = '1' THEN
            Count2 := NOT Count2;
            IF Count2 = '1' THEN  SpkS <= '1';
            ELSE
                SpkS <= '0';
            END IF;
        END IF;
    END PROCESS;
END;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -