题目说明:
1)设计拔河游戏电路,用按键与LED表示输入与输出。
2)初始时,24个LED中间的两个点亮(引脚编号是100和99),然后游戏双方不停按动按键(K7和K0),点亮的两个LED向按动按键慢的一方移动;
3)每按动一下按键,LED向对方移动一格;
4)只要LED移动到头,游戏结束;
5)游戏结束时让胜利一方的LED灯(K7方:118-110,K0方:86-98)循环点亮。
题目比较简单,但是这个题目关键的地方在于按键的消抖(由于按键在按下的时候,看上去是按了一次,其实按键刚按下时抖动了很多次,这是机械特性,无法避免),有多少按键就要写多少消抖程序
- 在消抖程序中,k0输出后为k00,k7输出后为k77。
- 性能方面实现比较简单,功能比较单一,没有比较复杂的版块或功能,有很多可以改进的地方,比如增加数码管的计数功能,每当任意一方胜利的时候,上方的数码管计数器相应的加一等其他功能,但是由于时间问题没有去实现。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity bahe is
port(CLR,CLK,K7,K0: in std_logic;
LED: out std_logic_vector(23 downto 0)
);
end bahe;
ARCHITECTURE behavior of bahe is
signal buff :bit_vector(23 downto 0):="000000000001100000000000";
signal buff2 :bit_vector(7 downto 0):="10000000";
signal buff3 :bit_vector(10 downto 0):="00000000001";
shared variable flag :std_logic:='0';
signal k77:std_logic;
signal count_k7:integer range 0 to 9;
signal k00:std_logic;
signal count_k0:integer range 0 to 9;
begin
process(K00,K77,CLK,CLR)
begin
if buff = "000000000000000000000011" or buff = "110000000000000000000000" then
flag := '1';
end if;
if CLR='1' then
if CLK'event and CLK='1' then
if flag='0' then
if K77 = '0'
then buff <= buff SRL 1;右移
elsif K00= '0'
then buff <= buff SLL 1;左移
end if;
elsif flag='1' then
if buff(1 downto 0) = "11" then
buff2<=buff2 ror 1 ;//循环右移
buff(23 downto 16)<=buff2;
ELSIF buff(23 downto 22) = "11" then
buff3<=buff3 rol 1 ;//循环左移
buff(10 downto 0)<=buff3;
end if;
end if;
end if;
elsif CLR='0' then
buff<="000000000001100000000000";
flag := '0';
end if;
led <= to_stdlogicvector(buff);
end process;
p1:process(clk)
begin
if k7='0' then
count_k7<=0;
elsif (clk'event and clk='1' )then
if count_k7=2 then
count_k7<=count_k7;
else
count_k7<=count_k7+1;
end if;
end if;
if count_k7=1 then
k77<='0';
else
k77<='1';
end if;
end process p1;
p2:process(clk)
begin
if k0='0' then
count_k0<=0;
elsif (clk'event and clk='1' )then
if count_k0=2 then
count_k0<=count_k0;
else
count_k0<=count_k0+1;
end if;
end if;
if count_k0=1 then
k00<='0';
else
k00<='1';
end if;
end process p2;
end ARCHITECTURE;