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 switch
	asfifo_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) begin
	  if(M_AXI_ARESETN == 1'b0) begin
	      burst_start <= 1'b0;
	  end
	  else if (rd_data_count >='d256 && axi_wvalid == 1'b0 && axi_awvalid == 1'b0) begin
	      burst_start <= 1'b1;
	  end
	  else begin
	  	  burst_start <= 1'b0;
	  end

	end

	always @(posedge M_AXI_ACLK) begin
		if(M_AXI_ARESETN == 1'b0) begin
			axi_awvalid <= 1'b0;
		end
		else if (axi_awvalid == 1'b1 &&M_AXI_AWREADY == 1'b1) begin
			axi_awvalid <= 1'b0;
		end
		else if (burst_start == 1'b1 && axi_awvalid == 1'b0 && axi_wvalid == 1'b0) begin
			axi_awvalid <= 1'b1;
		end
	end

	always @(posedge M_AXI_ACLK) begin
	  if(M_AXI_ARESETN == 1'b0) begin
	    	axi_awaddr <= 'd0;
	  end
	  else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1 && axi_awaddr == 'd8292352) begin
	  		axi_awaddr <= 'd0;
	  end
	  else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1) begin
	    	axi_awaddr <= axi_awaddr + 'd2048;
	  end
	end

	always @(posedge M_AXI_ACLK) begin
	  if(M_AXI_ARESETN == 1'b0) begin
	    	axi_wvalid <= 1'b0;
	  end
	  else if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && burst_cnt == 'd255) begin //burst end
	  		axi_wvalid <= 1'b0;
	  end
	  else if (M_AXI_AWREADY == 1'b1 && axi_awvalid == 1'b1) begin
	    	axi_wvalid <= 1'b1;
	  end
	end

	always @(posedge M_AXI_ACLK) begin
	  if(M_AXI_ARESETN == 1'b0) begin
	      burst_cnt <='d0;
	  end
	  else if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && burst_cnt == 'd255) begin
	  	  burst_cnt <= 'd0;
	  end
	  else if (M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1) begin
	      burst_cnt <= burst_cnt + 1'b1;
	  end
	end

	always @* begin
		if(M_AXI_WREADY == 1'b1 && axi_wvalid == 1'b1 && burst_cnt == 'd255) begin
			axi_wlast <= 1'b1;
		end
		else begin
			axi_wlast <= 1'b0;
		end
	end

	always @* begin
	  	axi_wdata = fifo_rd_data;
	end

	always @(posedge M_AXI_ACLK) begin
	  if(M_AXI_ARESETN == 1'b0) begin
	      axi_bready <= 1'b0;
	  end
	  else begin
	  	  axi_bready <= 1'b1;
	  end
	end

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

reg	[7:0]rx_Cnt;

always @(posedge M_AXI_ACLK) begin 
	if (M_AXI_ARESETN == 0 ) begin                                                                    
         axi_arvalid<=1'b0;                                     
     	end
    else if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1)begin
          axi_arvalid<=1'b0;                                                                           		
    end                                                                               
    else if(rd_data_count<=1024 && axi_arvalid==1'b0 && axi_rready==1'b0 ) begin  
         axi_arvalid<=1'b1;                                           
      end                                                                      
  end

always @(posedge M_AXI_ACLK) begin 
	if (M_AXI_ARESETN == 0 ) begin                                                                    
        axi_araddr<='d0;                                 
     	end
    else if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1 && axi_araddr=='d8292352)begin
        axi_araddr<='d0;                                                                            		
    end                                                                             
    else if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1) begin  
        axi_araddr<=axi_araddr+'d2048;                                           
      end                                                                      
  end

always @(posedge M_AXI_ACLK) begin 
	if (M_AXI_ARESETN == 0 ) begin                                                                    
         axi_rready<=1'b0;                                     
     	end
    else if(M_AXI_RVALID==1'b1 && M_AXI_RREADY==1'b1 && rx_Cnt=='d255)begin
        axi_rready<=1'b0;                                                                              		
    end                                                                               
    else if(axi_arvalid==1'b1 && M_AXI_ARREADY==1'b1) begin  
        axi_rready<=1'b1;                                          
      end                                                                      
  end

always @(posedge M_AXI_ACLK) begin 
	if (M_AXI_ARESETN == 0 ) begin                                                                    
         rx_Cnt <= 'd0;                                     
     	end
    else if(M_AXI_RVALID==1'b1 && M_AXI_RREADY==1'b1 && rx_Cnt=='d255)begin
        rx_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 here

fifo_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
);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言从入门到实战——编译和链接

编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中&#xff0c;编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…

【Linux】信号量基于环形队列的生产消费模型

信号量 信号量的本质是一个计数器&#xff0c;可以用来衡量临界资源中资源数量多少 信号量的PV操作 P操作&#xff1a;申请信号量称为P操作&#xff0c;P操作的本质就是让计数器减1。 V操作&#xff1a;释放信号量称为V操作&#xff0c;V操作的本质就是让计数器加1 POSIX信号量…

phpmyadmin 创建服务器

phpmyadmin默认的服务器是localhost 访问setup&#xff0c;创建新的服务器 添加服务器信息 点击应用&#xff0c;服务器创建成功 下载配置文件config.inc.php&#xff0c;放到WWW目录下 可再次访问setup&#xff0c;发现已配置过了 访问登录页面&#xff0c;发现可选…

x-cmd pkg | yt-dlp - 专注于 YouTube 的下载工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 yt-dlp 是一款强大的命令行下载工具&#xff0c;专注于下载 YouTube 视频和音频。它是 youtube-dl 的一个改进和拓展版本&#xff0c;提供了更多功能和修复了一些问题。 yt-dlp 具有灵活的支持&#xff0c;可下载 Yo…

用Jmeter进行性能测试

项目背景 我们的平台为全国某行业监控平台&#xff0c;经过3轮功能测试、接口测试后&#xff0c;98%的问题已经关闭&#xff0c;决定对省平台向全国平台上传数据的接口进行性能测试。01测试步骤1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c;只参与了其中3个模块…

HTTP 协议和 TCP/IP 协议之间有什么区别?

HTTP&#xff08;超文本传输协议&#xff09;和TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是两种在互联网通信中广泛使用的协议&#xff0c;它们之间的区别和联系对许多人来说可能还不是很清晰&#xff0c;今天我们就带大家来一起了解一下HTTP和TCP/IP协议这2者之…

用C语言实现简单的三子棋游戏

目录 1 -> 模块简介 2 -> test.c 3 -> game.c 4 -> game.h 1 -> 模块简介 test.c:测试游戏逻辑 game.c: 函数的实现 game.h:函数的声明 2 -> test.c #define _CRT_SECURE_NO_WARNINGS 1#include "game.h";void menu() {printf("****…

使用Element中的input组件如何实现文字和输入框在一行显示

利用 <el-form-item label"商品名称&#xff1a;">标签包裹即可&#xff0c;label写提示文字 <el-form ref"form" label-width"100px"><el-form-item label"商品名称&#xff1a;"><el-input v-model"na…

redis-exporter监控部署(k8s内)tensuns专用

reidis-exporter服务需要用到configmap、service、deployment服务 创建存放yaml目录 mkdir /opt/redis-exporter && cd /opt/redis-exporter 编辑yaml配置文件 vi configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-confnamespace: monitorlab…

面试题 05.06. 整数转换(力扣)(OJ题)

题目链接&#xff1a;面试题 05.06. 整数转换 - 力扣&#xff08;LeetCode&#xff09; 所属专栏&#xff1a;刷题 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。 示例1: 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15…

鸿蒙 HarmonyOS ArkTS ArkUI 动画 中心缩放、顶部缩放、纵向缩放

EntryComponentstruct Index {State widthA: number 200State heightA: number 200onPageShow():void{animateTo ( {duration: 2000,iterations: -1,curve:Curve.Linear}, () > {this.widthA 0this.heightA 0} )}build() {Column() {// 中心缩放Column(){}.width(this.wi…

Python中二维数据(数组、列表)索引和切片的Bug

Python中有关数据结构索引和切片引起的Bug 一维数据索引和切片一维数组一维列表 二维数据的索引和切片二维数组二维(错误)列表 一维数据索引和切片 一维数组 对于一维数据进行索引和切片操作&#xff0c;大家都比较熟悉通过下面代码进行实现 import numpy as np data np.ra…

网络文件共享ftp

一&#xff0c;存储类型 &#xff08;一&#xff09;三种存储类型介绍 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 直连&#xff1a;硬盘加服务器 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#…

vue3 + antd 封装动态表单组件(一)

前置条件&#xff1a; vue版本 v3.3.11 ant-design-vue版本 v4.1.1 创建动态组件配置文件config.js import { Input, Textarea, InputNumber, Select, RadioGroup, CheckboxGroup, DatePicker } from ant-design-vue;// 表单域组件类型 export const componentsMap {Text: …

还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

本文会给大家介绍如何在WordPress上安装一个插件&#xff0c;实现将notion上写的文章自动同步到WordPress上&#xff0c;从而提高写作效率&#xff0c;接下来请跟随我的脚步一起来操作吧&#xff01; 一、插件安装 在WordPress后台添加新插件页面中搜索“notion”&#xff0c;…

实验六 模式对象管理与安全管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Matplotlib Mastery: 从基础到高级的数据可视化指南【第30篇—python:数据可视化】

文章目录 Matplotlib: 强大的数据可视化工具1. 基础1.1 安装Matplotlib1.2 创建第一个简单的图表1.3 图表的基本组件&#xff1a;标题、轴标签、图例 2. 常见图表类型2.1 折线图2.2 散点图2.3 条形图2.4 直方图 3. 图表样式与定制3.1 颜色、线型、标记的定制3.2 背景样式与颜色…

Linux——进程等待

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、为什么要进程等待二、进程等待的方法1、wait方法2、waitpid方法 三、获取子进程status 一…

2008年苏州大学837复试机试C语言

2008年苏州大学复试机试C 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0&#xff0c;X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充&#xff1a;个人觉得这个题目回…

【51单片机】矩阵按键

0、前言 参考&#xff1a;普中 51 单片机开发攻略 1、硬件 2、软件 main.c #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define GPIO_KEY P1 #d…