当前位置: 首页 > news >正文

FPGA——实现LED流水灯

文章目录

  • 一、Quartusll_18.1和VS Code软件的关联
  • 二、DE2-115的时钟电路
  • 三、流水灯的分层次设计
  • 四、总结

一、Quartusll_18.1和VS Code软件的关联

1.先打开Quartus II 软件,然后选择菜单栏“Tools”下的“Options…”。

在这里插入图片描述

2.点击“Options…”,在弹出的对话框中,选择“General”选项卡下的“Preferred Text Editor”,默认使用的编 辑器是“QuartusII Test Editor”。

在“Text editor:”栏选择“Custom”选项并在“Command-line”栏通过路径浏览按钮选择 VS Code的路径。路径定位到“Code. exe”启动文件,再在后缀上加入-g %f:%l,路径根据自己的VS Code路径修改(就是-g前面冒号中的路径)。然后再点击“OK”完成 Quartus II 18.1 与VS Code的关联。

在这里插入图片描述

二、DE2-115的时钟电路

DE2-115 包含一个生成 50MHz 频率时钟信号的有源晶体振荡器,另有一个时钟缓冲器用来将缓冲后的低抖动 50MHz 时钟信号分配给 FPGA。这些时钟信号用来驱动 FPGA 内的用户逻辑电路。开发板还包含两个 SMA 连接头,用来接收外部时钟输入信号到 FPGA 或者将 FPGA的时钟信号输出到外部。另外,所有这些时钟输入都连接到 FPGA 内部的 PLL 模块上,用户可以将这些时钟信号作为 PLL 电路的时钟输入。

DE2-115 板子上的时钟分配信息和 FPGA 芯片相关的引脚配置信息如下图所示。

在这里插入图片描述

所以1秒所需的时钟周期数为50000000次。

三、流水灯的分层次设计

在DE2-115开发板上,用Verilog设计一个LED流水灯实验:用6个LED完成周期为1秒的跑马灯效果。

top顶层模块

module led_top(
    input clk,
    input reset_n,
    input pause,
    output [5:0] led
);
// 顶层模块:实例化各子模块
wire clk_1hz;  // 分频时钟信号

clock_divider divider_inst(
    .clk(clk),
    .reset_n(reset_n),
    .clk_1hz(clk_1hz)
);

led_display display_inst(
    .clk(clk),
    .reset_n(reset_n),
    .pause(pause),
    .clk_1hz_en(clk_1hz),
    .led(led)
);
endmodule

分频模块

module clock_divider(
    input clk,
    input reset_n,
    output reg clk_1hz
);
// 分频模块:50MHz -> 1Hz
parameter MAX_COUNT = 26'd49_999_999; // 50MHz时钟分频

always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        clk_1hz <= 1'b0;
    end else begin
        if (counter >= MAX_COUNT) begin
            counter <= 26'd0;
            clk_1hz <= ~clk_1hz;
        end else begin
            counter <= counter + 1;
        end
    end
end

reg [25:0] counter;
endmodule

显示模块

module led_display(
    input clk,
    input reset_n,
    input pause,
    input clk_1hz_en,    // 来自分频模块的使能信号
    output reg [5:0] led
);
// 显示模块:包含状态机和输出控制
reg [2:0] state;
reg running;

// 状态机控制
always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        state <= 3'd0;
        running <= 1'b1;
    end else begin
        // 处理暂停按键
        if (pause) running <= ~running;
        
        // 状态转移(使用分频后的时钟使能)
        if (running && clk_1hz_en) begin
            state <= (state == 3'd5) ? 3'd0 : state + 1;
        end
    end
end

// LED输出控制(保持不变)
always @(*) begin
    case(state)
        3'd0: led = 6'b000001;
        3'd1: led = 6'b000010;
        3'd2: led = 6'b000100;
        3'd3: led = 6'b001000;
        3'd4: led = 6'b010000;
        3'd5: led = 6'b100000;
        3'd5: led = 6'b100000;
        default: led = 6'b000000;
    endcase
end
endmodule

引脚连接配置图

在这里插入图片描述

烧录结果

FPGA——流水灯

四、总结

通过本次实验,初步了解到了计数器的思想,而且通过分层次化设计使实验更具有可视性。但是在本次实验中也存在不足,需要一直按着暂停键才能达到暂停的效果。所以,接下来我需要取研究如何实现按下一次实现暂停,再次按下又恢复流水灯效果。

参考资料

https://blog.csdn.net/Lee_tr/article/details/122487570

https://blog.csdn.net/crrrd/article/details/136227780

https://blog.csdn.net/LX567567/article/details/138727302

相关文章:

  • 【二分查找】搜索插入位置 x的平方根
  • 正则表达式引擎深入探讨
  • Windows:安装Imagemagick进行Cityscapes的图像压缩
  • Python:新式类写法,多继承
  • Mac:JMeter 下载+安装+环境配置(图文详细讲解)
  • Spring学习
  • 128. Longest Consecutive Sequence
  • 力扣222. 完全二叉树的节点个数(Java实现)
  • Java 生成钻石*
  • 【高项】信息系统项目管理师(八)项目质量管理【3分】
  • 主流的Java生态下权限管理框架
  • 查看linux系统信息
  • 【linux】scp和rsync
  • PHP转GO Day2 数据类型与控制结构实践(开发计算器)
  • BRAM消耗与FIFO的关系:有效利用FPGA资源的策略
  • 面试整理--一个报告生成的方案解析
  • excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果追加到json文件
  • C语言:字符串去特定字符
  • UGO和ACL
  • 从关键词到权重:TF-IDF算法解析
  • “多规合一”改革7年成效如何?自然资源部总规划师亮成绩单
  • 病重老人取钱在银行门口去世,家属:已协商一致
  • 郑钦文憾负高芙,止步WTA1000罗马站四强
  • 共建医学人工智能高地,上海卫健委与徐汇区将在这些方面合作
  • 陕西一村民被冒名贷款40余万续:名下已无贷款,将继续追责
  • 安徽省委副秘书长、省委政研室主任余三元调任省社科院院长