PL_to_PS中断传输数据

PL_to_PS中断传输数据

实验功能:将PL端的数据存入BRAM,然后在PS端读出数据,用串口打印。通过中断来触发

参考文章:

https://www.cnblogs.com/fhyfhy/p/11760986.html

[ZYNQ_PS与PL通过BRAM交互(三:PSPL读写) - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/661468152)

PL的BD配置

ZYNQ勾选上中断

在这里插入图片描述

ZYNQ:

在这里插入图片描述

BRAM写入数据

我的工程是将ADC采集的数据进行信号处理,然后写入BRAM传输到PS端进行下一步的处理核分析。

在这里插入图片描述

如上图所示,是将数据写入BRAM中的步骤。其中bram_ctrl_0是我自己写的一个模块,它的功能是将数据写入BRAM,并且我加了中断,检测到上升沿启动写过程时,产生一个脉冲中断信号。

bram_ctrl代码如下:

module bram_ctrl(input       clk,input 		rst_n,input		valid,input    	[31:0]	in_data,	//写入的数据output   	[31:0]	addrb,output reg 	[31:0]	dinb ,output reg 	[3:0] 	web  ,output reg			PL_IRQ0		//脉冲中断信号); 
/************** 		 **************/	
/**************    信号定义      **************/
/************** 		 **************/		//PL写RAMwire [31:0]AddrEndValueVio; //控制写的地址范围wire [31:0]dinbValueVio;	//控制写的数据数值wire [3:0] webVio;			//控制写的有效字节位wire [0:0] valid;		//启动写数据reg [0:0]valid1;//对writeEnVio延迟一个clkreg [0:0]wrState;    //写数据状态:0代表IDLE.1代表正在写reg [31:0]addrbWrite;//写数据地址//Ohter signalsassign    addrb = wrState?addrbWrite:32'd0;reg  [0:0]wrStateReg;/**************			  **************/		
/**************    PL 写入BRAM    **************/		
/**************			  **************/			always@(posedge clk)beginif(!rst_n)beginvalid1 <= 1'b0;	end else beginvalid1 <= valid;		end
endalways@(posedge clk)beginif(!rst_n)begindinb[31:0]        <= 32'd0;web[3:0]          <=  4'd0;wrState           <= 1'b0;addrbWrite[31:0]  <= 32'd0;end else begin case(wrState)1'b0:if(valid&~valid1)begin//边沿检测,检测到上升沿启动写过程	wrState           <= 1'b1;web[3:0]          <= 4'b1111;addrbWrite[31:0]  <= 32'd0;dinb[31:0]        <= in_data[31:0];	end else beginwrState           <= wrState;web[3:0]          <= 4'd0;addrbWrite[31:0]  <= 32'd0;dinb[31:0]        <= 32'd0;end1'b1:if(addrbWrite[31:0] >= 32'd2012)beginwrState[0:0]      <= 1'b0;web[3:0]          <= 4'd0;addrbWrite[31:0]  <= 32'd0;dinb[31:0]        <= 32'd0;endelse beginwrState[0:0] <= wrState[0:0];web[3:0]     <= 4'b1111;addrbWrite[31:0]  <= addrbWrite[31:0] + 32'd4;// dinb[31:0]   <= in_data[31:0];//写入每个地址相同数据//dinb[31:0]   <= dinb[31:0] + 32'd1;   //写入每个地址数据累加1dinb[31:0]   <= dinb[31:0];   //保持endendcaseend
end//中断
always@(posedge clk)beginif(!rst_n)beginPL_IRQ0 <= 1'b0;	end else if(valid&~valid1) beginPL_IRQ0 <= 1'b1;		endelse PL_IRQ0 <= 1'b0;
endendmodule

代码解释:一共有三个always语句块。

第一个是将valid寄存一个拍,为了后续的边沿检测。

第二个是数据写入,用了一个状态机。if(valid&~valid1) 当检测到valid的上升沿时,开始写入数据。

第三个是产生一个中断信号PL_IRQ0。由valid的上升沿触发产生。

以上是PL端的工作,下面是PS的工作


PS 代码思路解释

建立项目的模板选用《Hello World》

将主函数修改为:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xparameters.h"
#include "xparameters_ps.h"
#include <xil_io.h>#define  INTC_DEVICE_ID          XPAR_SCUGIC_0_DEVICE_ID
#define ADC0_BRAM_ADDR       XPAR_ADC0_AXI_BRAM_CTRL_0_S_AXI_BASEADDR
#define ADC1_BRAM_ADDR       XPAR_ADC1_AXI_BRAM_CTRL_0_S_AXI_BASEADDRstatic XScuGic INTCInst;static void SW0_intr_Handler();static int IntcInitFunction(u16 DeviceId);// 中断服务函数
void psReadBram()
{int ADC0_data;int ADC1_data;printf("Interrupt detected!\r\n");printf("This is psReadBram function\r\n");ADC0_data = Xil_In32(ADC0_BRAM_ADDR + 4);ADC1_data = Xil_In32(ADC1_BRAM_ADDR + 4);printf("ADC0_data:%d \r\n",ADC0_data);printf("ADC1_data:%d \r\n",ADC1_data);
}int IntcInitFunction(u16 DeviceId)
{XScuGic_Config *IntcConfig;int status;// Interrupt controller initialisationIntcConfig = XScuGic_LookupConfig(DeviceId);status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);if(status != XST_SUCCESS) return XST_FAILURE;// Call to interrupt setupXil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&INTCInst);Xil_ExceptionEnable();// Connect PL interrupt to handlerstatus = XScuGic_Connect(&INTCInst,XPS_FPGA0_INT_ID,(Xil_ExceptionHandler)psReadBram,(void *)1);if(status != XST_SUCCESS) return XST_FAILURE;// Set interrupt type of PL to rising edgeXScuGic_SetPriorityTriggerType(&INTCInst, XPS_FPGA0_INT_ID, 0x00, 0x03);// Enable PL interrupts in the controllerXScuGic_Enable(&INTCInst, XPS_FPGA0_INT_ID);return XST_SUCCESS;
}int main()
{init_platform();IntcInitFunction(INTC_DEVICE_ID);RF_init();while(1);cleanup_platform();return 0;
}

代码解释:一个中断函数 IntcInitFunction;一个中断服务函数 psReadBram;一个主函数 main

其中main函数中的 RF_init(); 是我的ADC采集初始化函数。

#define ADC0_BRAM_ADDR       XPAR_ADC0_AXI_BRAM_CTRL_0_S_AXI_BASEADDR
#define ADC1_BRAM_ADDR       XPAR_ADC1_AXI_BRAM_CTRL_0_S_AXI_BASEADDR

这两个宏定义是两个BRAM的地址。(我用了两个ADC,写入两个BRAM中)

在中断服务函数psReadBram中,我将ADC0_BRAM_ADDR + 4 该地址的数据读出来赋值给ADC0_data,然后打印出来。

结果

ILA抓取信号

在这里插入图片描述

如上图,框起来的就是中断信号,它检测到valid信号的上升沿后,拉高一个高电平。

并且可以看出,此时写入BRAM的数据 ADC1_atan_out 为 -843314201

PS串口打印信息

在这里插入图片描述

满足功能!

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

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

相关文章

MyBatis 框架学习(II)

MyBatis 框架学习(II) 文章目录 MyBatis 框架学习(II)1. 介绍2. 准备&测试2.1 配置数据库连接字符串和MyBatis2.2 编写持久层代码 3. MyBatis XML基础操作3.1 Insert 操作3.2 Delete 操作3.3 Update 操作3.4 Select 操作 4. #{} 与 ${}的使用5. 动态SQL操作5.1 < if >…

去除图像周围的0像素,调整大小

在做分割任务时&#xff0c;经常需要处理图像&#xff0c;如果图像周围有一圈0像素&#xff0c;需要去除掉&#xff0c;重新调整大小 数组的处理 如果图像的最外一圈为0&#xff0c;我们将图像最外圈的图像0去除掉。 import numpy as npdef remove_outer_zeros(arr):# 获取数…

纠正对CAN的错误认识

STM32CUBEMX系列——CAN通讯的配置_stm32cubemx 配置103 can-CSDN博客 STM32之CAN通信_stm32 can通信-CSDN博客 在回环模式下&#xff0c;发送的数据帧会在控制器内部被立即接收&#xff0c;而不会通过总线传播到其他节点。这种模式可以确保在没有其他节点干扰的情况下&#…

AI边缘计算盒子+ThingSense管理平台,推动明厨亮灶智慧监管新篇章

背景随着“互联网”时代的浪潮汹涌而至&#xff0c;国家及各地政府纷纷在“十四五”规划中明确指出&#xff0c;强化食品安全管理&#xff0c;利用技术手段实现智慧监管是刻不容缓的任务。为此&#xff0c;各地正加速推进“互联网明厨亮灶”的建设步伐&#xff0c;实现系统对接…

C# 使用 ThoughtWorks.QRCode 生成二维码

目录 关于 ThoughtWorks.QRCode 开发运行环境 方法设计 代码实现 调用示例 Logo图标透明化 小结 关于 ThoughtWorks.QRCode 二维码是用某种特定的几何图形按一定规律在平面分布的、黑白相间的、记录数据符号信息的图形&#xff0c;在应用程序开发中也被广泛使用&#x…

vue+node使用RSA非对称加密,实现登录接口加密密码

背景 登录接口&#xff0c;密码这种重要信息不可以用明文传输&#xff0c;必须加密处理。 这里就可以使用RSA非对称加密&#xff0c;后端生成公钥和私钥。 公钥&#xff1a;给前端&#xff0c;公钥可以暴露出来&#xff0c;没有影响&#xff0c;因为公钥加密的数据只有私钥才…

不同分辨率下搜狗输入法输入图标过大

现象 笔记本是2k屏外接1080p显示器&#xff0c;分辨率不同导致搜狗输入法在笔记本显示器上显示正常&#xff0c;而在1080p显示器下图标很大过大&#xff0c;一打字就显得很尴尬。 解决 找到以上三个可执行文件&#xff0c;分别右键打开属性-->兼容性-->更改高DPI设置 按…

安装nvm管理node版本

准备工作 卸载电脑上原有的nodejs&#xff0c;卸载后确保相关的文件夹也删除掉&#xff0c;否则会在nvm安装成功后管理node版本时造成冲突&#xff0c;例如执行nvm use 20.5.0时报exit status 145的错误。原本就没有安装过node的不用管 一、nvm的安装及使用 1、下载nvm&…

SS-Net复现

表1 8 labeled 样本复现结果–Dice&#xff1a;88.540501&#xff0c;Jaccard&#xff1a;79.60452&#xff0c;95HD&#xff1a;7.58588897&#xff0c;误差在可接受范围内 表2 7 labeled 样本复现结果–Dice&#xff1a;86.778431&#xff0c;Jaccard&#xff1a;77.665895&…

算法思想总结:栈

一、栈的经典应用&#xff1a;波兰表达式与逆波兰表达式 我们平时看到的 12*&#xff08;3-4*5&#xff09;6/7 叫做中缀表达式&#xff0c;平时我们习惯用这个计算的原因是我们可以整体地去看到这个表达式并且清楚地知道各个运算符的优先级&#xff0c;但是计算机并不一定知道…

微信小程序四(全局配置和页面配置页面跳转)

全局配置&#xff1a; 小程序根目录下的 app.json 文件用来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等 tabBar设置&#xff1a;最少两个最多5个 "tabBar": {"list":[{"pagePath": &qu…

“饕餮之路:贪吃蛇编程精粹“

目录 前言 1.写代码前的预准备 1.1修改控制台 1.2相关WinAPI32知识学习 1.2.1WinAPI32介绍 1.2.2 mode 命令 1.2.3 title 命令 1.2.4COORD 1.2.5GetStdHandle 1.2.6对控制台光标进行设置 1.2.6.1GetConsolrCursorInfo 1.2.6.2 CONSOLE_CURSOR_INFO 1.2.6.3SetConsol…

vos3000外呼系统客户端无法安装如何解决?

如果 VOS3000 外呼系统客户端无法安装&#xff0c;可以尝试以下解决方法&#xff1a; 检查系统要求&#xff1a; 确保你的计算机满足 VOS3000 外呼系统客户端的系统要求&#xff0c;包括操作系统版本、内存、处理器等。如果系统不符合要求&#xff0c;可能会导致安装失败或者运…

c语言中,数组取地址的书写格式

数组取地址 为了更好的区分数组取地址时的情况&#xff0c;我们建立两个数组&#xff0c;arr1一维数组和arr2二维数组&#xff0c;用printf函数来打印出每个例子arr1和arr2的地址&#xff0c;这样可以更加直观的区分出来。 首先我们看到第一组打印&#xff0c;可以看到若是直接…

Qt图片等资源管理

Qt的图片等资源管理通常有两种方式 1&#xff0c;直接将图标和一些配置文件打包在可执行程序中 添加qrc文件&#xff0c;可使用qtcreator直接添加 右键选中工程 点击选择即可。 然后添加文件。我这个例子是添加了Image文件夹下的图片资源 使用的时候&#xff0c;可以在代码…

TCP/IP协议(二)

一、TCP-选项 1.简介 在TCP/IP报文中&#xff0c;固定头部下边就是 "选项"部分。 (1)TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计的 (2)大多数的TCP选项部分出现在TCP连接建立阶段 2.构成 2.1 最大报文传输段 最大报文传输段(Ma…

Java面试八股之简述Servlet体系结构

简述Servlet体系结构 Servlet是Java Web开发中的核心组件&#xff0c;用于接收和响应HTTP请求&#xff0c;生成动态内容。它具有平台无关性、协议无关性和动态内容生成能力&#xff0c;遵循明确的生命周期。尽管现代Web开发中更多使用高级框架&#xff0c;但Servlet作为基础&a…

【SAP ME 18】SAP ME创建开发组件ear

1、说明 SC开发组件ear项目是所有sap me二次开发项目的编译入和部署入口,通过ear可以有效的针对子项目的编译和部署 2、创建开发组件

【MATLAB源码-第190期】基于matlab的32QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

云打印怎么下单?网上云打印下单教程来了!

近些年来&#xff0c;随着移动互联网的发展&#xff0c;云打印也越来越火热。如今有越来越多的用户选择云打印服务。但是现在仍有很多不知道如何下单。那么云打印怎么下单呢&#xff1f;今天小易就来和大家介绍一下网上云打印的下单教程。 云打印怎么下单&#xff1f;网上云打印…