📄 12.5fenpin.txt
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CLKGEN IS
PORT(CLK:IN STD_LOGIC;
NEWCLK:OUT STD_LOGIC);
END ENTITY CLKGEN;
ARCHITECTURE ART OF CLKGEN IS
SIGNAL P,Q:INTEGER RANGE 0 TO 24;
BEGIN
PROCESS(CLK) IS
BEGIN
IF(CLK'EVENT AND CLK='1') THEN
IF P=24 THEN P<=0;
ELSE P<=P+1;
END IF;
END IF;
END PROCESS;
PROCESS(CLK) IS
BEGIN
IF(CLK'EVENT AND CLK='0') THEN
IF Q=24 THEN Q<=0;
ELSE Q<=Q+1;
END IF;
END IF;
END PROCESS;
NEWCLK<='1' WHEN P=0 OR Q=12 ELSE '0';
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SPEAKER IS
PORT(CK4MHZ:IN STD_LOGIC;
YINFU:IN INTEGER RANGE 0 TO 14;
SP:OUT STD_LOGIC);
END SPEAKER;
ARCHITECTURE ART OF SPEAKER IS
SIGNAL COUNT:INTEGER:=0;
SIGNAL F,TWO:STD_LOGIC;
BEGIN
PROCESS(YINFU,CK4MHZ)
BEGIN
IF(CK4MHZ'EVENT AND CK4MHZ='1')THEN
IF(YINFU=0) THEN F<='0';
ELSIF(YINFU=1) THEN COUNT<=COUNT+1;
IF(COUNT<7644)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=2)THEN COUNT<=COUNT+1;
IF(COUNT<6810)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=3)THEN COUNT<=COUNT+1;
IF(COUNT<6068)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=4)THEN COUNT<=COUNT+1;
IF(COUNT<5726)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=5)THEN COUNT<=COUNT+1;
IF(COUNT<5102)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=6)THEN COUNT<=COUNT+1;
IF(COUNT<4546)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=7)THEN COUNT<=COUNT+1;
IF(COUNT<4050)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=8)THEN COUNT<=COUNT+1;
IF(COUNT<3822)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=9)THEN COUNT<=COUNT+1;
IF(COUNT<3406)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=10)THEN COUNT<=COUNT+1;
IF(COUNT<3034)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=11)THEN COUNT<=COUNT+1;
IF(COUNT<2864)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=12)THEN COUNT<=COUNT+1;
IF(COUNT<2552)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=13)THEN COUNT<=COUNT+1;
IF(COUNT<2272)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
ELSIF(YINFU=14)THEN COUNT<=COUNT+1;
IF(COUNT<2024)THEN F<='0';
ELSE F<='1';COUNT<=0;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(F)
BEGIN
IF(F'EVENT AND F='1')THEN TWO<=NOT TWO;---输出之前的二分频
END IF;
SP<=TWO;
END PROCESS;
END ART;
library ieee;
use ieee.std_logic_1164.all;
entity yinfu is
port(ck4hz:in std_logic;
yf:out integer range 0 to 14);
end yinfu;
architectrue name of yinfu is
signal count:integer:=0;
begin
process(ck4hz)
begin
if(ck4hz'event and ck4hz='1')then
if(count<124)then count<=count+1;
else count<=0;
end if;
end if;
end process;
process(count)
begin
case count is
when 00=>yf<=0;
when 01=>yf<=0;
when 02=>yf<=8;
when 03=>yf<=8;
when 04=>yf<=8;
when 05=>yf<=8;
when 06=>yf<=7;
when 07=>yf<=7;
when 08=>yf<=0;
when 09=>yf<=0;
when 10=>yf<=0;
when 11=>yf<=0;
when 12=>yf<=8;
when 13=>yf<=8;
when 14=>yf<=8;
when 15=>yf<=8;
when 16=>yf<=7;
when 17=>yf<=7;
when 18=>yf<=7;
when 19=>yf<=7;
when 20=>yf<=7;
when 21=>yf<=12;
when 22=>yf<=12;
when 23=>yf<=12;
when 24=>yf<=12;
when 25=>yf<=7;
when 26=>yf<=7;
when 27=>yf<=7;
when 28=>yf<=7;
when 29=>yf<=7;
when 30=>yf<=7;
when 31=>yf<=0;
when 32=>yf<=0;
when 33=>yf<=6;
when 34=>yf<=6;
when 35=>yf<=8;
when 36=>yf<=8;
when 37=>yf<=6;
when 38=>yf<=6;
when 39=>yf<=8;
when 40=>yf<=8;
when 41=>yf<=8;
when 42=>yf<=8;
when 43=>yf<=8;
when 44=>yf<=8;
when 45=>yf<=8;
when 46=>yf<=8;
when 47=>yf<=10;
when 48=>yf<=10;
when 49=>yf<=10;
when 50=>yf<=10;
when 51=>yf<=9;
when 52=>yf<=8;
when 53=>yf<=8;
when 54=>yf<=8;
when 55=>yf<=8;
when 56=>yf<=9;
when 57=>yf<=9;
when 58=>yf<=9;
when 59=>yf<=9;
when 60=>yf<=9;
when 61=>yf<=9;
when 62=>yf<=0;
when 63=>yf<=0;
when 64=>yf<=8;
when 65=>yf<=8;
when 66=>yf<=8;
when 67=>yf<=8;
when 68=>yf<=8;
when 69=>yf<=8;
when 70=>yf<=0;
when 71=>yf<=0;
when 72=>yf<=0;
when 73=>yf<=0;
when 74=>yf<=0;
when 75=>yf<=0;
when 76=>yf<=8;
when 77=>yf<=8;
when 78=>yf<=7;
when 79=>yf<=7;
when 80=>yf<=7;
when 81=>yf<=7;
when 82=>yf<=7;
when 83=>yf<=12;
when 84=>yf<=12;
when 85=>yf<=12;
when 86=>yf<=12;
when 87=>yf<=7;
when 88=>yf<=7;
when 89=>yf<=7;
when 90=>yf<=7;
when 91=>yf<=7;
when 92=>yf<=7;
when 93=>yf<=0;
when 94=>yf<=0;
when 95=>yf<=6;
when 96=>yf<=6;
when 97=>yf<=8;
when 98=>yf<=8;
when 99=>yf<=6;
when 100=>yf<=6;
when 101=>yf<=8;
when 102=>yf<=8;
when 103=>yf<=8;
when 104=>yf<=8;
when 105=>yf<=8;
when 106=>yf<=8;
when 107=>yf<=6;
when 108=>yf<=6;
when 109=>yf<=9;
when 110=>yf<=9;
when 111=>yf<=9;
when 112=>yf<=9;
when 113=>yf<=9;
when 114=>yf<=9;
when 115=>yf<=8;
when 116=>yf<=8;
when 117=>yf<=8;
when 118=>yf<=8;
when 119=>yf<=9;
when 120=>yf<=10;
when 121=>yf<=9;
when 122=>yf<=9;
when 123=>yf<=8;
when 124=>yf<=8;
when others=>null;
end case;
end process;
end name;
④键盘扫描:
时钟分频源程序:
library ieee;
use ieee.std_logic_1164.all;
entity kbfq is
port( clk :in std_logic; --50MHZ
newclk :out std_logic); --20HZ
end entity kbfq;
architecture art of kbfq is
signal cnt:integer range 0 to 2499999;
signal newclk_a:std_logic;
begin
process(clk) is
begin
if(clk'event and clk='1') then
if cnt=2499999 then cnt<=0;newclk_a<=not newclk_a;
else cnt<=cnt+1;
end if;
end if;
end process;
newclk<=newclk_a;
end architecture art;
4*4键盘扫描源程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity kb4_4 is
port(clk :in std_logic;
kbcol :in std_logic_vector(3 downto 0); --列
kbrow :out std_logic_vector(3 downto 0); --行
kb_out :out std_logic_vector(13 downto 0));
end entity kb4_4;
architecture art of kb4_4 is
signal count:std_logic_vector(1 downto 0);
signal sta:std_logic_vector(1 downto 0);
begin
process(clk)
begin
if(clk'event and clk='1') then count<=count+1;
end if;
end process;
process(clk)
begin
if(clk'event and clk='1') then
case count is
when "00" =>kbrow<="0111";sta<="00";
when "01" =>kbrow<="1011";sta<="01";
when "10" =>kbrow<="1101";sta<="10";
when "11" =>kbrow<="1110";sta<="11";
when others=>kbrow<="0000";
end case;
end if;
end process;
process(clk)
begin
if(clk'event and clk='1') then
case sta is
when "00"=>
case kbcol is
when "0111"=>kb_out<="00000000001000"; --4
when "1011"=>kb_out<="00000000000100"; --3
when "1101"=>kb_out<="00000000000010"; --2
when "1110"=>kb_out<="00000000000001"; --1
when others=>kb_out<="00000000000000";
end case;
when "01"=>
case kbcol is
when "1011"=>kb_out<="00000001000000"; --7
when "1101"=>kb_out<="00000000100000"; --6
when "1110"=>kb_out<="00000000010000"; --5
when others=>kb_out<="00000000000000";
end case;
when "10"=>
case kbcol is
when "0111"=>kb_out<="00010000000000"; --11
when "1011"=>kb_out<="00001000000000"; --10
when "1101"=>kb_out<="00000100000000"; --9
when "1110"=>kb_out<="00000010000000"; --8
when others=>kb_out<="00000000000000";
end case;
when "11"=>
case kbcol is
when "1101"=>kb_out<="10000000000000"; --14
when "1110"=>kb_out<="01000000000000"; --13
when "1011"=>kb_out<="00100000000000"; --12
when others=>kb_out<="00000000000000";
end case;
when others=>kb_out<="00000000000000";
end case;
end if;
end process;
end architecture art;
主程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity kb is
port( clk :in std_logic;
kbcol :in std_logic_vector(3 downto 0);
kbrow :out std_logic_vector(3 downto 0);
seg7_out :out std_logic_vector(6 downto 0);
kb_out :out std_logic_vector(11 downto 0));
end entity kb;
architecture art of kb is
component kbfq is
port( clk :in std_logic;
newclk :out std_logic);
end component kbfq;
component kb4_4 is
port( clk :in std_logic;
kbcol :in std_logic_vector(3 downto 0);
kbrow :out std_logic_vector(3 downto 0);
seg7_out :out std_logic_vector(6 downto 0);
kb_out :out std_logic_vector(11 downto 0));
end component kb4_4;
signal s0:std_logic;
begin
u1:kbfq port map( clk =>clk,
newclk =>s0);
u2:kb4_4 port map( clk =>s0,
kbcol =>kbcol,
kbrow =>kbrow,
seg7_out =>seg7_out,
kb_out =>kb_out);
end architecture art;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -