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 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有
  • ¥15 怎么把60秒的视频时长改成显示0秒?且视频内容没有任何变化的正常播放?目的是为了解决一些平台对视频时长的要求,最好有自动处理的工具!