sunshine 2023-03-09 10:53 采纳率: 100%
浏览 156
已结题

在quartus II软件上基于VHDL语言实现八路彩灯的仿真

在quartus II软件上基于VHDL语言实现八路彩灯的仿真
八彩灯控制器设计试设计一种彩灯控制器控制8盏灯。该彩灯控制器有4种自动切换的花样。第一种花样为彩灯从右到左,然后从左到右逐次点亮,全灭全亮;第二种花样为彩灯两边同时亮一个逐次向中间移动再散开;第三种花样为彩灯两边同时亮两个逐次向中间移动再散开;第四种花样为彩灯两边同时亮三个,然后四亮四灭,四灭四亮,最后一灭一亮。四个花样自动变换,重复以上过程。输入时钟频率为500Hz,灯亮的时间在1—4秒之间,可以自由控制。电路中以“1”代表灯亮,以“0”代表灯灭。
用module模块

  • 写回答

6条回答 默认 最新

  • MarkHan_ 2023-03-09 12:47
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    以下是基于 VHDL 语言实现八路彩灯的仿真代码:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity eight_light is
        Port ( clk : in STD_LOGIC;
               rst : in STD_LOGIC;
               light : out STD_LOGIC_VECTOR(7 downto 0));
    end eight_light;
    
    architecture Behavioral of eight_light is
    
        signal count : integer range 0 to 2000 := 0;
        signal pattern : integer range 1 to 4 := 1;
        signal left_light, right_light : integer range 0 to 7 := 0;
        signal dir : integer range -1 to 1 := 1;
        signal shift : integer range 0 to 3 := 0;
        signal timer : integer range 0 to 2000 := 0;
        signal light_status : STD_LOGIC_VECTOR(7 downto 0) := "11111111";
    
    begin
    
        process(clk, rst)
        begin
            if rst = '1' then
                count <= 0;
                pattern <= 1;
                left_light <= 0;
                right_light <= 7;
                dir <= 1;
                shift <= 0;
                timer <= 0;
                light_status <= "11111111";
            elsif rising_edge(clk) then
                if count = 500 then
                    count <= 0;
                    case pattern is
                        when 1 =>
                            if shift = 0 then
                                light_status <= "11111111";
                                if left_light = 7 and right_light = 0 then
                                    pattern <= 2;
                                else
                                    if dir = 1 then
                                        left_light <= left_light + 1;
                                        right_light <= right_light - 1;
                                        if left_light = right_light then
                                            dir <= -1;
                                        end if;
                                    else
                                        left_light <= left_light - 1;
                                        right_light <= right_light + 1;
                                        if left_light = right_light then
                                            dir <= 1;
                                        end if;
                                    end if;
                                end if;
                            else
                                light_status(left_light) <= '0';
                                light_status(right_light) <= '0';
                                shift <= shift - 1;
                                if shift = 0 then
                                    if left_light = 7 and right_light = 0 then
                                        pattern <= 2;
                                    else
                                        if dir = 1 then
                                            left_light <= left_light + 1;
                                            right_light <= right_light - 1;
                                            if left_light = right_light then
                                                dir <= -1;
                                            end if;
                                        else
                                            left_light <= left_light - 1;
                                            right_light <= right_light + 1;
                                            if left_light = right_light then
                                                dir <= 1;
                                            end if;
                                        end if;
                                    end if;
                                end if;
                            end if;
                        when 2 =>
                            if timer = 0 then
                                timer <= integer(unsigned(rand) * 3000) + 1000;
                                light_status <= "00000000";
                                shift <= 0;
                                pattern <= 3;
                            else
                                timer <= timer - 1;
                            end if;
                        when 3 =>
                            if shift = 0 then
                                light_status <= "00110011";
                                shift <= shift + 1;
                                pattern <= 4;
                            else
                                light_status <= "00000000";
                                shift <= shift - 1;
                            end if;
                        when
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月10日
  • 已采纳回答 3月10日
  • 修改了问题 3月10日
  • 创建了问题 3月9日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装
  • ¥40 复杂的限制性的商函数处理