PL_to_PS中断传输数据

embedded/2024/10/20 11:28:22/

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_12">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.ppmy.cn/embedded/8880.html

相关文章

Redis中的订阅发布和事务(一)

订阅发布 PUBSUB NUMSUB PUBSUB NUMSUB [channel-1 channel-2… channel-n]子命令接受任意多个频道作为输入参数&#xff0c;并返回这些频道的订阅者数量。 这个子命令是通过pubsub_channels字典中找到频道对应的订阅者链表&#xff0c;然后返回订阅者链表的长度来实现的(订阅…

【Hadoop大数据技术】——Azkaban工作流管理器(学习笔记)

&#x1f4d6; 前言&#xff1a;在前面HDFS分布式文件系统中&#xff0c;我们使用Linux自带的Crontab&#xff08;定时任务工具&#xff09;来定时调度任务&#xff0c;但是当业务规模变大并且需要可视化监控任务执行的时候&#xff0c;Crontab就已经不能满足这些需求了。为此&…

北大字节联合发布视觉自动回归建模(VAR):通过下一代预测生成可扩展的图像

北大和字节发布一个新的图像生成框架VAR。首次使GPT风格的AR模型在图像生成上超越了Diffusion transformer。 同时展现出了与大语言模型观察到的类似Scaling laws的规律。在ImageNet 256x256基准上,VAR将FID从18.65大幅提升到1.80,IS从80.4提升到356.4,推理速度提高了20倍。 相…

牛客Linux高并发服务器开发学习第二天

Gcc编译 利用gcc 生成应用时如果不加-o 和应用名&#xff0c;默认生成a.out 可以用./ a.out打开 Gcc工作流程 可执行程序Windows系统中为.exe Linux系统中为.out g也可以编辑c程序 gcc也可以编译cpp代码&#xff0c;只是在编译阶段gcc不能自动共和C程序使用的库进行联接&…

python--pyQt5 进度条:QProgressBar

https://www.cnblogs.com/itwangqiang/articles/14959401.html https://blog.csdn.net/weixin_43990846/article/details/123880081 进度条用于向用户指示操作的进度&#xff0c;并向他们保证应用程序仍在运行 例 1 import sys from PyQt5.QtWidgets import QApplication, QWi…

2024蓝桥杯每日一题(最大公约数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;公约数 试题二&#xff1a;最大公约数 试题三&#xff1a;等差数列 试题四&#xff1a;最大比例 试题五&#xff1a;Hankson的趣味题 试题一&#xff1a;公约数 【题目描述】 …

“卫星-无人机-地面”遥感数据快速使用及地物含量计算的实现方法

原文链接&#xff1a;“卫星-无人机-地面”遥感数据快速使用及地物含量计算的实现方法https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601940&idx6&sn515e01666037570939aaf0eee56f46d1&chksmfa820ef3cdf587e5276eac181c890026b6ca4bc36ce0e4f80d89d…

机器学习-11-基于多模态特征融合的图像文本检索

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像文本检索技术。此技术把自然语言处理和图像处理进行了融合。 参考 2024年&#xff08;第12届&#xff09;“泰迪杯”数据挖掘挑战赛 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&…