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日

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试