ZYNQ之FPGA学习----FIFO IP核使用实验

news2025/8/3 17:36:53

1 FIFO IP核介绍

FIFO 的英文全称是 First In First Out, 即先进先出。与 FPGA 内部的 RAM 和 ROM 的区别是没有外部读写地址线, 采取顺序写入数据, 顺序读出数据的方式,使用起来简单方便,缺点就是不能像 RAM 和 ROM 那样可以由地址线决定读取或写入某个指定的地址

根据 FIFO 工作的时钟域,可以将 FIFO 分为同步 FIFO 和异步 FIFO:

  • 同步 FIFO 是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作
  • 异步 FIFO 是指读写时钟不一致,读写时钟是互相独立的

FIFO常用参数:

  • FIFO 的宽度,FIFO 一次读写操作的数据位 N
  • FIFO 的深度,FIFO 可以存储多少个宽度为 N 位的数据
  • 将空标志(almost_empty),FIFO 即将被读空
  • 空标志(empty),FIFO 已空时由 FIFO 的状态电路送出的一个信号,以阻止 FIFO 的读操作继续从 FIFO中读出数据而造成无效数据的读出
  • 将满标志(almost_full),FIFO 即将被写满
  • 满标志(full),FIFO 已满时由 FIFO 的状态电路送出的一个号,以阻止 FIFO 的写操作继续向 FIFO 中写数据而造成溢出
  • 读时钟,读 FIFO 时所遵循的时钟,在每个时钟的上升沿触发
  • 写时钟,写 FIFO 时所遵循的时钟,在每个时钟的上升沿触发

2 实验任务

使用 Vivado 生成 FIFO IP 核,并实现以下功能:当 FIFO 为空时,向 FIFO 中写入数据,写入的数据量和 FIFO 深度一致,即 FIFO 被写满;然后从 FIFO 中读出数据,直到 FIFO 被读空为止,系统框图如下:
在这里插入图片描述
图片来自《领航者ZYNQ之FPGA开发指南》

3 实验设计

3.1 创建工程

新建工程,操作如图所示:

在这里插入图片描述

输入工程名和工程路径,如图所示:

在这里插入图片描述

选择创建RTL工程,如图所示:

在这里插入图片描述

直接点击Next:

在这里插入图片描述

继续点击Next:

在这里插入图片描述

添加芯片型号,操作如图所示:

在这里插入图片描述

完成工程创建:

在这里插入图片描述

3.2 设计输入

点击IP Catalog,搜索fifo,如图所示:

在这里插入图片描述

双击打开后,弹出窗口如下,Interface Type 选项用于选择 FIFO 接口的类型,选择默认的 Native;Fifo Implementation 选项用于选择是同步 FIFO 还是异步 FIFO 以及使用哪种资源实现 FIFO,选择 Independent Clocks Block RAM,即使用块 RAM 来实现的异步 FIFO:

在这里插入图片描述

Read Mode 选项用于设置读 FIFO时的读模式,选择默认的Standard FIFO。Data Port Parameters 选型用于设置读写端口的数据总线的宽度以及 FIFO 的深度,写宽度 Write Width 设置为 8 位,写深度 Write Depth 设置为 256。Reset Pin 不使用,取消勾选:

在这里插入图片描述

Status Flags窗口,用于设置用户自定义接口或者用于设定专用的输入口,勾选 即将写满 和 即将读空 这两个信号:

在这里插入图片描述

Data Counts 窗口用于设置 FIFO 内数据计数的输出信号,此信号表示当前在 FIFO 内存在多少个有效数据。为了更加方便地观察读/写过程,设置如图所示:

在这里插入图片描述

设置完成:

在这里插入图片描述

弹出如下窗口,直接点击Generate:

在这里插入图片描述

点击OK:

在这里插入图片描述

继续添加ILA(集成逻辑分析器) IP核,即在线逻辑分析仪的功能,操作如图所示:

在这里插入图片描述

进行如下设置,Number of Probes 用于设置所需的探针数量;Sample Data Depth 用于设置采样深度:

在这里插入图片描述

如下进行设置每个探针的参数:

在这里插入图片描述

设置完成,点击OK:

在这里插入图片描述

创建工程顶层文件,操作如图所示:

在这里插入图片描述

创建文件ip_fifo,作为顶层模块:

在这里插入图片描述

创建完成:

在这里插入图片描述

双击打开,输入代码如下:

module ip_fifo( 
    input    sys_clk ,  // 时钟信号 
    input    sys_rst_n  // 复位信号 
); 

//wire define 
wire         fifo_wr_en         ;  // FIFO 写使能信号 
wire         fifo_rd_en         ;  // FIFO 读使能信号 
wire  [7:0]  fifo_din           ;  // 写入到 FIFO 的数据 
wire  [7:0]  fifo_dout          ;  // 从 FIFO 读出的数据 
wire         almost_full        ;  // FIFO 将满信号 
wire         almost_empty       ;  // FIFO 将空信号 
wire         fifo_full          ;  // FIFO 满信号
wire         fifo_empty         ;  // FIFO 空信号 
wire  [7:0]  fifo_wr_data_count ;  // FIFO 写时钟域的数据计数 
wire  [7:0]  fifo_rd_data_count ;  // FIFO 读时钟域的数据计数 
//例化 FIFO IP 核 
fifo_generator_0  fifo_generator_0 ( 
    .wr_clk        ( sys_clk             ),  // input wire wr_clk 
    .rd_clk        ( sys_clk             ),  // input wire rd_clk 

    .wr_en         ( fifo_wr_en          ),  // input wire wr_en 
    .rd_en         ( fifo_rd_en          ),  // input wire rd_en 

    .din           ( fifo_din            ),  // input wire [7 : 0] din 
    .dout          ( fifo_dout           ),  // output wire [7 : 0] dout 
    
    .almost_full   (almost_full          ),  // output wire almost_full 
    .almost_empty  (almost_empty         ),  // output wire almost_empty 
    .full          ( fifo_full           ),  // output wire full 
    .empty         ( fifo_empty          ),  // output wire empty 
 
    .wr_data_count ( fifo_wr_data_count  ),  // output wire [7 : 0] wr_data_count     
    .rd_data_count ( fifo_rd_data_count )   // output wire [7 : 0] rd_data_count 
);
//例化写 FIFO 模块 
fifo_wr  u_fifo_wr( 
    .clk            ( sys_clk     ),   // 写时钟 
    .rst_n          ( sys_rst_n   ),   // 复位信号 

    .fifo_wr_en     ( fifo_wr_en )  , // fifo 写请求 
    .fifo_wr_data   ( fifo_din    ) , // 写入 FIFO 的数据 
    .almost_empty   ( almost_empty  ), // fifo 将空信号 
    .almost_full    ( almost_full  )  // fifo 将满信号 
); 

//例化读 FIFO 模块 
fifo_rd  u_fifo_rd( 
    .clk          ( sys_clk     ),      // 读时钟 
    .rst_n        ( sys_rst_n   ),      // 复位信号 

    .fifo_rd_en   ( fifo_rd_en  ),      // fifo 读请求 
    .fifo_dout    ( fifo_dout   ),      // 从 FIFO 输出的数据 
    .almost_empty ( almost_empty  ),    // fifo 将空信号 
    .almost_full  ( almost_full  )     // fifo 将满信号 
); 
//例化 ILA IP 核 
ila_0  ila_0 ( 
    .clk    ( sys_clk             ), // input wire clk 
 
    .probe0 ( fifo_wr_en          ), // input wire [0:0]  probe0   
    .probe1 ( fifo_rd_en          ), // input wire [0:0]  probe1  
    .probe2 ( fifo_din            ), // input wire [7:0]  probe2  
    .probe3 ( fifo_dout           ), // input wire [7:0]  probe3  
    .probe4 ( fifo_empty          ), // input wire [0:0]  probe4  
    .probe5 ( almost_empty        ), // input wire [0:0]  probe5  
    .probe6 ( fifo_full           ), // input wire [0:0]  probe6 
    .probe7 ( almost_full         ), // input wire [0:0]  probe7  
    .probe8 ( fifo_wr_data_count  ), // input wire [7:0]  probe8  
    .probe9( fifo_rd_data_count  )  // input wire [7:0]  probe9 
); 
 
endmodule

如图所示:

在这里插入图片描述

继续创建fifo_wr文件,即写FIFO模块,如图所示:

在这里插入图片描述

双击打开,输入代码如下:

module fifo_wr( 
    input                  clk    ,          // 时钟信号 
    input                  rst_n  ,          // 复位信号 
     
    input                  almost_empty,     // FIFO 将空信号 
    input                  almost_full ,     // FIFO 将满信号 
    output     reg          fifo_wr_en ,      // FIFO 写使能 
    output     reg  [7:0]   fifo_wr_data      // 写入 FIFO 的数据 
); 

//reg define 
reg  [1:0]  state            ;  //动作状态
reg         almost_empty_d0  ;  //almost_empty 延迟一拍 
reg         almost_empty_syn ;  //almost_empty 延迟两拍 
reg  [3:0]  dly_cnt          ;  //延迟计数器

//因为 almost_empty 信号是属于 FIFO 读时钟域的 
//所以要将其同步到写时钟域中 
always @(  posedge clk )  begin 
    if( !rst_n )  begin 
        almost_empty_d0   <= 1'b0 ; 
        almost_empty_syn  <= 1'b0 ; 
    end 
    else  begin 
        almost_empty_d0   <= almost_empty ; 
        almost_empty_syn  <= almost_empty_d0 ; 
    end 
end 

//向 FIFO 中写入数据 
always  @( posedge clk )  begin 
    if (!rst_n)  begin 
        fifo_wr_en    <= 1'b0; 
        fifo_wr_data  <= 8'd0; 
        state         <= 2'd0; 
        dly_cnt       <= 4'd0; 
    end 
    else  begin 
        case(state) 
            2'd0:  begin  
                if(almost_empty_syn)  begin  //如果检测到 FIFO 将被读空(下一拍就会空) 
                    state  <= 2'd1;          //就进入延时状态 
                end  
                else 
                    state  <= state; 
                end  
            2'd1:  begin 
                if(dly_cnt  == 4'd10)  begin  //延时 10 拍 
                                             //原因是 FIFO IP 核内部状态信号的更新存在延时 
                                            //延迟 10 拍以等待状态信号更新完毕
                    dly_cnt     <= 4'd0;      
                    state       <= 2'd2;        //开始写操作 
                    fifo_wr_en  <= 1'b1;        //打开写使能 
                end 
                else 
                    dly_cnt  <= dly_cnt + 4'd1; 
                end              
            2'd2:  begin 
                if(almost_full)  begin      //等待 FIFO 将被写满(下一拍就会满) 
                    fifo_wr_en    <= 1'b0;  //关闭写使能 
                    fifo_wr_data  <= 8'd0; 
                    state         <= 2'd0;  //回到第一个状态 
                end 
                else  begin                 //如果 FIFO 没有被写满 
                    fifo_wr_en    <= 1'b1;  //则持续打开写使能 
                    fifo_wr_data  <= fifo_wr_data + 1'd1;  //且写数据值持续累加 
                end 
            end  
        default : state  <= 2'd0; 
        endcase 
    end 
end 

endmodule          

如图所示:

在这里插入图片描述

继续创建fifo_rd文件,即读FIFO模块,如图所示:

在这里插入图片描述

双击打开,输入代码如下:

module fifo_rd( 
    input               clk          ,   // 时钟信号 
    input               rst_n        ,   // 复位信号 

    input        [7:0]  fifo_dout    ,   // 从 FIFO 读出的数据 
    input               almost_full  ,   // FIFO 将满信号 
    input               almost_empty ,   // FIFO 将空信号 
    output   reg         fifo_rd_en       // FIFO 读使能 
); 
 
//reg define 
reg  [1:0]  state           ;  //状态 
reg         almost_full_d0  ;  //almost_full 延迟一拍 
reg         almost_full_syn ;  //almost_full 延迟两拍 
reg  [3:0]  dly_cnt         ;  //延迟计数器 

//因为 fifo_full 信号是属于 FIFO 写时钟域的 
//所以要将其同步到读时钟域中 
always @(  posedge clk )  begin 
    if( !rst_n )  begin 
        almost_full_d0   <= 1'b0 ; 
        almost_full_syn  <= 1'b0 ; 
    end 
    else  begin 
        almost_full_d0   <= almost_full ; 
        almost_full_syn  <= almost_full_d0 ; 
    end 
end 
 
//读出 FIFO 的数据 
always  @( posedge clk )  begin 
    if (!rst_n)  begin 
        fifo_rd_en  <= 1'b0; 
        state       <= 2'd0; 
        dly_cnt     <= 4'd0; 
    end 
    else  begin 
        case(state) 
            2'd0:  begin                      
                if(almost_full_syn)        //如果检测到 FIFO 被写满 
                    state  <= 2'd1;         //就进入延时状态 
                else 
                    state  <= state; 
                end  
            2'd1:  begin 
                if(dly_cnt  == 4'd10)  begin //延时 10 拍 
                                           //原因是 FIFO IP 核内部状态信号的更新存在延时 
                                           //延迟 10 拍以等待状态信号更新完毕 
                    dly_cnt  <= 4'd0;
                    state    <= 2'd2;          //开始读操作 
                end 
                else 
                    dly_cnt  <= dly_cnt + 4'd1; 
                end 
            2'd2:  begin 
                if(almost_empty)  begin     //等待 FIFO 将被读空(下一拍就会空) 
                    fifo_rd_en  <= 1'b0;    //关闭读使能 
                    state       <= 2'd0;    //回到第一个状态 
                end 
                else                       //如果 FIFO 没有被读空 
                    fifo_rd_en  <= 1'b1;    //则持续打开读使能 
                end  
            default : state  <= 2'd0; 
            endcase 
        end 
end 
 
endmodule

如图所示:

在这里插入图片描述

3.3 分析与综合

对设计进行分析,操作如图所示:

在这里插入图片描述

分析后的设计,Vivado自动生成顶层原理图,如图所示:

在这里插入图片描述

对设计进行综合,操作如图所示:

在这里插入图片描述

综合完成后,弹出窗口如下,直接关闭:

在这里插入图片描述

3.4 约束输入

创建约束文件,操作如图所示:

在这里插入图片描述

创建约束文件,输入文件名:

在这里插入图片描述

双击打开,输入约束代码:

create_clock -period 20.000 -name clk [get_ports sys_clk] 
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk] 
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n] 

如图所示:

在这里插入图片描述

3.5 设计实现

点击 Flow Navigator 窗口中的 Run Implementation,如图所示:

在这里插入图片描述

点击OK:

在这里插入图片描述

完成后,关闭即可:

在这里插入图片描述

3.6 功能仿真

创建TestBench,操作如图所示:

在这里插入图片描述

创建激励文件,输入文件名:

在这里插入图片描述

创建完成:

在这里插入图片描述

双击打开,输入TestBench(激励)代码:

`timescale 1ns / 1ps 
module tb_ip_fifo(  ); 
// Inputs 
    reg sys_clk; 
    reg sys_rst_n; 
   
// Instantiate the Unit Under Test (UUT) 
ip_fifo  u_ip_fifo  ( 
    .sys_clk         (sys_clk ),  
    .sys_rst_n       (sys_rst_n) 
); 
   
//Genarate the clk 
parameter PERIOD = 20; 
always  begin 
    sys_clk = 1'b0; 
    #(PERIOD/2) sys_clk = 1'b1; 
    #(PERIOD/2 ); 
end  
initial  begin 
    // Initialize Inputs 
    sys_rst_n = 0; 
    // Wait 100 ns for global reset to finish 
    #100  ; 
    sys_rst_n = 1; 
    // Add stimulus here  
end 
endmodule 

如图所示:

在这里插入图片描述

开始进行仿真,操作如下:

在这里插入图片描述

选择HDL仿真对象:

在这里插入图片描述

点击Restart,波形窗口中的当前仿真时刻点回归到0ns:

在这里插入图片描述

写满数据后,fifo_full信号拉高:

在这里插入图片描述

读完数据后,fifo_empty信号拉高:

在这里插入图片描述

3.7 下载验证

由于疫情,一直无法去实验室,故ZYNQ开发板不在身边,该步骤内容待更新

致谢领航者ZYNQ开发板,开启FPGA学习之路!

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

共创可持续出行未来 奔驰牵手《阿凡达:水之道》

11月20日&#xff0c;梅赛德斯-奔驰与20世纪影业及其出品电影《阿凡达&#xff1a;水之道》的品牌战略合作迈入崭新篇章&#xff01;电影《阿凡达&#xff1a;水之道》已定档于12月16日在全球多地公映&#xff0c;并于即日起开启主题为——“地球&#xff0c;我们的潘多拉”的联…

医疗设备远程监控 5G千兆工业网关智慧医疗

医疗设备远程监控 5G千兆工业网关智慧医疗 5G千兆工业网关的医疗设备远程监控应用&#xff0c;实现各医疗智能终端连接入网&#xff0c;医疗数据、监控视频、设备状态数据等&#xff0c;实时采集&#xff0c;边缘节点分析处理&#xff0c;低延时高速传输&#xff0c;工作人员远…

外汇天眼:外汇投资入门知识炒汇者的心理误区有哪些?

今天这篇文章我们了解一下关于外汇炒汇者的心理误区有哪些&#xff0c;希望对大家进行外汇投资有所帮助。 盲目跟风--心理误区之一 股市被动受诸多复杂因素的影响&#xff0c;其中股友的跟风心理对股市影响甚大。有这种心理的投资人&#xff0c;看见他人纷纷购进股票时&#…

代码随想录训练营第31天|LeetCode 455.分发饼干、 376. 摆动序列、53. 最大子序和

参考 代码随想录 什么是贪心算法 贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的是在某种意义上的局部最优解 。 贪心算法不…

hive表加载csv格式数据或者json格式数据

先说简单的使用 CREATE TABLE cc_test_serde( id string COMMENT from deserializer, name string COMMENT from deserializer) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.JsonSerDe STORED AS INPUTFORMAT org.apache.hadoop.mapred.TextInputFormat OUTPUTFO…

Qt第二十三章:设置窗口、控件背景颜色

修改样式表&#xff1a;设置后发现影响所有控件内的背景色事件触发样式&#xff1a;鼠标划过触发样式设置背景图背景图打包。 py代码中引用 将resources.qrc文件进行转化成py文件 在我们将xxx.ui文件转换成py文件的时候会自动引用resources.qrc 实际使用中发现&#xff1a;back…

Linux系统认知——常用命令(全)

文章目录一、帮助命令1.man&#xff08;查看帮助手册&#xff09;2.info&#xff08;阅读 info 格式的文档&#xff09;3.whatis&#xff08;查询命令功能&#xff09;二、文件及目录相关命令1.touch&#xff08;创建新的空文件&#xff0c;改变已有文件的时间戳&#xff09;2.…

黑马学员放弃20K月薪投身比亚迪,是去「车间」打螺丝吗?

黑马学员进互联网企业的新闻不稀奇&#xff0c;但黑马学员进“工厂”的新闻&#xff0c;就稀奇了。 黑马学员&#xff0c;互联网人&#xff0c;“工厂”&#xff0c;这几个词放在一起&#xff0c;怎么看怎么不顺眼。甚至有人会觉得魔幻&#xff0c;敲代码的、搞设计的脑力工作…

数据技术前沿趋势、TiDB 产品方向、真实场景 Demo… 丨PingCAP DevCon 2022 产品技术论坛预览

现在报名活动&#xff0c;有机会获得限定好礼哦&#xff01;&#x1f446; 2022 年 5 月&#xff0c;TiDB 进入了 V6 时代。从 TiDB 第一个 Beta 版本开始&#xff0c;OLTP Scale、Real-time HTAP、TiDB Cloud&#xff0c;我们一步步把理念变成现实。 现在&#xff0c;数据库技…

如何保护客户数据并降低合规风险

如何保护客户数据并降低合规风险 保护客户数据和降低合规风险通常是金融行业企业&#xff08;从银行到投资公司&#xff0c;再到小型&#xff0c;中型和大型企业的财务部门&#xff09;最关心的问题。 当财务文件是以纸质形式出现时&#xff0c;这些担忧会成倍增加&#xff…

关于api的响应时间(curl)

最近遇到了需要在服务器上测试第三方api响应时间的需求。那么&#xff0c;怎么测呢&#xff1f; curl安排上。 curl -w "dnslookup: %{time_namelookup} | connect: %{time_connect} | appconnect: %{time_appconnect} | pretransfer: %{time_pretransfer} | starttrans…

3.5 讲一讲关于小红书的搜索引流技巧【玩赚小红书】

“有一大部分女生把小红书当百度使用”&#xff0c;一句话道出了小红书流量的核心。 今天&#xff0c;我更想和大家聊聊如何获取同样巨大的搜索流量&#xff0c;让源源不断的精准客户主动找上门来。可别忽视了这个流量入口&#xff0c;它占据总体流量的 50% 以上。 ​ ​ 布局…

2022卡塔尔世界杯引爆全球,跨境电商如何做好选品和营销?

2022卡塔尔世界杯正如火如荼的举办着&#xff0c;热度席卷全球。足球皇帝Franz Beckenbauer曾说&#xff1a;“在绿茵场上滚动的不是足球&#xff0c;而是黄金。”从商业价值论&#xff0c;世界杯的品牌价值世界第一&#xff0c;是奥运会的8倍。据Nox聚星了解&#xff0c;2022年…

centos7.9安装postgresql12

目录 1.下载安装包 2.安装 首先登陆官方网站下载 PostgreSQL: Downloads 1.下载安装包 按照官方的命令安装&#xff1a; # 下载PGSQL的rpm包 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm #…

基于STM32G431嵌入式学习笔记——六、串口中断实例(基于第12届蓝桥杯串口部分题目)

上一节我们初步了解了中断的配置、串口的调试以及中断处理子程序的定义&#xff0c;接下来我们就来学习一下具体如何去应用串口中断。 一、真题引入 1.功能概述 2.串口功能 二、环境配置 我们依旧以第四节完成的第12届蓝桥杯节选题为初始环境进行配置&#xff0c;复制出…

Linux|centos7 Prometheus的自动服务发现 一(文件发现机制)

前言&#xff1a; Prometheus作为一个监控神器&#xff0c;深受大家的喜爱&#xff0c;那么如何使用它是一个问题&#xff0c;如何用好它又是一个问题了。 本文以centos7操作系统下搭建的Prometheus server为例&#xff0c;讲解基于文件发现新的采集器。 一&#xff0c; Pr…

【FLASH存储器系列十二】Nand Flash芯片使用指导之二

目录 1.1 芯片指令集 1.2 READ PAGE&#xff08;00h–30h&#xff09; 1.3 READ PAGE CACHE SEQUENTIAL (31h) 1.4 READ PAGE CACHE RANDOM (00h-31h) 1.5 PROGRAM PAGE&#xff08;80h-10h&#xff09; 1.6 PROGRAM PAGE CACHE (80h-15h) 1.7 ERASE BLOCK (60h-D0h) 上…

pytorch深度学习实战lesson26

第二十六课 GoogLeNet 这节课学习Googlenet &#xff0c; 虽然 nin 现在几乎没有被使用&#xff0c;但是 Googlenet 还是在大量的被使用。在比如说 Google 内部当然是用的挺多的&#xff0c;在外面也是被经常使用。这个网络当时候出来的时候也是吓了大家一跳。 如上图所示&…

到底该怎么学python啊?

前言 大家都说找工作有金九银十&#xff0c;经过了金九银十之后&#xff0c;很多小伙伴都纷纷入职了各家企业&#xff0c;在各个企业中扮演者不同的角色&#xff0c;其中我接触最多的就是算法工程师和Python开发工程师&#xff0c;也跟其他企业的相关技术负责人交流过&#xf…

11月25日:tp框架中的架构,配置,路由,控制器

tp框架的主要内容 架构&#xff1a; https://static.kancloud.cn/manual/thinkphp5/118010 配置&#xff1a; 配置文件主要位置 可以使用Config::load()调用thinkphp中的静态方法&#xff0c;显示出config.php的主要内容 路由&#xff1a; 图中可见 使用url::调用静态方法…