第3章 实验3:自定制接口模块的设计 1 实验目的 3. 在本实验中,在深入理解MIPSfpga处理器和AXI 总线协议以及掌握了基于VivadoIP 集成方法搭建MIPSfpga处理器系统的流程的基础上,实现一个基于AXI4总线接口标准的 外设模块,并将该模块添加到MIPSfpga处理器系统中。需要按照下述步骤完成本实验: (1)编写并封装一个带中断输出信号的基于AXI4总线接口标准的PWM 外设模块(该 模块的中断功能将在后续的实验中用到,在本实验中不会使用)。 (2)将该自定制接口模块添加到实验2搭建的MIPSfpga处理器硬件平台上。 (3)生成新建的包括该自定制接口模块的MIPSfpga处理器硬件平台比特流文件,并将 其烧写到Nexsy4DDRFPGA 开发板上。 (4)编写C语言程序,对MIPSfpga处理器硬件平台进行测试。 通过本实验,应加深对AXI4总线接口标准的理解,掌握基于VivadoIP 集成开发流程 设计实现处理器自定制外设模块的方法,学会编写、编译并调试MIPSfpga处理器外设驱动 程序和应用测试程序,为后续设计实现更加复杂的MIPSfpga处理器硬件平台奠定基础。 2 实验内容 3. 3.1 基于AXI4总线接口的自定制外设模块封装 2. 开始实验前,先复制实验2的工程,即复制实验2的工程文件夹MIPSfpga_axi4并将复 制后的文件夹更名为MIPSfpga_CustomIP,然后按照下述步骤开始实验: (1)启动Vivado,打开MIPSfpga_CustomIP 工程(因为只修改了该工程的文件夹名称, 因此该工程的名称仍然是MIPSfpga_axi4), 然后选择Tools→CreateandPackageIP 菜单命 令,如图3-1所示。 图3-1 选择Tools→CreateandPackageIP 菜单命令 63 (2)出现CreateandPackageNewIP 对话框后,单击Next按钮,在下一步的界面中选 择CreateanewAXI4peripheral单选按钮,如图3-2所示。 图3-2 选择CreateanewAXI4peripheral单选按钮 (3)如图3-3所示,在下一步的界面中输入模块的名称、版本号等信息,然后单击Next 按钮。 图3-3 输入模块的相关信息 (4)在下一步的界面中,设定该模块AXI4接口的类型和参数。这里选择接口类型为 AXI4-Lite的从端口,该接口包含4个寄存器,寄存器的位数为32 位,如图3-4所示。 (5)AXI4接口类型和参数设置完成后,单击Next按钮,接下来选择EditIP 单选按钮, 如图3-5所示,然后单击Finish按钮。 (6)这时会启动一个新的Vivado界面,其中出现了一个名为edit_PWM_w_Int_v1_0 的工程(该工程位于图3-3中IPlocation指定的文件夹下,且工程名与该模块的名称和版本 号对应), 如图3-6所示。 至此,就有了一个基于AXI4总线接口的自定制外设模块的模板,接下来就需要对该 64 65 图3-4 AXI4接口类型和参数设置 图3-5 自定制模块设置完成 Int_v1_0工程进行相应的修改和完善,从而设计出需要的自定制外设模块。 以本实验的PWM外设模块的设计为例,需要进行以下修改(详细的程序代码请参看 具体步骤如下: it_PWM_w_Int_v1_0工程中打开名为PWM_w_Int_v1_0.v的文件,找到注释 oaddparametershere,在该行下面添加整型参数PWM_PERIOD=20,然后在 rstoaddportshere下面添加线网型输出端口Interrupt_out、LEDs、PWM_ edit_PWM_w_ 3节), 3. (1)在ed 行//Userst 注释行//Use 图3-6 新建的edit_PWM_w_Int_v1_0工程 ConetyCyl如图37(所示; w_n_v_0.w_ utr和Duce, -a) 在PWM_It1v文件中找到名为PWM_ _t的模块实例化代码段,在其中添加端口引用,即. Intv1_0_S00_AXI_insslv_reg0 (DutyCycle),如图3-7(b)所示;在注释行(//Adduserlogichere)后添加名为PWM_ Controler_Int的模块实例化代码段,如图3-7(c)所示。 2)PWM_Intv0.Intv (w__1_v文件编辑完成后,再打开其下层的名为PWM_w__1_0_ S00AXIv的文件,在注释行//Userstoaddparametershere后将slv_reg0修改为输出端口,如(_) 图3-8(.) 所示。 (3)在edit_PWM_w_Int_v1_0工程中通过右键快捷菜单中的AddSource命令添加一 ControlerInt.- 个名为PWM_v的设计文件,如图39和图310所示。 (4)添加完设计文在工程中打开PWM__v文件,根据需要输入程序件后,(_) ControlerInt. 图3__v文件的修改 -7PWM_w_Intv10. 66 67 图3-7 (续) 图3-8 PWM_w_Int_v1_0_S00_AXI.v文件的修改 图3-9 在edit_PWM_w_Int_v1_0工程中添加设计文件 图310 创建名为PWM__v的设计文件 -ControlerInt. 3节)。 源码(具体参看3. (5)然后编写相应的仿真测试程序,对外设模块设计的正确性进行功能仿真验证。仿 真验证正确后可以综合。综合无误后就可以对该模块进行IP封装了。 (6)IP封装通过Vivado的PackageIP功能实现,其界面如图3-11所示(如果图3-11所 示的界面没有在工程中显示,则可以通过选择PackageIP菜单命令打开该界面)。 图3-11PackageIP界面 (7)在PackageIP界面左侧找到FileGroups选项。如果FileGroups选项的图标上不 是绿色的钩,则在右侧选择MergechangesfromFileGroupsWizard,然后检查PWM_ _v文件是否已经加入Fs中。如果选择Me ControlerInt.ileGrouprgechangesfromFile GroupsWizarControlerInt. d后PWM__v文件没有自动加入,则需手工添加该文件。 68 (8)PWM_ 添加的PWM_ (9)在P 和LED 绿色的钩, ImportIPPo 69Controller_Int.v文件添加成功后的FileGroups窗口如图3-12所示。如果 Controller_Int.v文件不是如图3-12所示的相对路径,而是绝对路径,则需要 手工删除该文件,然后重新添加该文件。 图3-12 PWM_Controller_Int.v文件已正确添加到FileGroups中 ackageIP界面左侧选择PortsandInterfaces选项,检查模块的Interrupt_out s信号引脚是否已经设置为输出引脚。如果PortsandInterfaces选项的图标上不是 则在该选项上单击,即可自动加入;也可以右击该选项,在弹出的快捷菜单中选择 rts命令,找到模块的顶层设计文件,即PWM_w_Int_v1_0.v,通过选定顶层设 计文件添加输出引脚,如图3-13所示。引脚正确添加后的结果如图3-14所示。 图3-13 通过选定顶层设计文件添加输出引脚 图3-14 引脚正确添加后的结果 (10)最后选择ReviewandPackage选项,确认设置正确无误后单击Re-PackageIP 按 钮,等待Vivado完成edit_PWM_w_Int_v1_0工程模块的封装(通常当前的 Vivado工程会自动关闭并退出), 如图3-15 所示。 IP 封装完成后, 图3-15 完成IP 封装 IP 封装完成后,需要回到MIPSfpgaCustomIP 工程,选择IPCatalog菜单命令打开IP 库,查看刚才封装的PWM 外设模块是否在(_) IP 库中,如图3-16 所示,此时IPCatalog窗口中 的Usy下的AXIPl文件夹下名为PWM__0的模块就是刚刚 erRepositoreripheraw_Intv1. 自定制的基于AXI4总线接口标准的外设模块。 如果需要,可以再次打开edit_PWM_w_Int_v1_0工程,对模块进行修改和重新封装。 图3-16IPCatalog中新增的用户自定制模块 70 713.2.2 在MIPSfpga硬件平台中使用自定制模块 具体实验步骤如下: (1)在Vivado的ProjectManager下选择OpenBlockDesign,打开MIPSfpga_CustomIP 工程,如图3-17所示。 图3-17 选择OpenBlockDesign打开工程 (2)右击工作空间,在弹出的快捷菜单中选择AddIP命令,在IP库中找到用户自定制 模块PWM_w_Int_v1.0,双击该模块,将其添加到工程中,并按照图3-18所示将其连接到 MIPSfpga处理器系统中(具体连接方法参看实验2)。 图3-18 添加PWM_w_Int_v1.0模块 3)PWM_w_Int_v1.0模块连接完成后,切换到AddressEditor,将模块的偏移地址 (OffsetAddress,即该IP模块的物理地址)设置为0x10C0_0000,如图3-19所示。 图319 设置PWM_w__0模块的偏移地址 -Intv1. 完成上面的操作后,MIPSfpga处理器硬件平台如图3-20 所示。 图3-20 添加自定制模块后的MIPSfpga处理器硬件平台 (4)在ProjectManager中选择ValidateDesign,对设计的正确性进行检验。检验过程 中如果只是出现警告,单击OK 按钮忽略即可,然后在ProjectManager中选择Generate BlockDesign,在弹出的对话框中单击Generate按钮,更新MIPSfpga_system_wrapper 文件。 (5)相应地修改约束文件,为新添加的PWM 外设模块增加引脚绑定。 (6)单击GenerateBitstream 按钮,生成比特流文件。比特流文件生成后,注意观察时 序能否满足设计要求。 3.3 MIPSfga硬件平台测试 2.p 具体实验步骤如下: (1)在下载的system_ability文件夹下找到MIPSfpga_CustomIP_C文件夹,仔细阅读 该文件夹下的所有程序和文件。 (2)在主机上打开一个cmd 命令窗口,切换到MIPSfpga_CustomIP_C文件夹,然后输 入make命令,对程序进行编译(如果需要,可以用makeclean命令先对编译的程序进行清 除,详见1.3节)生成ELF 文件。 2. (3)连接Nexys4DDRFPGA 开发板的下载线和JTAG 调试器。打开Vivado,向 Nexys4DDRFPGA 开发板烧写添加自定制外设模块后的MIPSfa硬件平台的比特流 文件。 pg (4)再打开一个cmd 命令窗口,切换到Codescape_Scripts文件夹,然后在该cmd 命令 72 7 3 窗口中输入如下命令: loadMIPSfpga.bat C:\workspace\Peripheral_course_2017\MIPSfpga_CustomIP_C 在上面的命令中,loadMIPSfpga.bat后面给出的是MIPSfpga_CustomIP_C 文件夹所在的 路径。 (5)在主机上打开一个串口终端(例如PuTTY.exe),将波特率设置为115200baud,然 后观察程序运行情况,特别要注意观察PWM 模块的输出。 (6)如果程序运行不正确,使用GDB工具进行调试,找出原因后进行修正。 (7)对MIPSfpga_CustomIP_C文件夹下的程序进行修改和完善,尝试进行更全面的测 试或添加新的功能,思考如何为PWM 外设模块提供相应的驱动程序。 3.3 实验背景及源码 3.3.1 AXI总线协议 1.AMBA 标准 AMBA(AdvancedMicrocontrollerBusArchitecture,高级微控制器总线体系结构)是由 ARM 公司推出的片上总线。它提供了一种特殊的机制,可将RISC处理器方便地与其他IP 核或外设集成。第一代AMBA 标准(即AMBA1.0)定义了两组总线协议,即高级系统总线 (AdvancedSystemBus,ASB)和高级外设总线(AdvancedPeripheralBus,APB)。AMBA 2.0则在此基础上增加了高级高性能总线(AdvancedHigh-performanceBus,AHB)。 AMBA3.0标准定义了4个总线协议,这些协议针对高数据吞吐量、低带宽通信,要求 低门数、低功耗以及执行片上测试和调试访问的数据集中处理。这4个总线协议除AHB、 ASB、APB外,还包括新增的AXI(AdvancedeXtensibleInterface,高级扩展接口)总线协议, 它丰富了AMBA 标准的内容,能够满足超高性能和复杂的片上系统设计的需求。 AMBA4.0标准在AMBA3.0的基础上对AXI总线协议进行了扩充,分别定义了3个 总线接口协议,即AXI4、AXI4-Lite和AXI4-Stream。 AXI4协议是对AXI3协议的更新,在用于多个主端口系统时,可提高互连的性能和利 用率。其主要特点是增强了以下功能: (1)对于突发长度,支持最多256位。 (2)能够发送服务质量信号。 (3)支持多区域接口。 AXI4-Lite协议是AXI4协议的子协议,能够较好地用于连接更简单、寄存器更少的接 口设备。其主要功能和特点如下: (1)所有事务的突发长度均为1位。 (2)所有数据存取的大小均与数据总线的宽度相同。 (3)不支持独占访问。 AXI4-Stream 协议可用于从主接口到辅助接口的单向数据传输,能够显著降低信号传 输的路由开销。该协议的主要功能和特点如下: (1)使用同一组共享线支持单数据流和多数据流。 (2)在同一互连结构内支持多种数据宽度。 (3)方便在FPGA中实现和使用。 2.AXI4总线协议简介 AXI4总线协议定义了5个独立进行数据传输的通道,分别是读地址(ReadAddres, RA)通道、读数据(ReadData,RD)通道、写地址(WriteAddres,WA)通道、写数据(Write Data,WD)通道和写响应(WriteResponse,WR)通道。 读/写地址通道提供数据传输需要的地址信息。数据传输通过写数据通道和读数据通 道在主设备和从设备之间进行:写数据时,写数据通道用于将主设备的数据传输到从设备, 此时写响应通道用于数据传输结束后从设备向主设备提供写数据完成确认信号(即写响应 信号),如图3-21所示;读数据时,读数据通道用于将从设备的数据传输到主设备,如图3-22 所示。 图3-21 AXI4总线协议写数据传输方式 图3-22 AXI4总线协议读数据传输方式 不管是哪种传输方式,AXI4总线协议都有如下规定: 74 751)数据传输之前允许先提供地址信息。 2)支持多个未完成传输过程同时进行。 3)支持数据传输乱序完成。 读数据通道用于传输读的数据以及从设备对主设备读操作的响应信息。其数据线的宽 16 、32 、64 、128 、256 、512 或1024 位之一。响应信息主要用于表明本次读操作的 写数据通道用于传输主设备要写到从设备的数据。其数据线的宽度可以是8、16 、32 、 512 或1024 位之一,同时用字节使能信号标明有效的写数据字节。写数据通道 中传输的信息通常被当作缓存处理,因此主设备可以在本次数据传输未被从设备确认的情 况下就开始下一次数据传输。 从设备利用写响应通道向主设备反馈写操作的信息,所有写操作的完成确认信号都通 过写响应通道传输。完成确认信号仅用于表明本次写操作的完成,并不用于表明本次写操 作过程中每个数据的传输。 4互连方式 4总线进行设备互连时,其结构如图3-23 所示,通常由一个互连结构 t)将多个主、从设备连接起来。 图3-23 AXI4总线互连结构 主设备与互连结构以及互连结构与从设备之间都通过一对AXI4总线接口连接,如 这些接口也都遵循AXI4总线协议。 图3-24 AXI4总线系统互连方式 4总线信号 下面对AXI4总线的信号进行描述,包括全局信号、写地址通道信号、写数据通道信号、 写响应通道信号、读地址通道信号、读数据通道信号以及低功耗接口信号,如表3-1~表3-7 所示。在下面的表中,所有通道信号都是以32 位数据总线、4位写数据使能以及4位ID 段 ((( 度可以是8、 结束。 64 、128 、256 、 3.AXI 使用AXI(interconnec 图3-24 所示, 4.AXI 为例列出。 表3- 1 AXI4总线全局信号 信号名称源描述 ACLK 时钟全局时钟信号 ARESETn 复位全局复位信号,低电平有效 表3- 2 AXI4总线写地址通道信号 信号名称源描述 AWID[3:0] 主机写地址ID AWADDR[31:0] 主机写地址 AWLEN[3:0] 主机突发式写的长度,此长度决定突发式写传输数据的个数 AWSIZE[2:0] 主机突发式写的大小 AWBURST[1:0] 主机突发式写的类型 AWLOCK[1:0] 主机锁类型 AWCACHE[3:0] AWPROT[2:0] 主机 主机 高速缓存类型。该信号指明事务的buferable、cacheable、write- through、write-back、alocateatributes等信息 保护类型 AWVALID 主机 写地址有效。取值如下: 1=地址和控制信息有效 0=地址和控制信息无效 该信号会一直保持,直到AWREADY信号变为高 AWREADY 设备 写地址准备好。该信号用来指明设备已经准备好接收地址和控制信 息。取值如下: 1=设备已准备好 0=设备未准备好 表3- 3 AXI4总线写数据通道信号 信号名称源描述 WID[3:0] 主机写ID。WID的值必须与AWID的值匹配 WDATA[31:0] 主机写的数据 WSTRB[3:0] 主机写触发。WSTRB[n]标示的区间为WDATA[8n+7:8n] WLAST 主机写的最后一个数据 WVALID 主机 写有效。取值如下: 1=写数据和写触发有效 0=写数据和写触发无效 WREADY 设备 写就绪。指明设备已经准备好接收数据。取值如下: 1=设备已就绪 0=设备未就绪 76 表3- 4 AXI4总线写响应通道信号 信号名称源描述 BID[3:0] 设备写响应ID 。BID 值必须与AWID 的值匹配 BRESP[1:0] 设备 写响应。该信号指明写事务的状态。可能的响应有OKAY 、EXOKAY 、 SLVERR 、DECERR BVALID 设备 写响应有效。取值如下: 1=写响应有效 0=写响应无效 BREADY 主机 接收响应就绪。该信号表示主机已经能够接收响应信息。取值如下: 1=主机已就绪 0=主机未就绪 表3- 5 AXI4总线读地址通道信号 信号名称源描述 ARID[3:0] 主机读地址ID ARADDR[31:0] 主机读地址 ARLEN[3:0] 主机突发式读长度 ARSIZE[2:0] 主机突发式读大小 ARBURST[1:0] 主机突发式读类型 ARLOCK[1:0] 主机锁类型 ARCACHE[3:0] 主机高速缓存类型 ARPROT[2:0] 主机保护类型 ARVALID 主机 读地址有效。该信号一直会保持,直到ARREADY 为高。取值如下: 1=地址和控制信息有效 0=地址和控制信息无效 ARREADY 设备 读地址就绪。指明设备已经准备好接收数据。取值如下: 1=设备已就绪 0=设备未就绪 表3- 6 AXI4总线读数据通道信号 信号名称源描述 RID[3:0] 设备读ID 。RID 的值必须与ARID 的值匹配 RDATA[31:0] 设备读的数据 RRESP[1:0] 设备 读响应。该信号指明读传输的状态,包括OKAY 、EXOKAY 、 SLVERR 、DECERR RLAST 设备读的最后一个数据 77 续表 信号名称源描述 RVALID 设备 读数据有效。取值如下: 1=读数据有效 0=读数据无效 RREADY 主机 读数据就绪。取值如下: 1=主机已就绪 0=主机未就绪 表3- 7 AXI4总线低功耗接口信号 信号名称源描述 CSYSREQ 时钟控制器系统低功耗请求。该信号使外部设备进入低功耗状态 CSYSACK 外部设备低功耗请求应答 CACTIVE 外部设备 取值如下: 1=外部设备时钟有请求 0=外部设备时钟无请求 5.AXI4基本的读写传输过程 AXI4总线协议的5个通道都使用相同的VALID/READY 握手机制来传输数据或控 制信息。传输时,主机源产生VALID 信号来指明何时数据或控制信息有效,而设备源则产 生READY 信号来指明已经准备好接收数据或控制信息。只有当VALID 和READY 信号 同时有效时,才会发生真正的数据或控制信息传输。 VALID 和READY 信号之间可能出现以下3种时序关系: (1)VALID 先变高,READY 后变高,如图3-25(a)所示。 (2)READY 先变高,VALID 后变高,如图3-25(b)所示。 (3)VALID 和READY 信号同时变高,在这种情况下,数据或控制信息可立即进行传 输,如图3-25(c)所示。 读/写地址通道、读/写数据通道和写响应通道之间的关系是灵活的。例如,写数据通道 中的数据可以早于与其相关联的写地址信号出现在接口上,也有可能写数据通道中的数据 与写地址信号在同一个时钟周期中同时出现。但是,不管是什么情况,下述两种关系必须被 保持: (1)读数据通道中的数据必须总是跟在与其相关联的地址之后。 (2)写响应通道中的信息必须总是跟在与其相关联的写事务的最后出现。 读传输事务信号之间的依赖关系如图3-26 所示。它们之间必须满足下面的依赖关系: (1)从设备可以在ARVALID 信号出现时再给出ARREADY 信号;也可以先给出 ARREADY 信号,再等待ARVALID 信号有效。 (2)从设备必须等待ARVALID 和ARREADY 信号都有效时才能给出RVALID 信 号,并且开始数据传输。 写传输事务信号之间的依赖关系如图3-27 所示。它们之间必须满足下面的依赖关系: 78 79 图3-25 VALID 和READY 信号的3种时序关系 图3-26 读传输事务信号之间的关系 (1)主设备要确保不能等待从设备先给出AWREADY 或WREADY 信号后再给出 AWVALID 或WVALID 信号。 (2)从设备可以等待AWVALID 或WVALID 信号中的一个或者两个有效之后再给出 AWREADY 信号。 (3)从设备可以等待AWVALID 或WVALID 信号中的一个或者两个有效之后再给出 WREADY 信号。 6.AXI4突发式读写传输过程 AXI4突发式读写传输过程需要满足以下几个条件: (1)突发式读写的地址必须以4KB 为基准对齐。 图3-27 写传输事务信号之间的关系 (2)由AWLEN 信号或ARLEN 信号指定每一次突发式读写传输的数据个数。 (3)由ARSIZE 信号或AWSIZE 信号指定每一个时钟节拍传输的数据的最大位数。要 注意的是,任何一次传输的数据位数都不能超过数据总线的总宽度。 AXI4总线协议定义了3种突发式读写的类型,用ARBURST 或AWBURST 信号选择 突发式读写的类型: (1)固定式突发读写(FIX )。地址是固定的,每一次传输的地址都不变。这种突发式读 写对一个相同的位置重复进行存取,例如FIFO 。 (2)增值式突发读写(INCR )。每一次读写的地址都比上一次的地址增加一个固定 的值。 (3)包装式突发读写(WRAP )。与增值式突发读写类似,只不过包装式突发读写的地 址不一定从包数据的低地址开始,而且当地址增加到包数据边界时会自动转换到包数据的 低地址。 包装式突发读写有两个限制: (1)起始地址必须以传输的位数为基准对齐。 (2)突发式读写的长度必须是2、4、8或者16 位。 7.AXI4读写传输事务的设备响应 AXI4总线协议规定对于读事务和写事务都必须有响应。读事务将读响应信号与读的 数据一起发送给主设备,而写事务将写响应信号通过写响应通道传送。读写传输事务通过 RRESP[1:0]和BRESP[1:0]信号对响应信息进行编码。 AXI4总线协议的响应类型有正常存取成功(OKAY )、独占式存取(EXOKAY )、从设备 错误(SLVERR)和译码错误(DECERR)4种。 AXI4总线协议还规定,当有错误响应信息时,需要传输的数据会被正常传输,即在一次 突发式读写传输事务中,即使有错误响应发生,剩余数据的传输也不会被取消。 8.AXI4读写传输事务ID AXI4总线协议用事务ID 标签(a支持多地址和乱序传输。事务ID 标签主要由以下 tg) 5个事务ID 构成: (1)AWID 。写地址ID 标签。 (2)WID 。在写事务中,主设备传送WID 以匹配与地址一致的AWID 。 (3)BID 。在写响应事务中,从设备会传送BID 以匹配与AWID 和WID 一致的事务。 (4)ARID 。读地址ID 标签。 (5)RID 。在读事务中,从设备传送RID 以匹配与ARID 一致的事务。 主设备可以使用一个事务的ARID 或者AWID 提供的附加信息对请求进行排序。事务 80 8 1 排序规则如下: (1)从不同主设备传输的事务没有先后顺序限制,它们可以以任意顺序完成。 (2)从同一个主设备传输的不同ID的事务也没有先后顺序限制,它们可以以任意顺序 完成。 (3)AWID相同的写事务的数据必须按照顺序依次写入主设备发送的地址。 (4)ARID相同的读事务的数据必须遵循下面的顺序读出:当从相同从设备读ARID 相同的读事务的数据时,从设备必须确保数据按照相同的顺序接收;当从不同的从设备读 ARID相同的读事务的数据时,在接口处必须确保数据按照主设备发送顺序相同的顺序 接收。 (5)在AWID和ARID相同的读事务和写事务之间没有先后顺序限制。如果主设备有 顺序要求,那么必须确保第一个事务完全完成后才开始执行第二个事务。 当一个主设备端口与互连结构相连时,互连结构会在ARID、AWID、WID 信号中添加 一位,从而使得每一个主设备端口都是独一无二的。这样做有两个作用: (1)主设备不必知道其他主设备的ID。 (2)从设备端口处的ID段比主设备端口处的ID段宽。 对于读数据,互连结构会附加一位到RID中,用来判断哪个主设备端口读取数据。互连 结构在将RID的值送往正确的主设备端口之前会移除RID中后添加的一位。 3.3.2 PWM_w_Int_v1_0模块部分源码 module PWM_w_Int_v1_0 # ( // Users to add parameters here parameter integer PWM_PERIOD =20, // User parameters ends // Do not modify the parameters beyond this line // Parameters of Axi Slave Bus Interface S00_AXI parameter integer C_S00_AXI_DATA_WIDTH =32, parameter integer C_S00_AXI_ADDR_WIDTH =4 )( // Users to add ports here output wire Interrupt_out, output wire [1:0] LEDs, output wire [PWM_PERIOD-1:0] PWM_Counter, output wire [31:0] DutyCycle, // User ports ends … .slv_reg0(DutyCycle) ); 8 2 // Add user logic here PWM_Controller_Int #( .period(PWM_PERIOD) ) PWM_inst ( .Clk(s00_axi_aclk), .DutyCycle(DutyCycle), .Reset(s00_axi_aresetn), .PWM_out(LEDs), .Interrupt(Interrupt_out), .count(PWM_Counter) ); // User logic ends 3.3.3 PWM_w_Int_v1_0_S00_AXI模块部分源码 // Users to add ports here output reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg0, // User ports ends … //--Number of Slave Registers 4 //reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg0; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg1; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg2; reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg3; 3.3.4 PWM_Controller_Int模块部分源码 `timescale 1ns / 1ps module PWM_Controller_Int #(parameter integer period =20) ( input Clk, input [31:0] DutyCycle, input Reset, output reg [1:0] PWM_out, output reg Interrupt, output reg [period-1:0] count ); // Sets PWM Period. Must be calculated vs. input clk period // For example, setting this to 20 will divide the input clock by 2^20, or 1 Million // So a 50 MHz input clock will be divided by 1e6, thus this will have a period of 1/50 always @(posedge Clk) if (!Reset) count <=0; else count <=count +1;