数码管模块 + 按键模块:制作一个倒计时器,通过按键模块设置倒计时的时间,通过数码管模块显示倒计时的剩余时间。使用VHDL语言进行实现,并附上详细注释
时间: 2023-06-15 20:08:15 浏览: 149
ui.rar_VHDL数码管按键
5星 · 资源好评率100%
以下是数码管模块和按键模块的VHDL代码,它们可以组合在一起来实现倒计时器的功能。
数码管模块代码:
```vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SevenSegment is
Port ( Clk : in STD_LOGIC; --时钟信号
DataIn : in STD_LOGIC_VECTOR (3 downto 0); --输入的4位数字
Seg : out STD_LOGIC_VECTOR (6 downto 0); --输出7段数码管的控制信号
DP : out STD_LOGIC; --小数点控制信号
AN : out STD_LOGIC_VECTOR (3 downto 0)); --4个数码管的使能信号
end SevenSegment;
architecture Behavioral of SevenSegment is
begin
process(Clk)
begin
if rising_edge(Clk) then
case DataIn is
when "0000" => Seg <= "1111110"; --0
when "0001" => Seg <= "0110000"; --1
when "0010" => Seg <= "1101101"; --2
when "0011" => Seg <= "1111001"; --3
when "0100" => Seg <= "0110011"; --4
when "0101" => Seg <= "1011011"; --5
when "0110" => Seg <= "1011111"; --6
when "0111" => Seg <= "1110000"; --7
when "1000" => Seg <= "1111111"; --8
when "1001" => Seg <= "1111011"; --9
when others => Seg <= "1111111"; --无效输入
end case;
end if;
end process;
DP <= '0'; --不使用小数点
AN <= "1110"; --控制第一个数码管
end Behavioral;
```
按键模块代码:
```vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity KeyPad is
Port ( Clk : in STD_LOGIC; --时钟信号
Key : in STD_LOGIC_VECTOR (3 downto 0); --按键输入信号
Start : in STD_LOGIC; --开始倒计时信号
Stop : in STD_LOGIC; --停止倒计时信号
Set : in STD_LOGIC; --设置倒计时时间信号
TimeOut : out STD_LOGIC; --倒计时时间到信号
TimeSet : out STD_LOGIC; --倒计时时间设置完成信号
Time : out STD_LOGIC_VECTOR (3 downto 0)); --倒计时时间输出信号
end KeyPad;
architecture Behavioral of KeyPad is
signal Counter : integer range 0 to 9999 := 0; --倒计时计数器
signal TimeVal : integer range 0 to 9999 := 0; --倒计时时间
signal TimeOutSig : STD_LOGIC := '0'; --倒计时时间到信号
signal TimeSetSig : STD_LOGIC := '0'; --倒计时时间设置完成信号
begin
process(Clk)
begin
if rising_edge(Clk) then
if Set = '1' then --如果设置倒计时时间信号有效
Counter <= 0; --倒计时计数器清零
TimeVal <= 0; --倒计时时间清零
TimeSetSig <= '0'; --倒计时时间设置完成信号清零
case Key is
when "0111" => TimeVal <= TimeVal + 1; --按键7,增加1秒
when "0110" => TimeVal <= TimeVal + 10; --按键6,增加10秒
when "0101" => TimeVal <= TimeVal + 60; --按键5,增加1分钟
when "0011" => TimeVal <= TimeVal + 600; --按键3,增加10分钟
when others => null;
end case;
elsif Start = '1' then --如果开始倒计时信号有效
if Counter = TimeVal then --倒计时时间到
TimeOutSig <= '1'; --倒计时时间到信号有效
else
Counter <= Counter + 1; --倒计时计数器加1
end if;
elsif Stop = '1' then --如果停止倒计时信号有效
Counter <= 0; --倒计时计数器清零
else --如果没有任何信号有效
null;
end if;
end if;
end process;
TimeOut <= TimeOutSig; --输出倒计时时间到信号
TimeSet <= TimeSetSig; --输出倒计时时间设置完成信号
Time <= std_logic_vector(to_unsigned(TimeVal, 4)); --输出倒计时时间
end Behavioral;
```
倒计时器模块代码:
```vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CountDownTimer is
Port ( Clk : in STD_LOGIC; --时钟信号
Seg : out STD_LOGIC_VECTOR (6 downto 0); --输出7段数码管的控制信号
DP : out STD_LOGIC; --小数点控制信号
AN : out STD_LOGIC_VECTOR (3 downto 0); --4个数码管的使能信号
Key : in STD_LOGIC_VECTOR (3 downto 0); --按键输入信号
Start : in STD_LOGIC; --开始倒计时信号
Stop : in STD_LOGIC; --停止倒计时信号
Set : in STD_LOGIC); --设置倒计时时间信号
end CountDownTimer;
architecture Behavioral of CountDownTimer is
component SevenSegment is
Port ( Clk : in STD_LOGIC;
DataIn : in STD_LOGIC_VECTOR (3 downto 0);
Seg : out STD_LOGIC_VECTOR (6 downto 0);
DP : out STD_LOGIC;
AN : out STD_LOGIC_VECTOR (3 downto 0));
end component;
component KeyPad is
Port ( Clk : in STD_LOGIC;
Key : in STD_LOGIC_VECTOR (3 downto 0);
Start : in STD_LOGIC;
Stop : in STD_LOGIC;
Set : in STD_LOGIC;
TimeOut : out STD_LOGIC;
TimeSet : out STD_LOGIC;
Time : out STD_LOGIC_VECTOR (3 downto 0));
end component;
signal TimeOutSig : STD_LOGIC := '0'; --倒计时时间到信号
signal TimeSetSig : STD_LOGIC := '0'; --倒计时时间设置完成信号
signal TimeVal : STD_LOGIC_VECTOR (3 downto 0) := "0000"; --倒计时时间
begin
SevenSeg : SevenSegment port map(Clk, TimeVal, Seg, DP, AN);
KeyPad1 : KeyPad port map(Clk, Key, Start, Stop, Set, TimeOutSig, TimeSetSig, TimeVal);
process(Clk)
begin
if rising_edge(Clk) then
if TimeSetSig = '1' then --如果倒计时时间设置完成
TimeVal <= std_logic_vector(to_unsigned(0, 4)); --倒计时时间清零
elsif TimeOutSig = '1' then --如果倒计时时间到
TimeVal <= std_logic_vector(to_unsigned(0, 4)); --倒计时时间清零
TimeOutSig <= '0'; --倒计时时间到信号清零
else --如果没有任何信号有效
null;
end if;
end if;
end process;
end Behavioral;
```
在这个倒计时器模块中,我们将数码管模块和按键模块组合在一起,使用按键模块来设置倒计时时间,然后使用数码管模块来显示倒计时的剩余时间。当倒计时时间到达时,我们会发出一个倒计时时间到信号,此时倒计时器将会停止并清零。当我们设置新的倒计时时间时,我们会发出一个倒计时时间设置完成信号,并将倒计时时间清零。
请注意,这些代码仅供参考,可能需要根据具体的硬件平台进行修改和适应。
阅读全文