2019.09.03

一、基础部分及语法

一、FPGA程序的固化

[USF-XSim-62] 'simulate' step failed with errors. Please check the Tcl console or log files for more information.

1、  在C语言代码中,行结尾反斜杠\ 起到换行作用,用于宏定义和字符串换行。其中宏定义使用居多。如果一行中有很多元素导致太长影响阅读,可以在结尾加 \ 的方式实现换行,编译时会忽略\以及其后的换行符,当做一行处理。………\就是表示一行不间断。

2、  关于各种电压:

VCCINT:内部PL核心电压

VCCAUX:辅助PL电压

VCCBRAM:PL BRAM电压

VCCPINT:PS内部核心电压

VCCPAUX:PS辅助电压

VCCDDR:DDR RAM的工作电压

VREFP:XADC正参考电压

VREFN:XADC负参考电压

3、

#ifdef __cplusplus

Extern “C”{

#endif

代码说明:

为了在C++代码中调用用c写成的库文件,就需要用extern”C”来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。

二、断言函数

#define Xil_AssertNonvoid(Expression)             \

{                                                  \

if (Expression) {                              \

Xil_AssertStatus = XIL_ASSERT_NONE;       \

} else {                                       \

Xil_Assert(__FILE__, __LINE__);            \

Xil_AssertStatus = XIL_ASSERT_OCCURRED;   \

return 0;                                  \}}

这个assert宏将用于返回值的函数,与Xil_AssertWait boolean进行容纳测试,以便失败的断言继续执行。

一旦参数错误,将会执行  Xil_Assert(__FILE__, __LINE__);

Xil_AssertStatus =XIL_ASSERT_OCCURRED;

他只需设置Xil_AssertStatus标志,并将错误位置信息转换为指定的路由。

其中XIL_Assert的代码为

void Xil_Assert(const char *File, int Line)

{

/* if the callback has been set then invoke it */

if (Xil_AssertCallbackRoutine != 0) {

(*Xil_AssertCallbackRoutine)(File, Line);

}

/* if specified, wait indefinitely such that the assert will show up in testing  */

while (Xil_AssertWait) {

}

}

一旦路由(route)等于0,即进行无限循环。

中断的结束到底是怎么返回的?

SDK函数库中在xil_assert文件中定义了两种函数返回的方式。

第一种:

typedef void (*Xil_AssertCallback) (const char8 *File, s32 Line);

此处通过typedef定义了一个指针,该指针指向的数据类型为一个文件地址和一个操作属性。该定义在库中的说明是:

This data type defines a callback to be invoked when an assert occurs. The callback is invoked only when asserts are enabled

意思是次数据类型定义在发生断言时要调用的回调,只有在启用Assert时才会调用回调。

这个定义在void Xil_AssertSetCallback(Xil_AssertCallback Routine) {

Xil_AssertCallbackRoutine = Routine;

};中进行引用,该函数的传入参数是Xil_AssertCallback类型的参数,参数Routine是一个指针,改指针所指向的地址寄存器中包含中文件(即主函数中上次执行的位置)和操作类型(Line)。对于赋值的Xil_AssertCallbackRoutine将在

void Xil_Assert(const char8 *File, s32 Line)

{

/* if the callback has been set then invoke it */

if (Xil_AssertCallbackRoutine != 0) {

(*Xil_AssertCallbackRoutine)(File, Line);

}

/* if specified, wait indefinitely such that the assert will show up

* in testing

*/

while (Xil_AssertWait != 0) {

}

}

中进行判断,该值就是一个进程的位置和操作属性的存储位置的指针。如果指针不为NULL,则toggle to该指针指向的位置按照操作说明进行对应的操作。

接下来,该函数在

#define Xil_AssertNonvoid(Expression)             \

{                                                  \

if (Expression) {                              \

Xil_AssertStatus = XIL_ASSERT_NONE;       \

} else {                                       \

Xil_Assert(__FILE__, __LINE__);            \

Xil_AssertStatus = XIL_ASSERT_OCCURRED;   \

return 0;                                  \

}                                              \

}

中进行调用,如果传入的expression==1则断言状态变量为0,否则为1。但是,需要注意的是:Xil_Assert(__FILE__, __LINE__);由于没有有效的文件名称和操作属性传入,程序会在该函数中无限循环,不要被后面的return 0骗了,后面的语句是在test条件下才会有的,所以,如果传入的表达式是false,则程序无限循环。

以上即为AssertNonvoid(expression)函数的原理!

三、IIC配置与实现

3.1 Ps(programming system)IIC 初始化

入口参数: 配置实例地址和设备ID

3.1.1 配置与复位

实例初始化配置完毕之后,复位IIC设备使其进入初始化状态,设备配置在初始化完成之后,设备启动之前进行。

-------XIixPs_Reset()函数

1、  中止正在进行的所有传输__XiixPs_Abort()

(1)、读取IIC中断屏蔽寄存器IMR,地址(0xe0004000+0x20)

(2)、写中断禁用寄存器IDR,地址(0xe0004000+0x28),在中断禁用寄存器设置一个位,设置中断掩码寄存器中的相应位,有效的禁用要生成的相应中断。

(3)、写中断控制寄存器ICR,地址(0xe0004000+0x00),写入0x40,复位控制寄存器并将fifi初始化为0,清除传输寄存器,设置后将在下一个APB时钟自动清除。

(4)、读中断状态寄存器ISR,地址(0xe0004000+0x10),再写入该寄存器防止中断挂起

(5)、恢复中断状态,由于已经读取了中断掩码寄存器,掩码寄存器为1的位对应的中断不能使能,所以对掩码寄存器的允许的中断对应的位即为0,进行去反操作写入中断使能寄存器,从而有效的产生对应中断。

 

inclusion

在进行复位之前要先终止所有的数据传输,这里的传输不仅仅是清除fifo,还有防止有突发中断的产生,所以首先读取中断掩码寄存器,该寄存器中为1的位禁止对应的中断,然后再读取清除fifo,然后再读取中断状态寄存器再写入防止中断悬空,最后使能中断,使能的是中断掩码寄存器允许的位,最后退出。

2、寄存器写操作

2.1 复位中断控制寄存器

2.2复位中断超时寄存器

2.3 复位所有中断使能寄存器(全部禁止)

-------XiicPs_SelfTest()

此函数用于中断控制寄存器和中断掩码寄存器是否为默认值,读取完毕之后进行比较,比较成功之后再写入控制、超时、使能寄存器,因为读取的时候对应寄存器的显示电平状态可能发生了改变,所以要再写一次。

最后再写入、读取一次,再写入,这次写入的寄存器为从设备暂停寄存器,需单独写入配置,最后在进行复位操作。

-------XiicPs_SetSclk( )

传入参数为(I2C_Ptr,IIC_SCLK_RATE),,输入实例和理想baudrate

Include:

主要是寄存器的初始化为中断配置,然后进行自检测,最后设置BAUDRATE。

四、AXI(Advanced eXtensible Interface)

一、模块信号

输入信号

输入信号

信号名

功能描述

S00_axi_aclk

总线信号

Axi_aresetn

总线复位,低电平有效

xilinx基础入门的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. 「译」JUnit 5 系列:基础入门

    原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...

  3. .NET正则表达式基础入门

    这是我第一次写的博客,个人觉得十分不容易.以前看别人写的博客文字十分流畅,到自己来写却发现十分困难,还是感谢那些为技术而奉献自己力量的人吧. 本教程编写之前,博主阅读了<正则指引>这本入门 ...

  4. 从零3D基础入门XNA 4.0(2)——模型和BasicEffect

    [题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...

  5. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  6. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  7. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  8. [Spring框架]Spring AOP基础入门总结一.

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  9. RobotFramework - 基础入门

    Robot Framework Wiki HomePage Robot Framework User Guide Robot Framework documentation Robot Framewo ...

随机推荐

  1. BZOJ 2217: [Poi2011]Lollipop 构造 + 思维

    Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T").现在有m个询问,每个询问是询问有没有一个连 ...

  2. 修改apache2配置,禁止目录访问+禁止访问.git文件夹

    通过url访问服务器,无论是本地服务器还是远程服务器 如果你的文件根目录里有 index.html,index.php,浏览器就会显示 index.html的内容,如果没有 index.html,浏览 ...

  3. [CSP-S模拟测试]:新的世界(BFS)

    题目背景 小学五六年级的乔猫是一个喜欢不务正业写游戏的孩纸$......$他曾经模仿著名的沙盒游戏<$Minecraft$>做过一个自己的游戏$"NEWorld"$.这 ...

  4. 8.并发编程--多线程通信-wait-notify-模拟Queue

    并发编程--多线程通信-wait-notify-模拟Queue 1. BlockingQueue 顾名思义,首先是一个队列,其次支持阻塞的机制:阻塞放入和获取队列中的数据. 如何实现这样一个队列: 要 ...

  5. 事务的ACID属性

    事务,一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的整体. ACID为事务的四大属性 原子性(Atomic):指整个数据库事务是不可分割的工作单位.只有使据库中所有的操作执行成功,才 ...

  6. C#调用C++的库 P/Invoke工具集

    p/Invoke可以使用工具辅助自动生成,以减少混淆 1.官方的支持 http://visualstudiogallery.msdn.microsoft.com/site/search?query=p ...

  7. Git-Runoob:Git 创建仓库

    ylbtech-Git-Runoob:Git 创建仓库 1.返回顶部 1. Git 创建仓库 本章节我们将为大家介绍如何创建一个 Git 仓库. 你可以使用一个已经存在的目录作为Git仓库. git ...

  8. 安装 Windows 系统在 NVMe 规范的 M.2 接口的固态硬盘(SSD)上

    作为一个程序员很重要的一项技能就是装系统 @_@,以前我都是随便用网上的工具做个系统盘,每次要用直接随手就搞好了,节省大家时间. 但最近同事装了个贼小的固态,然后我启动盘里的系统果断识别不出来他的固态 ...

  9. 阶段3 1.Mybatis_11.Mybatis的缓存_2 延迟加载和立即加载的概念

    用户关联的account信息,假设一个用户管理的account有100个.那么我们在查询用户的时候那100个关联的信息也被查询出来. 用的时候才去查关联的数据 这两个不同的地方就是查询的时机不同 什么 ...

  10. Python学习之==>函数

    一.函数是什么: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用函数名就行. 二.函数的作用: 1.简化代码 2.提高代码的复用性 3.代码可扩展 三.定义函数: ...