0,前言

这节课程可以说手把手教程写C代码。具体看的过程不是很理解,但后来又反复看了几遍,还是可以理解的。这里进行一下课程总结。
首先这节课使用EMIO进行控制PL部分。使其数据发生变化(直接控制LED)或者是作为信号(控制LED)的计数使能。在PL部分代码如下。在PS部分首先是要有一定的C基础,这节课调用函数只是对GPIO进行初始化。然后调用相关函数或者是语句对其数据进行设置。以达到数据交互的作用。

module gpioled(input         wire        sclk        ,           //from zynq arm io 10nsinput        wire        rst         ,           //..input       wire [1:0]  armgpio     ,           //from zynq arm pin output      wire [1:0]  led                     //connect fpga pin
);
reg [26:0] div_cnt;
reg pulse_led;
//connect fpga pin
assign led[0] = armgpio[0];
assign led[1] = pulse_led;
//armgpio[1] use logic control
reg [2:0] div_cnt_ctrl;
//跨时钟域处理
always @ (posedge sclk)
begindiv_cnt_ctrl <= {div_cnt_ctrl[1:0],armgpio[1]};
end always @ (posedge sclk)
begin if(rst == 1'b1)div_cnt <= 'd0;else if(div_cnt_ctrl[2] == 1'b1)beginif(div_cnt[26] == 1'b1)div_cnt <= 'd0;else div_cnt <= div_cnt + 1'b1;end else div_cnt <= 'd0;endalways @ (posedge sclk)
beginif(rst == 1'b1)pulse_led <= 1'b0;else if(div_cnt[26] == 1'b1)pulse_led <= ~pulse_led;else pulse_led <= pulse_led;
end
wire [15:0] probe0;
assign probe0 = {div_cnt_ctrl[2],div_cnt[12:0],div_cnt[26],pulse_led
};ila_0 ila_led (.clk(sclk), // input wire clk.probe0(probe0) // input wire [15:0] probe0
);
endmodule

1,代码分析

在开始的时候,调用了两个有关的头文件。首先调用"xparameters.h"
```里面有很多的宏定义。其次就是"xgpiops.h"
文件里面有GPIO相关的函数。这里只要理解函数,就可以实现对LED的简单控制了。
首先在使用前,需要对GPIO进行初始化。

int initGpio(){GpioPsCfgPtr = XGpioPs_LookupConfig(GPIO_DEV_ID);int status;status =  XGpioPs_CfgInitialize(&GpioPs,GpioPsCfgPtr,GpioPsCfgPtr->BaseAddr);if(status != XST_SUCCESS){return status ;}XGpioPs_SetDirectionPin(&GpioPs,LED0,0x01);XGpioPs_SetDirectionPin(&GpioPs,LED1,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,LED0,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,LED1,0x01);return status ;
}

上面的就是自己定义的初始化函数。
首先先看XGpioPs_LookupConfig()这个函数。查下资料,就是说你的输入是一个设备的ID,会返回这个设备地址的指针。这个ID在头文件中可以找到。执行完这条语句。我们就得到了设备的指针。

使用的第二个函数就是
XGpioPs_CfgInitialize(&GpioPs,GpioPsCfgPtr,GpioPsCfgPtr->BaseAddr);同样进入官方手册,得到这个是为了初始化XGpioPs的。我们之前定义得对象,这里进行配置。首先输入地址,使用取地址运算符得到我们需要配置的变量的地址,就是之前那个结构体(XGpioPs GpioPs;)。第二个参数第三个参数都是我们需要配置的地址。我们提供相应的配置信息。

This typedef contains configuration information for a device.
typedef struct {u16 DeviceId;       /****< Unique ID of device** */u32 BaseAddr;     /**< Register base address */
} XGpioPs_Config;

进入查看发现这个函数返回值是一个固定的,但是这里依旧进行判断。

if(status != XST_SUCCESS){return status ;}若是不成功,返回错误信息。

接下来对每个变量的引脚方向进行设定。也就是下面这个函数。void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction)在函数文件介绍中,有关的设定可以看得很清楚。这里面还嵌套了几个函数,也是很复杂的。但我们只需要知道这个函数的功能即可。设定引脚,设定方向。这里全部是输出。因此是1

接下来进行输出使能设定。我们使两个都使能。因此这里依据提供的资料描述,进行设定。

到这里。初始化已经完成了。接下来进行主函数的编写。
首先初始化我们的GPIO。接下来直接使能我们的LED1。也就是控制我们的PL段一直计数。接着使用循环。使能我们二段LED0发生亮灭的变化。因为LED0直接和引脚挂在一起。
运行程序后发现我们的两个led灯一个一秒闪灭,一个两秒闪灭。

usleep()函数是延时函数,暂停程序运作,()里的参数决定了暂停的时间。是一百万分之1秒为基础单位的。
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xgpiops.h"      //import gpio
#include "xparameters.h"
#define GPIO_DEV_ID XPAR_PS7_GPIO_0_DEVICE_ID           //redefine device id
#define LED0 54
#define LED1 55
XGpioPs GpioPs;//实例化一个对象,将对其进行配置
XGpioPs_Config *GpioPsCfgPtr;
int main()
{int led = 0;initGpio();//initial GPIOXGpioPs_WritePin(&GpioPs,LED1,0x01);while(1){usleep(2000000);XGpioPs_WritePin(&GpioPs,LED0,led);led = ~led;}
//  for (i = 0 ; i <8 ; i++){
//      XGpioPs_WritePin(&GpioPs,LED1,0x00);//reset counter
//      usleep(5000000);
//      XGpioPs_WritePin(&GpioPs,LED1,0x01);
//      usleep(5000000);
//  }print("Hello World\n\r");return 0;
}
//initial gpio
int initGpio(){GpioPsCfgPtr = XGpioPs_LookupConfig(GPIO_DEV_ID);int status;status =  XGpioPs_CfgInitialize(&GpioPs,GpioPsCfgPtr,GpioPsCfgPtr->BaseAddr);if(status != XST_SUCCESS){return status ;}XGpioPs_SetDirectionPin(&GpioPs,LED0,0x01);XGpioPs_SetDirectionPin(&GpioPs,LED1,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,LED0,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,LED1,0x01);return status ;
}

2,课后作业–呼吸灯的代码书写

int i,j;
int led=0;
initGpio();//INITIAL GPIO
XGpioPs_WritePin(&GpioPs,LED1,0x01);//fpga led flash
while(1){for(i=0;i<1000;i++){for(j=0;j<1000;j++){if(i>j){XGpioPs_WritePin(&GpioPs,LED0,0x01);}else{XGpioPs_WritePin(&GpioPs,LED0,0x00);}}}
}

作业这部分代码是直接粘贴的共享文档中的内容。这里简单分析下。首先实现呼吸灯的的功能,之前有做过呼吸灯。就是两个计数器,把一秒分为1000份,进行计数。使亮灯的时间从1一直加到1000在反过来进行一次操作即可。基于Verilog实现呼吸灯
这个是之前用纯逻辑实现的,原理可以参考,是一样的。

第二课--C语言基础(3部分--共三部分)相关推荐

  1. 第二课--C语言基础(1,2部分--共三部分)

    目录 0,课前问题总结 1,C语言基础 1.1,变量 1.2,指针 1.3,关键字 1.4,语句 1.5,函数的写法 2,C代码在SDK中的使用 2.1,变量与内存地址的查看 2.2,指针简单的使用( ...

  2. 第二章 Mablab语言基础

    第二章 Mablab语言基础 2.1 Matlab的变量与常量 1) input:x=input('please enter a numb') 2) Inf/inf:正无穷大 3) pi:圆周率 4) ...

  3. java语言定义一个具备栈功能的类_Java学习笔记 第二章 Java语言基础

    第二章 JAVA语言基础 一.关键字 1.关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有的字母都为小写 2.用于定义数据类型的关键字 c;ass  interface ...

  4. python语言中、用来表示赋值的符号是_第二章Python语言基础知识

    第二章Python语言基础知识 2.1 Python语言基础知识 2.1.1标识符与关键字 在Python语言中,对程序中各个元素命名加以区分,这种用来标识变量.函数.类等元素的符号称为标识符. Py ...

  5. “面试不败计划”: java语言基础面试题(三)

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 java实 ...

  6. c语言基础题(笔记三)

    c语言基础题 1.模拟简单运算器的工作. 2.超速判断 3.用天平找小球 4.分段计算居民水费 5.猜数字游戏 1.模拟简单运算器的工作. 假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运 ...

  7. 第二课.Python编程基础(一)

    基础语法 注释 #行注释 """ 块注释 """ 代码分隔符 '\' code=\ """ Python St ...

  8. 第二章 C语言基础程序设计

    一概览 本章介绍以下内容: - 变量 - 常量 - 进制及其转换 - 计算机信息存储 - C语言基本数据类型-整型 - C语言基本数据类型-浮点型 - C语言基本数据类型-字符型 - C语言基本数据类 ...

  9. python int 转 16进制字符串 大写_第二课 python的基础命令

    python的文件类型: 类型(type),空对象(none),文件,集合,函数,模块 存储模型:看对象能保存多少对象. 更新模型:对象创建之后是否可以更新值. 访问模型:对象的访问方式. pytho ...

最新文章

  1. 【Science】CMU机器学习系主任:八个关键标准判别深度学习任务成功与否
  2. Meta分析到底该怎么选题?
  3. 20151026c#2
  4. 结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次
  5. EventBus使用实例,观察者模式
  6. c语言模拟试题快速排序,快速排序(东软喜欢考类似的算法填空题,又如堆排序的算法等)...
  7. zabbix4.2学习笔记系列
  8. python100个内置函数详解_Python 63个内置函数详解
  9. paip.lucene 4.3 中文语义搜索最佳实践
  10. 小程序专题:14款活动报名小程序
  11. 支持javascript的ppt软件_有哪些辅助工具,可以让PowerPoint软件更强大?
  12. 微信小程序模拟器里面不能显示自己写的INDEX
  13. 二八定律 80/20法则 帕累托法则、帕累托定律、马特莱定律、最省力法则或不平衡原则
  14. Quartus 在工具栏设置功能快捷方式
  15. Nature|人类肠道细菌对治疗药物的生物累积
  16. OpenStack报错:MessagingTimeout: Timed out waiting for a reply to message ID
  17. 等差数列前n项和公式证明
  18. 论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记
  19. 物联网的七大通信协议
  20. XCP实战系列介绍16-XCP标定过程指令解析

热门文章

  1. “ORA-01747: user.table.column, table.column 或列说明无效” 的解决方案
  2. Android 启动APP时黑屏白屏的三个解决方案
  3. 在sql中使用函数,遇到net.sf.jsqlparser.parser.ParseException异常
  4. Java 如何抛出异常、自定义异常、手动或主动抛出异常
  5. 如何通过TRAMP / Emacs远程控制nrepl-ritz-jack-in工作
  6. 如何删除添加了.css()函数的样式?
  7. 问答| 为什么四轮驱动机器人(SSMR)的质心(COM)没有横向分速度vy呢?
  8. kali linux卸载lnmp,kali linux 如何安装lnmp 1.2
  9. 洛谷——P1151 子数整数
  10. Maven配置文件无法被导出或者生效的问题【已解决】