第二课--C语言基础(3部分--共三部分)
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部分--共三部分)相关推荐
- 第二课--C语言基础(1,2部分--共三部分)
目录 0,课前问题总结 1,C语言基础 1.1,变量 1.2,指针 1.3,关键字 1.4,语句 1.5,函数的写法 2,C代码在SDK中的使用 2.1,变量与内存地址的查看 2.2,指针简单的使用( ...
- 第二章 Mablab语言基础
第二章 Mablab语言基础 2.1 Matlab的变量与常量 1) input:x=input('please enter a numb') 2) Inf/inf:正无穷大 3) pi:圆周率 4) ...
- java语言定义一个具备栈功能的类_Java学习笔记 第二章 Java语言基础
第二章 JAVA语言基础 一.关键字 1.关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有的字母都为小写 2.用于定义数据类型的关键字 c;ass interface ...
- python语言中、用来表示赋值的符号是_第二章Python语言基础知识
第二章Python语言基础知识 2.1 Python语言基础知识 2.1.1标识符与关键字 在Python语言中,对程序中各个元素命名加以区分,这种用来标识变量.函数.类等元素的符号称为标识符. Py ...
- “面试不败计划”: java语言基础面试题(三)
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 java实 ...
- c语言基础题(笔记三)
c语言基础题 1.模拟简单运算器的工作. 2.超速判断 3.用天平找小球 4.分段计算居民水费 5.猜数字游戏 1.模拟简单运算器的工作. 假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运 ...
- 第二课.Python编程基础(一)
基础语法 注释 #行注释 """ 块注释 """ 代码分隔符 '\' code=\ """ Python St ...
- 第二章 C语言基础程序设计
一概览 本章介绍以下内容: - 变量 - 常量 - 进制及其转换 - 计算机信息存储 - C语言基本数据类型-整型 - C语言基本数据类型-浮点型 - C语言基本数据类型-字符型 - C语言基本数据类 ...
- python int 转 16进制字符串 大写_第二课 python的基础命令
python的文件类型: 类型(type),空对象(none),文件,集合,函数,模块 存储模型:看对象能保存多少对象. 更新模型:对象创建之后是否可以更新值. 访问模型:对象的访问方式. pytho ...
最新文章
- 【Science】CMU机器学习系主任:八个关键标准判别深度学习任务成功与否
- Meta分析到底该怎么选题?
- 20151026c#2
- 结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次
- EventBus使用实例,观察者模式
- c语言模拟试题快速排序,快速排序(东软喜欢考类似的算法填空题,又如堆排序的算法等)...
- zabbix4.2学习笔记系列
- python100个内置函数详解_Python 63个内置函数详解
- paip.lucene 4.3 中文语义搜索最佳实践
- 小程序专题:14款活动报名小程序
- 支持javascript的ppt软件_有哪些辅助工具,可以让PowerPoint软件更强大?
- 微信小程序模拟器里面不能显示自己写的INDEX
- 二八定律 80/20法则 帕累托法则、帕累托定律、马特莱定律、最省力法则或不平衡原则
- Quartus 在工具栏设置功能快捷方式
- Nature|人类肠道细菌对治疗药物的生物累积
- OpenStack报错:MessagingTimeout: Timed out waiting for a reply to message ID
- 等差数列前n项和公式证明
- 论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记
- 物联网的七大通信协议
- XCP实战系列介绍16-XCP标定过程指令解析
热门文章
- “ORA-01747: user.table.column, table.column 或列说明无效” 的解决方案
- Android 启动APP时黑屏白屏的三个解决方案
- 在sql中使用函数,遇到net.sf.jsqlparser.parser.ParseException异常
- Java 如何抛出异常、自定义异常、手动或主动抛出异常
- 如何通过TRAMP / Emacs远程控制nrepl-ritz-jack-in工作
- 如何删除添加了.css()函数的样式?
- 问答| 为什么四轮驱动机器人(SSMR)的质心(COM)没有横向分速度vy呢?
- kali linux卸载lnmp,kali linux 如何安装lnmp 1.2
- 洛谷——P1151 子数整数
- Maven配置文件无法被导出或者生效的问题【已解决】