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

在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 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载