基于ZYNQ的中断的使用(2)_朽月的博客-程序员宅基地

技术标签: fpga  FPGA  

参考文献

[1].V3学院

项目简述

前面的一篇文章我们已经讲解了ZYNQ中软中断的使用,通过学习CPU之间的相互中断,我们已经学习了软中断,那么接下来我们将进行共享中断的学习,从上一篇文章我们可知,共享中断主要分为两类:PL给CPU的中断,PS的IO中断。这里提醒读者一定要看上一篇文章,否则学习会特别困难。

工程描述:PL每隔1s发起中断信号,PS接收终端并通过串口打印信息。

本次实验所用到的软硬件环境如下:
1、VIVADO 2019.1
2、米联客MZ7015FA开发板

共享中断简述

这里为了清晰表述,再次引入中断分类:
在这里插入图片描述
从上面可以看出共享中断分为PL的中断和PS的IO中断,然后下面的共享中断的详细情况:
在这里插入图片描述
其实这里博主说明,PL共享中断的初始化与软中断的初始化除了中断编号不同完全一摸一样,我们甚至连代码都没进行相应的更改。这里还有一点不一样,软中断的触发是由CPU掉一哦那个函数触发的,而PL端的共享中断是PL端给出的信号。

PL端设计

因为这次我们使用的是PL端的共享中断,所以PL端会产生中断信号,这里需要注意这里的中断信号不要太短,太短的话PS端根本接收不到这个信号,尤其高电平触发中断的情况下,这里我们实验中中断信号拉高了200个时钟周期。代码如下:

`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// Website      : https://blog.csdn.net/zhangningning1996
// Module Name  : intr.v
// Create Time  : 2020-06-23 21:36:42
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************
module intr(
    input                   sclk            ,
    input                   rst_n           ,
    output  reg             flag            
);
 
//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================/
parameter   DELAY_1S    =   100000000-1     ;

reg                 [29:0]  cnt             ;
 
//========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
always @(posedge sclk or negedge rst_n)
    if(rst_n == 1'b0)
        cnt             <=          30'd0;
    else if(cnt == DELAY_1S) 
        cnt             <=          30'd0;
    else
        cnt             <=          cnt + 1'b1;

always @(posedge sclk or negedge rst_n)
    if(rst_n == 1'b0)
        flag            <=          1'b0;
    else if(cnt > DELAY_1S-200)
        flag            <=          1'b1;
    else
        flag            <=          1'b0;


endmodule

将上述代码进行相应的封装IP操作。
整个Block Design的设计图如下:
在这里插入图片描述
同学们这里需要注意,因为PL端我们没办法指定中断编号,所以PL共享中断默认是从61开始增加。

PS端设计

我们前面说过PL共享中断与软中断的区别,说他们两个中断初始化除了中断编号完全一摸一样,这里同学们可以对比下面的代码与上篇文章的代码进行相互验证。代码如下:

#include <stdio.h>
#include "xscugic.h"
#include "xparameters.h"
#include "sleep.h"

#define GIC_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
#define CPU0_SW_INTR 61

static XScuGic ScuGic;
static XScuGic_Config * ScuGicCfgPtr;

//initial gic & software intr
int initSwIntr();
//callback func
void cpu0IntrHandler(void * callbackref);


int main()
{
    
	int status;
	status = initSwIntr();
	if(status != XST_SUCCESS){
    
		return status;
	}

	while(1){
    


	}
    return 0;
}


int initSwIntr(){
    
	int status;
	Xil_ExceptionInit();
	ScuGicCfgPtr = XScuGic_LookupConfig(GIC_ID);
	status = XScuGic_CfgInitialize(&ScuGic,ScuGicCfgPtr,ScuGicCfgPtr->CpuBaseAddress);
	if(status != XST_SUCCESS){
    
		return status;
	}
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);
	status = XScuGic_Connect(&ScuGic,CPU0_SW_INTR,(Xil_ExceptionHandler)cpu0IntrHandler,&ScuGic);
	if(status != XST_SUCCESS){
    
			return status;
	}
	XScuGic_Enable(&ScuGic,CPU0_SW_INTR);
	Xil_ExceptionEnable();
	return XST_SUCCESS;
}


void cpu0IntrHandler(void * callbackref){
    
	printf("pl interrupt ps success! \n\r");
}

这里饿哦们只使用了一个CPU,所以这里的代码设计是比较简单的。与上面一篇文章的中断也几乎一摸一样。

测试结果

将代码下板可以观察到如下现象:
在这里插入图片描述
从上面的实验结果我们可以看出我们的PL共享中断实验成功执行,进而验证了我们实验的正确性。

总结

创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。为行业贡献及其微小的一部分。或者对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangningning1996/article/details/106946805

智能推荐

GC策略_weixin_33985507的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

java动态规划算法_南风知易✓✓✓的博客-程序员宅基地

java 动态规划算法递归算法的时间复杂度=递归的次数递归函数本身的时间复杂度*

典型电路的收集与记录__Jason^_^的博客-程序员宅基地

5V to 3V3通过AMS1117-3.3,将电压降至3V3,钽电容是必须的。蜂鸣器电路通过ss8050的NPN三极管实现对蜂鸣器的控制LED电路通过限流电阻对LED的电流和亮度进行控制。但每种颜色所配合的电阻还需实验,达到LED能亮同时又不晃眼睛的效果。...

Spinner的两种调用数据放式_faith_boys的博客-程序员宅基地

ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, mLmtdReptStr);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);mSpinner.setAd

ROS arbotix踩坑:‘rospkg‘、except UnicodeDecodeError, exc、dynamic module does not define init function_#君君#的博客-程序员宅基地_ros 安装rospkg

在执行roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch文件时,即包含arbotix模块的程序时,报错No module named ‘rospkg’ 。报错No module named 'rospkg'经过对大家文章的查看,发现基本集中在把环境配置为python3.或者安装rospkg。但是仍没有解决。查看opt/ros/melodic/lib/python2.7/dist-packages,发现根本没有ro.

面试题:实现数组扁平化_weixin_34056162的博客-程序员宅基地

什么是数组扁平化数组扁平化是指将一个多维数组变为一维数组reduce 方法实现reduce 本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:const arr1 = [1,[4,6],[8,3,[19,38]]]function flatten(arr) { return arr.reduce((result, item)=&gt; { return re...

随便推点

企业运维——从基础做起 机房的建设规划_weixin_33688840的博客-程序员宅基地

要写这篇文章之前,其实自己已经准备了很多。但是和国外的技术标准一对比。我还是不献丑了…… 这篇文章主要是各种机房建设标准的汇总索引,没什么实质性的内容,只是希望引导大家对标准化机房建设有个初步的概念,了解一下国内外的差距。 真正想向机房设计方向发展的IT人员,建议仔细看一下Facebook的开源服务器和数据中心核心技术(The Open Compu...

nginx x-sendfile下载_anjile1234567890的博客-程序员宅基地

    // 利用nginx直接下载文件,提高效率    public function download_apk_efficient($internal_file_path,$file_name){        // And redirect user to internal location        header(&quot;Content-Type: application/vn...

聊聊身份认证的那些事(开篇)_罗斯839的博客-程序员宅基地_cas流程

开篇身份认证,对于一个安全的应用来说,是第一道门槛,它为后续所有的安全措施提供了“身份”这样一个关键信息。通常每个公司会有好几个外部应用,如果每一个应用使用独立的账号体系,管理起来会非常复杂,用户也需要保存好几个账号密码,严重影响使用体验。而且公司内部的各个管理或开发系统,比如各种服务器、confluence、jira、gitlab等也都使用单独的账号,一个开发人员要记住各种纷繁杂乱的账号和密码,如果不提前保存下来,根本不可能能靠记忆完成输入。这时,如何设计一个简单易用的身份认证体系就显得尤为重要

Vscode的使用小技巧_weixin_30399821的博客-程序员宅基地

命令行启动code如果你的系统是Linux系统(我使用的是Ubuntu 16.04)这样就可以直接使用 code + filename来编辑文件(就像vi + filename)如果你的系统是MacOS 就需要在vscode里面按 command + shift + p 之后输入 shell 基本上在第一提示里面就会显示安装code,如图所示转载于:https://www.cnblo...

SpringMVC -> 转发(forward)和重定向(redirect)_欧皇小德子的博客-程序员宅基地_springmvc转发的关键字是redirect

默认写法就是转发:return的字符串将对应的前端页面转发到要求的url上配置了视图解析器的viewsresolver @RequestMapping("/hello/{a}/{b}") public String hello(@PathVariable int a, @PathVariable int b, Model model) { model.addAttribute("haha", "结果:" + (a + b)); return "hello"; }没有视图解析器

ros kinetic 自带opencv3 与 opencv 2 的兼容问题_原野寻踪的博客-程序员宅基地

问题分析自己写的系统必须基于opencv 2.x,而ros kinetic自带了opencv3的版本。于是在编译时报错:/usr/bin/ld: CMakeFiles/xxxx.cpp.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'/opt/ros/kinetic/lib/x86_64-linux-gnu/l...