Speakera.vhd
上传用户:jnxfc1
上传日期:2022-08-09
资源大小:363k
文件大小:10k
源码类别:

VHDL/FPGA/Verilog

开发平台:

Others

  1. ---------------------------------------------------------------------------------------------------
  2. --*************************************************************************************************
  3. --  CreateDate  :  2007-07-24 
  4. --  ModifData   :  2007-07-24 
  5. --  Description :  Perform Music 
  6. --    
  7. --  Author      :  Explorer01 
  8. --  Version     :  V1.0  
  9. --*************************************************************************************************
  10. ---------------------------------------------------------------------------------------------------
  11. -- VHDL library Declarations 
  12. LIBRARY IEEE;
  13. USE IEEE.std_logic_1164.ALL;
  14. USE IEEE.std_logic_unsigned.ALL;
  15. use IEEE.STD_LOGIC_ARITH.ALL;
  16. ---------------------------------------------------------------------------------------------------
  17. ---------------------------------------------------------------------------------------------------
  18. -- The Entity Declarations 
  19. ENTITY Speakera IS
  20. PORT 
  21. (
  22. RESET: IN STD_LOGIC;
  23. CLK:   IN STD_LOGIC;  -- Period : 
  24. CLK8Hz:IN STD_LOGIC;  -- Period : 8Hz 
  25. ToneOut : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
  26. BEEP    : OUT STD_LOGIC
  27. );
  28. END Speakera;
  29. ---------------------------------------------------------------------------------------------------
  30. ---------------------------------------------------------------------------------------------------
  31. -- The Architecture of Entity Declarations 
  32. ARCHITECTURE Speakera_arch OF Speakera IS
  33. ----------------------------
  34. SIGNAL ToneIndex : INTEGER RANGE 0 TO 15;
  35. SIGNAL CODE  : INTEGER RANGE 0 TO 15;
  36. SIGNAL Tone  : INTEGER RANGE 0 TO 16#7FF#;
  37. SIGNAL HIGH  : STD_LOGIC;
  38. SIGNAL FullSpkS : STD_LOGIC;
  39. ----------------------------
  40. SIGNAL Counter : INTEGER RANGE 0 TO 138;
  41. BEGIN
  42. -------------------------------------------------
  43. -- 
  44. Search : PROCESS( ToneIndex )
  45. BEGIN
  46. -- Encoder, Controlling the Tone 
  47. CASE ToneIndex IS 
  48.             WHEN 0  => Tone <= 2047; CODE <= 0; HIGH <= '0';  
  49.             WHEN 1  => Tone <= 773;  CODE <= 1; HIGH <= '0';  
  50.             WHEN 2  => Tone <= 912;  CODE <= 2; HIGH <= '0';  
  51.             WHEN 3  => Tone <= 1036; CODE <= 3; HIGH <= '0';  
  52.             WHEN 5  => Tone <= 1197; CODE <= 5; HIGH <= '0';  
  53.             WHEN 6  => Tone <= 1290; CODE <= 6; HIGH <= '0';  
  54.             WHEN 7  => Tone <= 1372; CODE <= 7; HIGH <= '0';  
  55.             WHEN 8  => Tone <= 1410; CODE <= 1; HIGH <= '1';  
  56.             WHEN 9  => Tone <= 1480; CODE <= 2; HIGH <= '1';  
  57.             WHEN 10 => Tone <= 1542; CODE <= 3; HIGH <= '1';  
  58.             WHEN 12 => Tone <= 1622; CODE <= 5; HIGH <= '1';  
  59.             WHEN 13 => Tone <= 1668; CODE <= 6; HIGH <= '1';  
  60.             WHEN 15 => Tone <= 1728; CODE <= 1; HIGH <= '1';  
  61.             WHEN OTHERS => NULL;
  62.         END CASE;
  63. END PROCESS;
  64. ToneOut <= CONV_STD_LOGIC_VECTOR( CODE, 4 ); 
  65. -------------------------------------------------
  66. -- 
  67. GenSpkS : PROCESS( CLK, Tone )
  68. VARIABLE Count11 : INTEGER RANGE 0 TO 16#7FF#;
  69. BEGIN
  70. IF( CLK'EVENT AND CLK = '1' ) THEN
  71. IF( Count11 = 16#7FF# ) THEN
  72. Count11 := Tone;
  73. FullSpkS <= '1';
  74. ELSE
  75. Count11 := Count11 + 1;
  76. FullSpkS <= '0'; 
  77. END IF;
  78. END IF;
  79. END PROCESS;
  80. -------------------------------------------------
  81. -- 
  82. SpkOut : PROCESS( FullSpkS )
  83. VARIABLE Count2 : STD_LOGIC;
  84. VARIABLE SpkS   : STD_LOGIC;
  85. BEGIN
  86. IF( FullSpkS'EVENT AND FullSpkS = '1' ) THEN
  87. Count2 := NOT Count2;
  88. IF( Count2 = '1' ) THEN SpkS := '1';
  89. ELSE SpkS := '0';
  90. END IF;
  91. END IF; 
  92. BEEP <= SpkS; 
  93. END PROCESS;
  94. -------------------------------------------------
  95. -- 
  96. PROCESS( CLK8Hz, Counter )
  97. BEGIN
  98. IF( Counter = 138 ) THEN  Counter <= 0;
  99. ELSIF(CLK8Hz'EVENT AND CLK8Hz = '1') THEN
  100. Counter <= Counter + 1;
  101. END IF;
  102. CASE Counter IS
  103. WHEN 00  => ToneIndex <= 3;       -- 简谱"3"音
  104.             WHEN 01  => ToneIndex <= 3;       -- 发4个时钟节拍
  105.             WHEN 02  => ToneIndex <= 3;
  106.             WHEN 03  => ToneIndex <= 3;
  107.             WHEN 04  => ToneIndex <= 5;       -- 简谱"5"音
  108.             WHEN 05  => ToneIndex <= 5;       -- 发3个时钟节拍
  109.             WHEN 06  => ToneIndex <= 5;
  110.             WHEN 07  => ToneIndex <= 6;       -- 简谱"6"音
  111.             WHEN 08  => ToneIndex <= 8;
  112.             WHEN 09  => ToneIndex <= 8;
  113.             WHEN 10  => ToneIndex <= 8;
  114.             WHEN 11  => ToneIndex <= 9;
  115.             WHEN 12  => ToneIndex <= 6;
  116.             WHEN 13  => ToneIndex <= 8;
  117.             WHEN 14  => ToneIndex <= 5;
  118.             WHEN 15  => ToneIndex <= 5;
  119.             WHEN 16  => ToneIndex <= 12;
  120.             WHEN 17  => ToneIndex <= 12;
  121.             WHEN 18  => ToneIndex <= 12;
  122.             WHEN 19  => ToneIndex <= 15;
  123.             WHEN 20  => ToneIndex <= 13;
  124.             WHEN 21  => ToneIndex <= 12;
  125.             WHEN 22  => ToneIndex <= 10;
  126.             WHEN 23  => ToneIndex <= 12;
  127.             WHEN 24  => ToneIndex <= 9;
  128.             WHEN 25  => ToneIndex <= 9;
  129.             WHEN 26  => ToneIndex <= 9;
  130.             WHEN 27  => ToneIndex <= 9;
  131.             WHEN 28  => ToneIndex <= 9;
  132.             WHEN 29  => ToneIndex <= 9;
  133.             WHEN 30  => ToneIndex <= 9;
  134.             WHEN 31  => ToneIndex <= 0;
  135.             WHEN 32  => ToneIndex <= 9;
  136.             WHEN 33  => ToneIndex <= 9;    
  137.             WHEN 34  => ToneIndex <= 9;    
  138.             WHEN 35  => ToneIndex <= 10;
  139.             WHEN 36  => ToneIndex <= 7;
  140.             WHEN 37  => ToneIndex <= 7;
  141.             WHEN 38  => ToneIndex <= 6;
  142.             WHEN 39  => ToneIndex <= 6;
  143.   
  144.             WHEN 40  => ToneIndex <= 5;
  145.             WHEN 41  => ToneIndex <= 5;
  146.             WHEN 42  => ToneIndex <= 5;
  147.             WHEN 43  => ToneIndex <= 6;
  148.             WHEN 44  => ToneIndex <= 8;
  149.             WHEN 45  => ToneIndex <= 8;
  150.             WHEN 46  => ToneIndex <= 9;
  151.             WHEN 47  => ToneIndex <= 9;
  152.             WHEN 48  => ToneIndex <= 3;
  153.             WHEN 49  => ToneIndex <= 3;
  154.             WHEN 50  => ToneIndex <= 8;
  155.             WHEN 51  => ToneIndex <= 8;
  156.             WHEN 52  => ToneIndex <= 6;
  157.             WHEN 53  => ToneIndex <= 5;
  158.             WHEN 54  => ToneIndex <= 6;
  159.             WHEN 55  => ToneIndex <= 8;
  160.             WHEN 56  => ToneIndex <= 5;
  161.             WHEN 57  => ToneIndex <= 5;
  162.             WHEN 58  => ToneIndex <= 5;
  163.             WHEN 59  => ToneIndex <= 5;
  164.             WHEN 60  => ToneIndex <= 5;
  165.             WHEN 61  => ToneIndex <= 5;
  166.             WHEN 62  => ToneIndex <= 5;
  167.             WHEN 63  => ToneIndex <= 5;
  168.             WHEN 64  => ToneIndex <= 10;
  169.             WHEN 65  => ToneIndex <= 10;
  170.             WHEN 66  => ToneIndex <= 10;
  171.             WHEN 67  => ToneIndex <= 12;
  172.             WHEN 68  => ToneIndex <= 7;
  173.             WHEN 69  => ToneIndex <= 7;
  174.             WHEN 70  => ToneIndex <= 9;
  175.             WHEN 71  => ToneIndex <= 9;
  176.             WHEN 72  => ToneIndex <= 6;
  177.             WHEN 73  => ToneIndex <= 8;
  178.             WHEN 74  => ToneIndex <= 5;
  179.             WHEN 75  => ToneIndex <= 5;
  180.             WHEN 76  => ToneIndex <= 5;
  181.             WHEN 77  => ToneIndex <= 5;
  182.             WHEN 78  => ToneIndex <= 5;
  183.             WHEN 79  => ToneIndex <= 5;
  184.             WHEN 80  => ToneIndex <= 3;
  185.             WHEN 81  => ToneIndex <= 5;
  186.             WHEN 82  => ToneIndex <= 3;
  187.             WHEN 83  => ToneIndex <= 3;
  188.             WHEN 84  => ToneIndex <= 5;
  189.             WHEN 85  => ToneIndex <= 6;
  190.             WHEN 86  => ToneIndex <= 7;
  191.             WHEN 87  => ToneIndex <= 9;
  192.             WHEN 88  => ToneIndex <= 6;
  193.             WHEN 89  => ToneIndex <= 6;
  194.             WHEN 90  => ToneIndex <= 6;
  195.             WHEN 91  => ToneIndex <= 6;
  196.             WHEN 92  => ToneIndex <= 6;
  197.             WHEN 93  => ToneIndex <= 6;
  198.             WHEN 94  => ToneIndex <= 5;
  199.             WHEN 95  => ToneIndex <= 6;
  200.             WHEN 96  => ToneIndex <= 8;
  201.             WHEN 97  => ToneIndex <= 8;
  202.             WHEN 98  => ToneIndex <= 8;
  203.             WHEN 99  => ToneIndex <= 9;
  204.             WHEN 100 => ToneIndex <= 12;
  205.             WHEN 101 => ToneIndex <= 12;
  206.             WHEN 102 => ToneIndex <= 12;
  207.             WHEN 103 => ToneIndex <= 10;
  208.             WHEN 104 => ToneIndex <= 9;
  209.             WHEN 105 => ToneIndex <= 9;
  210.             WHEN 106 => ToneIndex <= 10;
  211.             WHEN 107 => ToneIndex <= 9;
  212.             WHEN 108 => ToneIndex <= 8;
  213.             WHEN 109 => ToneIndex <= 8;
  214.             WHEN 110 => ToneIndex <= 6;
  215.             WHEN 111 => ToneIndex <= 5;
  216.             WHEN 112 => ToneIndex <= 3;
  217.             WHEN 113 => ToneIndex <= 3;
  218.             WHEN 114 => ToneIndex <= 3;
  219.             WHEN 115 => ToneIndex <= 3;
  220.             WHEN 116 => ToneIndex <= 8;
  221.             WHEN 117 => ToneIndex <= 8;
  222.             WHEN 118 => ToneIndex <= 8;
  223.             WHEN 119 => ToneIndex <= 8;
  224.             WHEN 120 => ToneIndex <= 6;
  225.             WHEN 121 => ToneIndex <= 8;
  226.             WHEN 122 => ToneIndex <= 6;
  227.             WHEN 123 => ToneIndex <= 5;
  228.             WHEN 124 => ToneIndex <= 3;
  229.             WHEN 125 => ToneIndex <= 5;
  230.             WHEN 126 => ToneIndex <= 6;
  231.             WHEN 127 => ToneIndex <= 8;
  232.             WHEN 128 => ToneIndex <= 5;
  233.             WHEN 129 => ToneIndex <= 5;
  234.             WHEN 130 => ToneIndex <= 5;
  235.             WHEN 131 => ToneIndex <= 5;
  236.             WHEN 132 => ToneIndex <= 5;
  237.             WHEN 133 => ToneIndex <= 5;
  238.             WHEN 134 => ToneIndex <= 5;
  239.             WHEN 135 => ToneIndex <= 5;
  240.                                               -- 程序过长,部分省略
  241.             WHEN 136 => ToneIndex <= 0;       -- 简谱休止符à输出
  242.             WHEN 137 => ToneIndex <= 0;       -- 频率为零
  243.             WHEN 138 => ToneIndex <= 0;
  244.             WHEN OTHERS => ToneIndex <= 0;
  245. -- WHEN OTHERS => NULL;
  246.         END CASE;
  247. END PROCESS;
  248. -------------------------------------------------
  249. -------------------------------------------------
  250. -- 
  251. END Speakera_arch;