📄 song.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity song is
port(clk_4mhz,clk_4hz:in std_logic;
co: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 one 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(clk_4mhz,co)
begin
if co='1' then
if(clk_4mhz'event and clk_4mhz='1')then
if(divider="1111111111111")then
carrier<='1';
divider<=origin;
else
divider<=divider+'1';
carrier<='0';
end if;
end if;
end if;
end process;
process(carrier)
begin
if(carrier'event and carrier='1')then
count<=count+'1'; --输出时钟四分频
if count="00" then
speaker<='1';
else
speaker<='0';
end if;
end if;
end process;
process(clk_4hz,counter,digit)
begin
if(clk_4hz'event and clk_4hz='1')then
if(counter=140)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
end case;
end process;
end one;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -