Vivado下创建基于AXI

合集下载

VIVADO 设计工具使用流程

VIVADO 设计工具使用流程

三、建立仿真环境
在对设计好的工程进行仿真的时候可以使用vivado自带的仿真工 具仿真也可以使用第三方仿真工具仿真。使用vivado自带仿真工具仿 真时只需要编写测试激励就可以直接利用vivado进行仿真。当使用 modelsim等第三方仿真工具仿真时,我们需要提前对xilinx的仿真库 进行编译。 在vivado中编译仿真库和ISE稍有不同,ISE提供的可视化的库文 件编译环境,而在vivado设计环境下,编译仿真库需要使用TCL脚本 进行编译。
Vivado使用方法
一、软件安装 二、建立工程 三、建立仿真环境 四、为工程添加约束 五、综合、布局布线和生成bit文件 六、debug
一、软件安装
一、软件安装
一、软件安装
一、软件安装
一、软件安装
二、建立工程
二、建立工程
二、建立工程
二、建立工程
二、建立工程
二、建立工程
添加一个模块设计
六、debug
启动代码模块,并搜索关键字,将关键字插入代码中。
六、debug
启动set up debug
六、debug
被标注debug关键字的信号将出现在这个对话框内。如果我们漏填信号或者多 填了信号我们可以点击add/remove nets 按钮,在弹出的对话框内继续对 debug信号进行编辑。对符合的信号我们需要选定采样时钟。
2、使用软件约束工具添加约束
1)添加时序约束
2、使用软件约束工具添加约束
1)添加时序约束
2、使用软件约束工具添加约束
2)添加管脚约束
2、使用软件约束工具添加约束
2)添加管脚约束
2、使用软件约束工具添加约束
3)添加区域约束
五、综合、布局布线和生成bit文件

VIVADO下ILA使用指南

VIVADO下ILA使用指南

VIVADO下ILA使用指南1000字VIVADO(Vivado Integrated Development Environment)是Xilinx公司推出的一种集成化开发环境,它可以帮助工程师更快地开发、测试和部署FPGA设计。

ILA(Integrated Logic Analyzer)是Vivado中的一个调试工具,可以用于验证设计中的逻辑。

本文将针对Vivado中的ILA工具的使用方法进行详细介绍。

一、创建ILA核1. 在Vivado的工具栏中,选择“打开系统”并打开设计文件。

2. 打开工具栏的“IP目录管理器”,然后单击“添加IP”按钮。

3. 在“添加或创建IP”的弹出窗口中,选择“创建新的IP”。

4. 在“创建新IP”的弹出窗口中,输入IP名称、IP版本和分类。

5. 单击“下一步”按钮,在“IP的核选项”窗口中选择“可编辑的调试核”,然后单击“下一步”。

6. 在“IP的端口和接口”窗口中设定输入和输出端口的名称、宽度和方向。

7. 单击“下一步”,输入IP的注册信息,然后单击“完成”按钮。

8. 完成后,Vivado会在当前设计项目的IP目录中生成新的ILA核。

二、添加到设计中1. 在源代码窗口右键单击需要添加ILA的模块,选择“加入调试核”。

2. 在“ILAv1_0”核的实例化窗口中,输入该模块的名称和实例化名称,然后单击“完成”。

3. 完成后,Vivado会为模块实例自动添加模块实例的ILAv1_0模块。

三、设置ILA1. 单击 ILA 组件名,在组件配置窗口中配置以下参数:2. Trigger port:避免浪费显示缓存器的空间。

3. Trigger阈值:指定何时开始捕获跟踪信息。

4. Capture Mode:捕获模式分为“单次”和“连续”。

5. Trigger Condition:触发条件定义为何时捕获跟踪信息。

6. Probe列表:这是将要跟踪的变量列表。

四、生成bit文件1. 选择“生成精简综合设计”。

vivado ip integrator 创建工程方法

vivado ip integrator 创建工程方法

vivado ip integrator 创建工程方法一、简介Vivado IP Integrator是Xilinx公司开发的一款工具,用于在Vivado软件环境中集成和创建新的IP核。

通过使用IP Integrator,用户可以轻松地创建自定义IP核并将其集成到Xilinx的FPGA设计当中。

本文档将向您展示如何使用Vivado IP Integrator创建一个新的工程。

二、所需软件和工具在开始之前,请确保您已经安装了以下软件和工具:* Xilinx Vivado软件* 计算机一台(建议使用Intel兼容的CPU)三、创建工程步骤1. 打开Vivado软件,并点击“新建项目”按钮。

2. 在项目向导中,选择“IP Integrator”选项,并点击“下一步”。

3. 输入项目名称和保存位置,并选择需要使用的FPGA板卡型号。

4. 点击“完成”按钮,进入IP Integrator界面。

5. 在IP Integrator界面中,可以看到左侧的IP浏览器。

在这里,您可以选择需要集成的IP核。

6. 选择要集成的IP核后,将其拖拽到中间的设计区域中。

7. 在设计区域中,您可以对IP核进行参数配置和布局布线等操作,以满足您的设计需求。

8. 完成IP核的集成后,点击工具右上角的“保存并关闭”按钮,保存工程并退出IP Integrator。

9. 返回到Vivado主界面,您将看到刚刚创建的工程。

现在,您可以继续进行FPGA设计的其他步骤,如综合、布局布线、生成比特流等。

四、注意事项1. 在集成IP核之前,请确保已经了解了该IP核的使用方法和限制。

2. 在配置和布局布线IP核时,请根据您的设计需求进行调整。

3. 在保存工程之前,请务必检查是否有错误或警告信息。

4. 在进行FPGA设计时,请遵循Xilinx的指南和最佳实践。

五、参考资料1. Xilinx官方文档和资源:Xilinx官方提供了丰富的文档和资源,包括教程、案例、参考手册等,可以帮助您更好地了解和使用Vivado和IP Integrator。

基于vivado hls的特征点坐标提取和axi4-stream接口高速传输

基于vivado hls的特征点坐标提取和axi4-stream接口高速传输

(1. Quanzhou Institute of Equipment ManufacturingꎬHaixi InstitutesꎬChinese Academy of Sciencesꎬ
Jinjiang 362200ꎬFujian ProvinceꎬChinaꎻ
2. North University of ChinaꎬTaiyuan 030000ꎬபைடு நூலகம்hina)
摘 要: 基于 ZYNQ ̄7000 片上系统( SOC) 的嵌入式图像处理模块实现了特征点提取和高速数据
传输ꎬ 降低了图像处理部分的功耗ꎬ 同时提高了处理速度ꎮ 为了同时发挥 ZYNQ 芯片中处理器
系统 ( PS) 和可编程逻辑( PL) 的优势ꎬ 在 PL 中实现计算密集型的图像处理过程以提高处理速
的通信ꎮ PS 实 际 上 是 ARM 处 理 器 的 片 上 系 统ꎬ
ARM 适合运行操作系统和处理算法ꎮ PL 是 FPGA
的一部 分ꎬ 适 用 于 计 算 量 大、 实 时 性 要 求 高 的 任
务 [3] ꎮ
对图 像 处 理 的 硬 件 加 速 采 用 Xilinx 提 供 的
Vivado HLS 工具ꎬ 构建计算 标 记 点 中 心 坐 标 的 IP
coordinate calculations are also generated using the Vivado HLS high ̄level synthesis tool. The proposed
image processing and transmission scheme has a higher processing speed and is 15. 6 times faster than the

ZYNQ学习之路(三)自定义IP实现PL处理PS写入BRAM的数据

ZYNQ学习之路(三)自定义IP实现PL处理PS写入BRAM的数据

ZYNQ学习之路(三)自定义IP实现PL处理PS写入BRAM的数据在ZYNQ学习之路的第三部分中,我们将介绍如何使用Vivado和HLS工具来自定义IP(Intellectual Property)以实现PL(Programmable Logic)处理PS(Processing System)写入BRAM(Block RAM)的数据。

IP是可重用的硬件模块,用于在FPGA(Field Programmable Gate Array)上实现特定功能。

我们将使用Vivado工具创建一个IP,该IP将在PL中实现一个简单的数据处理逻辑,并将来自PS的数据写入BRAM。

以下是实现该功能的步骤:1. 打开Vivado工具,并创建一个新的工程。

选择“Create Project”选项,然后按照向导的指导完成工程的创建。

2. 在工程中创建一个新的Block Design,这将是我们用于设计IP的容器。

3. 在Block Design中添加一个Processing System(PS)和Programmable Logic(PL)。

将PS与PL连接起来,以便可以在它们之间进行数据传输。

4. 在PL部分的设计中,添加一个AXI接口以实现与PS的数据交互。

您可以使用AXI Interconnect或AXI GPIO等组件,具体取决于您的设计需求。

5. 使用Vivado HLS工具来定义IP的数据处理逻辑。

使用C/C++语言编写数据处理算法,并将其综合为硬件描述语言(HDL)。

6. 将生成的HDL文件添加到Vivado工程中,并使用IP Packager工具将其打包为IP。

7. 在Block Design中添加刚刚打包的IP,并将其与PS和PL进行连接。

9.在PS中编写软件程序,以便向生成的IP发送数据并读取BRAM中的结果。

10.在运行程序之前,确保在PS中正确配置AXI接口的地址映射等参数。

通过按照上述步骤,您将能够自定义一个简单的IP,并将PS中的数据写入BRAM进行处理。

Vivado使用方法

Vivado使用方法

Vivado使用方法Vivado是一款全面的FPGA设计工具套件,主要用于ASIC、FPGA硬件设计和开发。

该工具套件提供了基于IP管理、综合、实现、建模等组件,同时还有用于调试和分析的工具。

Vivado支持一系列设计语言,包括Verilog、VHDL、SystemVerilog等。

这里介绍一下Vivado的使用方法,包括工程创建、IP核添加、约束文件添加、综合和实现。

一. 工程创建和添加文件在电脑上进入Vivado软件,然后选择“Create Project”,在弹出的窗口中设置工程的名字和路径等相关信息,选择创建工程。

在工程创建完成后,需要添加文件。

这些文件包括hdl文件、约束文件、仿真模型、模块文档等。

在Vivado中添加文件的方式如下:点击菜单栏“File → Add Sources”,选择要添加的文件类型对应的选项。

例如要添加一个Verilog文件,选择“Add or create design sources”,然后选择“Add Files...”,并选择相应的文件。

二. IP核添加Vivado提供了大量的IP核,可以帮助设计师快速构建基础电路。

可以通过以下步骤将IP核添加到工程中:点击菜单栏“Tools → Create and Package IP”,弹出“Create and Package New IP”对话框。

按照提示完成IP核的创建和封装,并选择“Add IP...”将IP核添加到工程中。

三. 约束文件添加在进行综合和实现之前,需要先添加一个约束文件。

这些约束文件用于描述设计中的时序和约束条件,并将这些信息传递给Vivado工具进行综合和实现。

四. 综合综合是将原理图转换成可编程逻辑单元的过程,通常用来验证设计中的逻辑功能。

在Vivado中进行综合,可以通过以下方法:点击菜单栏“Flow Navigator → Run Synthesis”选项卡,然后点击“Run Synthesis”按钮。

Vivado 学习之编写IP核并通过AXI协议与ARM通信

Vivado 学习之编写IP核并通过AXI协议与ARM通信

Vivado 学习之编写IP核并通过AXI协议与ARM
通信
 最近发现了一块好玩的板子,PYNQ这块板子最大的特点就是可以将所写的IP核封装成Python库的形式,然后通过在板载的xlinux系统下用户可以选择通过Jupiter编辑器实时的编写Python脚本,然后Python脚本调用编写好的IP核对FPGA进行重构,使开发变得更加灵活方便。

PYNQ doucument 这是PYNQ的官方文档感兴趣的可以看一下。

 还有就是学生购买PYNQ的话会有教育专享价,原价2000多的板子只要998就可以拿下。

 以下正文。

1. Vivado 部分
1.老套路
1.打开vivado(注意不是vivado hls),建立工程,选择你手里板子的型。

vivado2013.4FFT(9.0版本AXIS总线) IP使用及仿真

vivado2013.4FFT(9.0版本AXIS总线) IP使用及仿真

项目需求,最近使用了Vivado2013.4做开发,设计中使用到FFT(9.0)的IP,该IP接口采用AXIS总线格式,相比ISE14.7中FFT(8.0)以及Vivado中FFT(LTE)输入信号格式大变,不过只要熟悉AXIS总线信号格式就没得问题,不要怕麻烦!!!(刚开始使用就是怕麻烦,有些握手信号没用,event状态信号也没注意,浪费了不少时间)一、设计参数配置,及IP生成下面开始介绍配置界面:第一页,Configuration,主要是FFT变换长度以及结构选择。

Number of Channels:FFT变换通道,可以选择多通道,实现多帧数据同时进行FFT运算;Transfrom Length:FFT变换长度;如果下面选择了“Run Time Configuration Transform Length”,则该参数为FFT变换最大长度。

时钟选择根据自己设计需求,只能是1—550之间的整数,不小于自己需求时钟就可以了。

Architecture Choice:实现架构选择,根据设计需求、板子资源情况,本设计中选择变换处理时间最短、消耗资源最大的并行流水结构;其他结构以此降低了变化速率但是节省了资源,这个在PG109-xfft中有详细介绍。

Run Time Configuration Transform Length:勾选该项,则在变换过程中可以改变FFT变换的长度,通过s_axis_config_ tdata中NFFT字段进行配置。

第二页,Implementation介绍。

Data Format:输入数据格式,定点和浮点两种,根据自己设计需求选择了定点;Scaling Options:Block Float Point、Scaled、Unscaled三种可选。

Block Float Point不管输入格式如何,FFT变换内部采用浮点,会根据每一级变换数据情况自动缩放,使得数据不出现溢出,在m_axis_data_tuser中会有5个比特表示每一级缩放情况(本设计中是[20:16]);Scaled 选择后,在s_axis_config_tdata中有相应字段配置缩放因子,这个在pg109-xfft中有详细介绍,每一级包含2个stage,2个比特表示一级的缩放,一般0-3可选,变换长度NFFT,如果log2(NFFT)不是2的倍数,则最高一级的缩放只能0-1可选;Unscaled全精度,不用担心变换过程中会出现溢出,但是输入32bit,变换后的输出是64bit跟自己的设计不符合,截位误差更大。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Vivado下创建基于AXI本文是为一位网友所写,据说网上Vivado下自定义IP 核的资料很难找~本文主要讲述了在Vivado下创建AXI-Lite 型IP核的流程。

最近问IP问题的人略多……Vivado为设计人员提供了很多IP核,但不可能完全满足我们的所有设计需求,在设计过程中,很多时候需要设计个性化的IP核,用于完成自己想要的功能。

因此,在Vivado下创建IP核的流程也是必须掌握的基础之一。

废话不多说,直奔主题。

如图1所示,Tools > Create and Package IP…,打开IP创建和打包向导。

图1进入第一个界面,如图2所示。

是一些提示信息,直接点击Next图2进入操作类型选择界面,如图3所示。

图3这里我们要做的是创建IP,所以选择“Create a new AXI4 peripheral”,如图3所示,选择完毕,单击next,进入下一界面,如图4所示。

图4在该界面设置IP核的名称、版本、存储路径等,完毕后,点击Next,进入下一界面,如图5所示。

图5此处可以设置总线类型、总线位宽、寄存器个数等,我们要做的就是一个AXI-Lite型IP,所以不必改动,直接Next,进入最后一步,如图6所示。

图6向导的最后一步,IP概要信息,选择下一步操作。

这里我们选择“Add IP to therepository”,这样在IP Catalog中就可以找到我们新建的IP了。

打开IP Catalog,在搜索框内键入myip(你的Ip的名字),就可以检索出IP核,如图7所示。

图7选中该IP,右键,在弹出菜单中选择Edit in IP Packager,如图8所示。

图8之后会弹出对话框,询问新的工程存放路径及工程名称,如图9所示。

图9设置完毕后,点击OK,会新建一个vivado 工程,用于编辑IP核。

在新打开的Vivado IDE中,找到Source子窗口,双击打开myip_v1_0.v顶层文件(图10所示位置),在图11所示的位置添加自主端口,我这里是一个1bit的pwm_out输出端口。

图10图11所添加的pwm_out 端口是连接到底层端口的,因此,需要添加相应的例化语句。

在myip_v1_0.v中如图12所示位置添加例化语句,修改完毕后保存。

图12顶层修改完了,再修改底层的module,具体修改部位就不说了,直接把修改后的代码贴出来,这里不是重点,感兴趣的话自己看一下吧。

想设计PWM IP核,可以参考我之前的文章,用HLS做,比本文的方法简单快捷。

`timescale 1 ns / 1 psmodule myip_v1_0_S00_AXI #(// Users to add parameters here// User parameters ends// Do not modify the parameters beyond this line// Width of S_AXI data busparameter integer C_S_AXI_DATA_WIDTH = 32,// Width of S_AXI address busparameter integer C_S_AXI_ADDR_WIDTH = 4 )(// Users to add ports hereoutput wire pwm_out,// User ports ends// Do not modify the ports beyond this line// Global Clock Signalinput wire S_AXI_ACLK,// Global Reset Signal. This Signal is Active LOWinput wire S_AXI_ARESETN,// Write address (issued by master, acceped by Slave)input wire [C_S_AXI_ADDR_WIDTH-1 : 0]S_AXI_AWADDR,// Write channel Protection type. This signal indicatesthe// privilege and security level of the transaction, and whether// the transaction is a data access or an instruction access.input wire [2 : 0] S_AXI_AWPROT,// Write address valid. This signal indicates that the master signaling// valid write address and control information.input wire S_AXI_AWVALID,// Write address ready. This signal indicates that the slave is ready// to accept an address and associated control signals.output wire S_AXI_AWREADY,// Write data (issued by master, acceped by Slave)input wire [C_S_AXI_DATA_WIDTH-1 : 0]S_AXI_WDATA,// Write strobes. This signal indicates which byte lanes hold// valid data. There is one write strobe bit for each eight// bits of the write data bus.input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0]S_AXI_WSTRB,// Write valid. This signal indicates that valid write // data and strobes are available.input wire S_AXI_WVALID,// Write ready. This signal indicates that the slave // can accept the write data.output wire S_AXI_WREADY,// Write response. This signal indicates the status // of the write transaction.output wire [1 : 0] S_AXI_BRESP,// Write response valid. This signal indicates that the channel// is signaling a valid write response.output wire S_AXI_BVALID,// Response ready. This signal indicates that the master// can accept a write response.input wire S_AXI_BREADY,// Read address (issued by master, acceped by Slave)input wire [C_S_AXI_ADDR_WIDTH-1 : 0]S_AXI_ARADDR,// Protection type. This signal indicates the privilege // and security level of the transaction, and whether the// transaction is a data access or an instruction access.input wire [2 : 0] S_AXI_ARPROT,// Read address valid. This signal indicates that the channel// is signaling valid read address and control information.input wire S_AXI_ARVALID,// Read address ready. This signal indicates that the slave is// ready to accept an address and associated control signals.output wire S_AXI_ARREADY,// Read data (issued by slave)output wire [C_S_AXI_DATA_WIDTH-1 : 0]S_AXI_RDATA,// Read response. This signal indicates the status ofthe// read transfer.output wire [1 : 0] S_AXI_RRESP,// Read valid. This signal indicates that the channel is // signaling the required read data.output wire S_AXI_RVALID,// Read ready. This signal indicates that the master can// accept the read data and response information.input wire S_AXI_RREADY);// AXI4LITE signalsreg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr;reg axi_awready;reg axi_wready;reg [1 : 0] axi_bresp;reg axi_bvalid;reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr;reg axi_arready;reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata;reg [1 : 0] axi_rresp;reg axi_rvalid;//------------------ add by cuter---------------wire ovpprd;wirepwm_out_tmp;reg [C_S_AXI_DATA_WIDTH-1:0] pwm_cnt;//-----------------------end--------------------// Example-specific design signals// local parameter for addressing 32 bit / 64 bitC_S_AXI_DATA_WIDTH// ADDR_LSB is used for addressing 32/64 bit registers/memories// ADDR_LSB = 2 for 32 bits (n downto 2)// ADDR_LSB = 3 for 64 bits (n downto 3)localparam integer ADDR_LSB =(C_S_AXI_DATA_WIDTH/32) + 1;localparam integer OPT_MEM_ADDR_BITS = 1;//----------------------------------------------//-- Signals for user logic register space example//------------------------------------------------//-- Number of Slave Registers 4reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg0;// used as period registerreg [C_S_AXI_DATA_WIDTH-1:0] slv_reg1;// used as duty registerreg [C_S_AXI_DATA_WIDTH-1:0] slv_reg2;reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg3;wire slv_reg_rden;wire slv_reg_wren;reg [C_S_AXI_DATA_WIDTH-1:0] reg_data_out;integer byte_index;// I/O Connections assignmentsassign S_AXI_AWREADY = axi_awready;assign S_AXI_WREADY = axi_wready;assign S_AXI_BRESP = axi_bresp;assign S_AXI_BVALID = axi_bvalid;assign S_AXI_ARREADY = axi_arready;assign S_AXI_RDATA = axi_rdata;assign S_AXI_RRESP = axi_rresp;assign S_AXI_RVALID = axi_rvalid;// Implement axi_awready generation// axi_awready is asserted for one S_AXI_ACLK clock cycle when both// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is// de-asserted when reset is low.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_awready <= 1'b0;endelsebeginif (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID)begin// slave is ready to accept write address when// there is a valid write address and write data// on the write address and data bus. Thisdesign// expects no outstanding transactions.axi_awready <= 1'b1;endelsebeginaxi_awready <= 1'b0;endendend// Implement axi_awaddr latching// This process is used to latch the address when both // S_AXI_AWVALID and S_AXI_WVALID are valid.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_awaddr <= 0;endelsebeginif (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID)begin// Write Address latchingaxi_awaddr <= S_AXI_AWADDR;endendend// Implement axi_wready generation// axi_wready is asserted for one S_AXI_ACLK clock cycle when both// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is// de-asserted when reset is low.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_wready <= 1'b0;endelsebeginif (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID)begin// slave is ready to accept write data when// there is a valid write address and write data// on the write address and data bus. This design// expects no outstanding transactions.axi_wready <= 1'b1;endelsebeginaxi_wready <= 1'b0;endendend// Implement memory mapped register select and writelogic generation// The write data is accepted and written to memory mapped registers when// axi_awready, S_AXI_WVALID, axi_wready andS_AXI_WVALID are asserted. Write strobes are used to // select byte enables of slave registers while writing.// These registers are cleared when reset (active low) is applied.// Slave register write enable is asserted when valid address and data are available// and the slave is ready to accept the write address and write data.assign slv_reg_wren = axi_wready &&S_AXI_WVALID && axi_awready && S_AXI_AWVALID;always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginslv_reg0 <= 0;slv_reg1 <= 0;slv_reg2 <= 0;slv_reg3 <= 0;endelse beginif (slv_reg_wren)begincase( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR _LSB] )2'h0:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index =byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes// Slave register 0slv_reg0[(byte_index*8) +: 8] <=S_AXI_WDATA[(byte_index*8) +: 8];end2'h1:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index =byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes// Slave register 1slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end2'h2:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index =byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes// Slave register 2slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];end2'h3:for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index =byte_index+1 )if ( S_AXI_WSTRB[byte_index] == 1 ) begin// Respective byte enables are asserted as per write strobes// Slave register 3slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];enddefault : beginslv_reg0 <= slv_reg0;slv_reg1 <= slv_reg1;slv_reg2 <= slv_reg2;slv_reg3 <= slv_reg3;endendcaseendendend// Implement write response logic generation// The write response and response valid signals are asserted by the slave// when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted.// This marks the acceptance of address and indicates the status of// write transaction.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_bvalid <= 0;axi_bresp <= 2'b0;endelsebeginif (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready&& S_AXI_WVALID)begin// indicates a valid write response is availableaxi_bvalid <= 1'b1;axi_bresp <= 2'b0; // 'OKAY' responseend // work error responses in futureelsebeginif (S_AXI_BREADY && axi_bvalid)//check if bready is asserted while bvalid is high)//(there is a possibility that bready is always asserted high)beginaxi_bvalid <= 1'b0;endendendend// Implement axi_arready generation// axi_arready is asserted for one S_AXI_ACLK clock cycle when// S_AXI_ARVALID is asserted. axi_awready is// de-asserted when reset (active low) is asserted.// The read address is also latched whenS_AXI_ARVALID is// asserted. axi_araddr is reset to zero on reset assertion.always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_arready <= 1'b0;axi_araddr <= 32'b0;endelsebeginif (~axi_arready && S_AXI_ARVALID)begin// indicates that the slave has acceped thevalid read addressaxi_arready <= 1'b1;// Read address latchingaxi_araddr <= S_AXI_ARADDR;endelsebeginaxi_arready <= 1'b0;endendend// Implement axi_arvalid generation// axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both// S_AXI_ARVALID and axi_arready are asserted. The slave registers// data are available on the axi_rdata bus at this instance. The// assertion of axi_rvalid marks the validity of read data on the// bus and axi_rresp indicates the status of readtransaction.axi_rvalid// is deasserted on reset (active low). axi_rresp andaxi_rdata are// cleared to zero on reset (active low).always @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_rvalid <= 0;axi_rresp <= 0;endelsebeginif (axi_arready && S_AXI_ARVALID&& ~axi_rvalid)begin// Valid read data is available at the read data busaxi_rvalid <= 1'b1;axi_rresp <= 2'b0; // 'OKAY' responseendelse if (axi_rvalid && S_AXI_RREADY)begin// Read data is accepted by the masteraxi_rvalid <= 1'b0;endendend// Implement memory mapped register select and read logic generation// Slave register read enable is asserted when valid address is available// and the slave is ready to accept the read address.assign slv_reg_rden = axi_arready &S_AXI_ARVALID & ~axi_rvalid;always @(*)beginif ( S_AXI_ARESETN == 1'b0 )beginreg_data_out <= 0;endelsebegin// Address decoding for reading registerscase( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_ LSB] )2'h0 : reg_data_out <= slv_reg0;2'h1 : reg_data_out <= slv_reg1;2'h2 : reg_data_out <= slv_reg2;2'h3 : reg_data_out <= slv_reg3;default : reg_data_out <= 0;endcaseendend// Output register or memory read dataalways @( posedge S_AXI_ACLK )beginif ( S_AXI_ARESETN == 1'b0 )beginaxi_rdata <= 0;endelsebegin// When there is a valid read address(S_AXI_ARVALID) with// acceptance of read address by the slave (axi_arready),// output the read dadaif (slv_reg_rden)beginaxi_rdata <= reg_data_out; // register read dataendendend// Add user logic hereassign vprd = (pwm_cnt[30:0] == slv_reg0[30:0]) ? 1'b1 : 1'b0;assign pwm_out_tmp = (slv_reg1 < pwm_cnt) ?1'b0 : 1'b1;assign pwm_out = pwm_out_tmp &slv_reg1[31];always @(posedge S_AXI_ACLK) beginif(S_AXI_ARESETN == 1'b0 || ovprd ||~slv_reg1[31])pwm_cnt = 32'h8000_0000;else if(slv_reg1[31])pwm_cnt = pwm_cnt + 1;elsepwm_cnt = pwm_cnt;end// User logic endsendmodule逻辑代码修改完毕后,选择Package IP – myip自选项卡,如果该选项卡被关闭了,可以在Sources子窗口中展开IP-XACT目录,找到component.xml,双击打开,如图13所示。

相关文档
最新文档