vhdl写3乘3乘3花样流水灯
时间: 2023-10-19 18:23:47 浏览: 24
以下是一个基于VHDL语言实现的3乘3乘3花样流水灯的代码:
```vhdl
-- 定义时钟信号
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity clock_50MHz is
Port ( clock_50 : in STD_LOGIC;
reset : in STD_LOGIC;
clk : out STD_LOGIC);
end clock_50MHz;
architecture Behavioral of clock_50MHz is
begin
process(clock_50, reset)
begin
if reset = '1' then
clk <= '0';
elsif rising_edge(clock_50) then
clk <= not clk;
end if;
end process;
end Behavioral;
-- 定义花样流水灯模块
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity LED3x3x3 is
Port ( clock : in STD_LOGIC;
reset : in STD_LOGIC;
LED : out STD_LOGIC_VECTOR (26 downto 0));
end LED3x3x3;
architecture Behavioral of LED3x3x3 is
signal counter : integer range 0 to 1000000 := 0;
signal level : integer range 0 to 6 := 0;
signal level_r1 : integer range 0 to 6 := 0;
signal level_r2 : integer range 0 to 6 := 0;
signal level_c1 : integer range 0 to 6 := 0;
signal level_c2 : integer range 0 to 6 := 0;
signal level_l1 : integer range 0 to 6 := 0;
signal level_l2 : integer range 0 to 6 := 0;
signal level_u1 : integer range 0 to 6 := 0;
signal level_u2 : integer range 0 to 6 := 0;
signal level_d1 : integer range 0 to 6 := 0;
signal level_d2 : integer range 0 to 6 := 0;
begin
-- 定义时钟信号
clock_50MHz_inst : clock_50MHz port map(clock, reset, clk);
-- 定义LED亮度控制信号
signal led_level : integer range 0 to 7 := 0;
-- 定义LED亮度控制模块
LED_level_inst : entity work.LED_level port map(
reset => reset,
clock => clk,
led_level => led_level
);
-- 定义计数器
process (clock, reset)
begin
if reset = '1' then
counter <= 0;
elsif rising_edge(clock) then
if counter = 999999 then
counter <= 0;
else
counter <= counter + 1;
end if;
end if;
end process;
-- 定义流水灯控制信号
process (clock, reset, counter)
begin
if reset = '1' then
level <= 0;
level_r1 <= 0;
level_r2 <= 0;
level_c1 <= 0;
level_c2 <= 0;
level_l1 <= 0;
level_l2 <= 0;
level_u1 <= 0;
level_u2 <= 0;
level_d1 <= 0;
level_d2 <= 0;
elsif rising_edge(clock) then
if counter = 999999 then
if level_r1 = 6 then
level_r1 <= 0;
else
level_r1 <= level_r1 + 1;
end if;
if level_r2 = 6 then
level_r2 <= 0;
else
level_r2 <= level_r2 + 1;
end if;
if level_c1 = 6 then
level_c1 <= 0;
else
level_c1 <= level_c1 + 1;
end if;
if level_c2 = 6 then
level_c2 <= 0;
else
level_c2 <= level_c2 + 1;
end if;
if level_l1 = 6 then
level_l1 <= 0;
else
level_l1 <= level_l1 + 1;
end if;
if level_l2 = 6 then
level_l2 <= 0;
else
level_l2 <= level_l2 + 1;
end if;
if level_u1 = 6 then
level_u1 <= 0;
else
level_u1 <= level_u1 + 1;
end if;
if level_u2 = 6 then
level_u2 <= 0;
else
level_u2 <= level_u2 + 1;
end if;
if level_d1 = 6 then
level_d1 <= 0;
else
level_d1 <= level_d1 + 1;
end if;
if level_d2 = 6 then
level_d2 <= 0;
else
level_d2 <= level_d2 + 1;
end if;
if level = 6 then
level <= 0;
else
level <= level + 1;
end if;
end if;
end if;
end process;
-- 定义LED输出信号
LED(26 downto 0) <= (
led_level & (level = 0) & (level_r1 = 0) & (level_r2 = 0) & (level_c1 = 0) & (level_c2 = 0) & (level_l1 = 0) & (level_l2 = 0) & (level_u1 = 0) & (level_u2 = 0) & (level_d1 = 0) & (level_d2 = 0),
led_level & (level = 1) & (level_r1 = 1) & (level_r2 = 1) & (level_c1 = 1) & (level_c2 = 1) & (level_l1 = 1) & (level_l2 = 1) & (level_u1 = 1) & (level_u2 = 1) & (level_d1 = 1) & (level_d2 = 1),
led_level & (level = 2) & (level_r1 = 2) & (level_r2 = 2) & (level_c1 = 2) & (level_c2 = 2) & (level_l1 = 2) & (level_l2 = 2) & (level_u1 = 2) & (level_u2 = 2) & (level_d1 = 2) & (level_d2 = 2),
led_level & (level = 3) & (level_r1 = 3) & (level_r2 = 3) & (level_c1 = 3) & (level_c2 = 3) & (level_l1 = 3) & (level_l2 = 3) & (level_u1 = 3) & (level_u2 = 3) & (level_d1 = 3) & (level_d2 = 3),
led_level & (level = 4) & (level_r1 = 4) & (level_r2 = 4) & (level_c1 = 4) & (level_c2 = 4) & (level_l1 = 4) & (level_l2 = 4) & (level_u1 = 4) & (level_u2 = 4) & (level_d1 = 4) & (level_d2 = 4),
led_level & (level = 5) & (level_r1 = 5) & (level_r2 = 5) & (level_c1 = 5) & (level_c2 = 5) & (level_l1 = 5) & (level_l2 = 5) & (level_u1 = 5) & (level_u2 = 5) & (level_d1 = 5) & (level_d2 = 5),
led_level & (level = 6) & (level_r1 = 6) & (level_r2 = 6) & (level_c1 = 6) & (level_c2 = 6) & (level_l1 = 6) & (level_l2 = 6) & (level_u1 = 6) & (level_u2 = 6) & (level_d1 = 6) & (level_d2 = 6)
);
-- 定义LED亮度控制模块
entity LED_level is
Port ( clock : in STD_LOGIC;
reset : in STD_LOGIC;
led_level : out integer range 0 to 7);
end LED_level;
architecture Behavioral of LED_level is
signal counter : integer range 0 to 1000000 := 0;
signal led_level_internal : integer range 0 to 7 := 0;
begin
-- 定义计数器
process (clock, reset)
begin
if reset = '1' then
counter <= 0;
elsif rising_edge(clock) then
if counter = 999999 then
counter <= 0;
if led_level_internal = 7 then
led_level_internal <= 0;
else
led_level_internal <= led_level_internal + 1;
end if;
else
counter <= counter + 1;
end if;
end if;
end process;
led_level <= led_level_internal;
end Behavioral;
end Behavioral;
```
该代码实现了一个9个LED灯的3乘3乘3花样流水灯,每个LED灯可以控制亮度。其中,时钟信号为50MHz,通过计数器实现流水灯效果,通过LED_level模块实现LED亮度控制。