ZYNQ 调用AXI WR RD ip及其代码

2024-01-20 16:52
文章标签 代码 ip 调用 zynq axi wr rd

本文主要是介绍ZYNQ 调用AXI WR RD ip及其代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先调用ip

值得注意的是:zynq支持axi4.0 ,但是创建的ip是属于axi3.0,其区别主要是在数据位宽以及突发长度的区别。

下面附读写控制模块(稍作修改就可使用,数据位宽是64bit 突发长度是256):

assign fifo_wr_data = {8'd0,pixel_rgb};assign fifo_wr_en =  hv;//fifo 2 clock domain switchasfifo_wr32x4096_rd64x2048 asfifo_wr32x4096_rd64x2048inst (.wr_clk(pixel_clk),                // input wire wr_clk.rd_clk(M_AXI_ACLK),                // input wire rd_clk.din(fifo_wr_data),                      // input wire [31 : 0] din.wr_en(fifo_wr_en),                  // input wire wr_en.rd_en(fifo_rd_en),                  // input wire rd_en.dout(fifo_rd_data),                    // output wire [63 : 0] dout.full(),                    // output wire full.empty(),                  // output wire empty.rd_data_count(rd_data_count)  // output wire [10 : 0] rd_data_count
);//dma write channel assign fifo_rd_en = axi_wvalid & M_AXI_WREADY;always @(posedge M_AXI_ACLK) beginif(M_AXI_ARESETN == 1'b0) beginburst_start <= 1'b0;endelse if (rd_data_count >='d256 && axi_wvalid == 1'b0 && axi_awvalid == 1'b0) beginburst_start <= 1'b1;endelse beginburst_start <= 1'b0;endendalways @(posedge M_AXI_ACLK) beginif(M_AXI_ARESETN == 1'b0) beginaxi_awvalid <= 1'b0;endelse if (axi_awvalid == 1'b1 &&M_AXI_AWREADY == 1'b1) beginaxi_awvalid <= 1'b0;endelse if (burst_start == 1'b1 && axi_awvalid == 1'b0 && axi_wvalid == 1'b0) beginaxi_awvalid <= 1'b1;endendalways @(posedge M_AXI_ACLK) beginif(M_AXI_ARESETN == 1'b0) beginaxi_awaddr <= 'd0;endelse if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1 && axi_awaddr == 'd8292352) beginaxi_awaddr <= 'd0;endelse if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1) beginaxi_awaddr <= axi_awaddr + 'd2048;endendalways @(posedge M_AXI_ACLK) beginif(M_AXI_ARESETN == 1'b0) beginaxi_wvalid <= 1'b0;endelse if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && burst_cnt == 'd255) begin //burst endaxi_wvalid <= 1'b0;endelse if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1) beginaxi_wvalid <= 1'b1;endendalways @(posedge M_AXI_ACLK) beginif(M_AXI_ARESETN == 1'b0) beginburst_cnt <='d0;endelse if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && burst_cnt == 'd255) beginburst_cnt <= 'd0;endelse if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1) beginburst_cnt <= burst_cnt + 1'b1;endendalways @* beginif(M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && burst_cnt == 'd255) beginaxi_wlast <= 1'b1;endelse beginaxi_wlast <= 1'b0;endendalways @* beginaxi_wdata = fifo_rd_data;endalways @(posedge M_AXI_ACLK) beginif(M_AXI_ARESETN == 1'b0) beginaxi_bready <= 1'b0;endelse beginaxi_bready <= 1'b1;endend

写模块代码(数据位宽是64bit 突发长度是256):

reg	[7:0]rx_Cnt;always @(posedge M_AXI_ACLK) begin if (M_AXI_ARESETN == 0 ) begin                                                                    axi_arvalid<=1'b0;                                     endelse if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1)beginaxi_arvalid<=1'b0;                                                                           		end                                                                               else if(rd_data_count<=1024 && axi_arvalid==1'b0 && axi_rready==1'b0 ) begin  axi_arvalid<=1'b1;                                           end                                                                      endalways @(posedge M_AXI_ACLK) begin if (M_AXI_ARESETN == 0 ) begin                                                                    axi_araddr<='d0;                                 endelse if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1 && axi_araddr=='d8292352)beginaxi_araddr<='d0;                                                                            		end                                                                             else if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1) begin  axi_araddr<=axi_araddr+'d2048;                                           end                                                                      endalways @(posedge M_AXI_ACLK) begin if (M_AXI_ARESETN == 0 ) begin                                                                    axi_rready<=1'b0;                                     endelse if(M_AXI_RVALID==1'b1 && M_AXI_RREADY==1'b1 && rx_Cnt=='d255)beginaxi_rready<=1'b0;                                                                              		end                                                                               else if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1) begin  axi_rready<=1'b1;                                          end                                                                      endalways @(posedge M_AXI_ACLK) begin if (M_AXI_ARESETN == 0 ) begin                                                                    rx_Cnt <= 'd0;                                     endelse if(M_AXI_RVALID==1'b1 && M_AXI_RREADY==1'b1 && rx_Cnt=='d255)beginrx_Cnt <='d0;                                                                            		end                                                                               else if(M_AXI_RVALID==1'b1 && M_AXI_RREADY==1'b1) begin  rx_Cnt<=rx_Cnt+1'b1;                                            end                                                                      end// Add user logic herefifo_generator_0 fifo_generator_0inst (.wr_clk(M_AXI_ACLK),                // input wire wr_clk.rd_clk(hdmi_clk),                // input wire rd_clk.din(M_AXI_RDATA),                      // input wire [63 : 0] din.wr_en(M_AXI_RVALID==1'b1 && M_AXI_RREADY==1'b1),                  // input wire wr_en.rd_en(rd_fifo_en),                  // input wire rd_en.dout(pixel_rgb),                    // output wire [31 : 0] dout.full(),                    // output wire full.empty(),                  // output wire empty.rd_data_count(rd_data_count)  // output wire [10 : 0] rd_data_count
);

这篇关于ZYNQ 调用AXI WR RD ip及其代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626683

相关文章

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O