📄 song.vhdl
字号:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity song is
port(clk4m,clk4:in std_logic; ---预置计数器和乐谱产生器的时钟
digit:buffer std_logic_vector(6 downto 0); ---高,中,低音数码管指示
zero:out std_logic_vector(4 downto 0);--- 用于数码管高位置低
speaker:out std_logic); ---扬声器
end song;
architecture Behavioral of song is
signal divider,origin:std_logic_vector(12 downto 0); ---13位计数值和预置值
signal counter:integer range 0 to 140; ---7位计数器
signal count: std_logic_vector(1 downto 0); ---记录1/4拍
signal carrier:std_logic;
begin
zero<="00000";
process(clk4m)
begin
if clk4m='1' and clk4m'event then
if divider="1111111111111" then
carrier<='1';
divider<=origin;
else
divider<=divider+1;
carrier<='0';
end if;
end if;
end process;
process(carrier)
begin
if carrier='1' and carrier'event then
count<=count+1; ---输出时钟4分频
if count="00" then
speaker<='0';
else
speaker<='1';
end if;
end if;
end process;
process(clk4 )
begin
if clk4='1' and clk4'event then
if counter=137 then
counter<=0;
else
counter<=counter+1;
end if;
end if;
case counter is
when 0=>digit<="0000011" ; when 1=>digit<="0000011" ;
when 2=>digit<="0000011" ; when 3=>digit<="0000011" ;
when 4=>digit<="0000101" ; when 5=>digit<="0000101" ;
when 6=>digit<="0000101" ; when 7=>digit<="0000110" ;
when 8=>digit<="0001000" ; when 9=>digit<="0001000" ;
when 10=>digit<="0001000" ; when 11=>digit<="0010000" ;
when 12=>digit<="0000110" ; when 13=>digit<="0001000" ;
when 14=>digit<="0000101" ; when 15=>digit<="0000101" ;
when 16=>digit<="0101000" ; when 17=>digit<="0101000" ;
when 18=>digit<="0101000" ; when 19=>digit<="1000000" ;
when 20=>digit<="0110000" ; when 21=>digit<="0101000" ;
when 22=>digit<="0011000" ; when 23=>digit<="0101000" ;
when 24=>digit<="0010000" ; when 25=>digit<="0010000" ;
when 26=>digit<="0010000" ; when 27=>digit<="0010000" ;
when 28=>digit<="0010000" ; when 29=>digit<="0010000" ;
when 30=>digit<="0010000" ; when 31=>digit<="0000000" ;
when 32=>digit<="0010000" ; when 33=>digit<="0010000" ;
when 34=>digit<="0010000" ; when 35=>digit<="0011000" ;
when 36=>digit<="0000111" ; when 37=>digit<="0000111" ;
when 38=>digit<="0000110" ; when 39=>digit<="0000110" ;
when 40=>digit<="0000101" ; when 41=>digit<="0000101" ;
when 42=>digit<="0000101" ; when 43=>digit<="0000110" ;
WHEN 44=>digit<="0001000"; WHEN 45=>digit<="0001000";
WHEN 46=>digit<="0010000"; WHEN 47=>digit<="0010000";
WHEN 48=>digit<="0000011"; WHEN 49=>digit<="0000011";
WHEN 50=>digit<="0001000"; WHEN 51=>digit<="0001000";
WHEN 52=>digit<="0000110"; WHEN 53=>digit<="0000101";
WHEN 54=>digit<="0000110"; WHEN 55=>digit<="0001000";
WHEN 56=>digit<="0000101"; WHEN 57=>digit<="0000101";
WHEN 58=>digit<="0000101"; WHEN 59=>digit<="0000101";
WHEN 60=>digit<="0000101"; WHEN 61=>digit<="0000101";
WHEN 62=>digit<="0000101"; WHEN 63=>digit<="0000101";
WHEN 64=>digit<="0011000"; WHEN 65=>digit<="0011000";
WHEN 66=>digit<="0011000"; WHEN 67=>digit<="0101000";
WHEN 68=>digit<="0000111"; WHEN 69=>digit<="0000111";
WHEN 70=>digit<="0010000"; WHEN 71=>digit<="0010000";
WHEN 72=>digit<="0000110"; WHEN 73=>digit<="0001000";
WHEN 74=>digit<="0000101"; WHEN 75=>digit<="0000101";
WHEN 76=>digit<="0000101"; WHEN 77=>digit<="0000101";
WHEN 78=>digit<="0000101"; WHEN 79=>digit<="0000101";
WHEN 80=>digit<="0000011"; WHEN 81=>digit<="0000101";
WHEN 82=>digit<="0000011"; WHEN 83=>digit<="0000011";
WHEN 84=>digit<="0000101"; WHEN 85=>digit<="0000110";
WHEN 86=>digit<="0000111"; WHEN 87=>digit<="0010000";
WHEN 88=>digit<="0000110"; WHEN 89=>digit<="0000110";
WHEN 90=>digit<="0000110"; WHEN 91=>digit<="0000110";
WHEN 92=>digit<="0000110"; WHEN 93=>digit<="0000110";
WHEN 94=>digit<="0000101"; WHEN 95=>digit<="0000110";
WHEN 96=>digit<="0001000"; WHEN 97=>digit<="0001000";
WHEN 98=>digit<="0001000"; WHEN 99=>digit<="0010000";
WHEN 100=>digit<="0101000"; WHEN 101=>digit<="0101000";
WHEN 102=>digit<="0101000"; WHEN 103=>digit<="0011000";
WHEN 104=>digit<="0010000"; WHEN 105=>digit<="0010000";
WHEN 106=>digit<="0011000"; WHEN 107=>digit<="0010000";
WHEN 108=>digit<="0001000"; WHEN 109=>digit<="0001000";
WHEN 110=>digit<="0000110"; WHEN 111=>digit<="0000101";
WHEN 112=>digit<="0000011"; WHEN 113=>digit<="0000011";
WHEN 114=>digit<="0000011"; WHEN 115=>digit<="0000011";
WHEN 116=>digit<="0001000"; WHEN 117=>digit<="0001000";
WHEN 118=>digit<="0001000"; WHEN 119=>digit<="0001000";
WHEN 120=>digit<="0000110"; WHEN 121=>digit<="0001000";
WHEN 122=>digit<="0000110"; WHEN 123=>digit<="0000101";
WHEN 124=>digit<="0000011"; WHEN 125=>digit<="0000101";
WHEN 126=>digit<="0000110"; WHEN 127=>digit<="0001000";
WHEN 128=>digit<="0000101"; WHEN 129=>digit<="0000101";
WHEN 130=>digit<="0000101"; WHEN 131=>digit<="0000101";
WHEN 132=>digit<="0000101"; WHEN 133=>digit<="0000101";
WHEN 134=>digit<="0000101"; WHEN 135=>digit<="0000101";
WHEN 136=>digit<="0000000"; WHEN 137=>digit<="0000000";
WHEN 138=>digit<="0000000"; WHEN 139=>digit<="0000000";
WHEN others=>digit<="0000000";
END CASE;
CASE digit IS
WHEN "0000011"=>origin<="0100001001100"; ---2124
WHEN "0000101"=>origin<="0110000010001"; ---3089
WHEN "0000110"=>origin<="0111000111110"; ---3646
WHEN "0000111"=>origin<="1000000101101"; ---4141
WHEN "0001000"=>origin<="1000100010001"; ---4369
WHEN "0010000"=>origin<="1001010110010"; ---4786
WHEN "0011000"=>origin<="1010000100101"; ---5157
WHEN "0101000"=>origin<="1011000001000"; ---5640
WHEN "0110000"=>origin<="1011100011110"; ---5918
WHEN "1000000"=>origin<="1100010001000"; ---6280
WHEN others=>origin<="1111111111111"; ---8191 ,0分频,休止符,扬声器不出声,
END CASE;
END PROCESS;
end Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -