学fpga(hls之花式led配置)
Posted 费晓行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学fpga(hls之花式led配置)相关的知识,希望对你有一定的参考价值。
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
不管是学习c、c++,还是fpga,led的配置都是基础课。今天可以学点不一样的,看看hls里面led是怎么进行配置的。相关的代码主要参考两本资料,一本是《领航者zynq之hls开发指南 v2.0》,还有一本是《zynq开发平台hls教程》。两本资料都偏向实战,对于入门来说都不错。
1、编程语言
编程语言一般是c
2、最简单的led熄灭控制
#include <ap_cint.h>
void led_twinkle(uint2* led)
#pragma HLS INTERFACE ap_none port=led
#pragma HLS INTERFACE ap_ctrl_none port=return
int i;
for(i = 0; i < 1000000; i++)
if(i < 500000)
*led = 1;
else
*led = 2;
代码中没有输入,只有led输出。从uint2数据类型来说,有两个led。此外,计数器为i,当i小于500000的时候,一个led亮。等到i大于500000的时候,另外一个led灯亮。这样就可以实现一个循环显示led灯的效果。两个HLS INTERFACE也非常重要,一个说明参数接口类型,一个说明函数接口类型。
3、按键控制接口
#include <ap_cint.h>
void led_twinkle(uint1 key, uint2* led)
#pragma HLS INTERFACE ap_none port=key
#pragma HLS INTERFACE ap_none port=led
#pragma HLS INTERFACE ap_ctrl_none port=return
int i;
if(key)
for(i = 0; i < 1000000; i++)
if(i < 500000)
*led = 1;
else
*led = 2;
else
*led = 0;
整体代码和2中的代码差不多,就是多了一个key。当key按下去的时候,led开始循环闪烁。当key没有按下去的时候,led停止闪烁,熄灭。当然,这里key也要定义为ap_none接口。
4、带参数的按键控制
#include <ap_cint.h>
void led_twinkle(uint1 key, uint32 num, uint2* led)
#pragma HLS INTERFACE s_axilite port=num
#pragma HLS INTERFACE ap_none port=key
#pragma HLS INTERFACE ap_none port=led
#pragma HLS INTERFACE ap_ctrl_none port=return
int i;
if(key)
for(i = 0; i < num; i++)
if(i < num/2)
*led = 1;
else
*led = 2;
else
*led = 0;
和3相比较,4又多了一个接口,即num,类型为s_axilite。这个类型表明接口是可以配置的。也就是说,led闪烁的频率可以通过软件进行设置,从这一点说,这个led功能就开始变得有点高级了。因为它不仅有自己的逻辑,还有了软硬件交互的部分,意义一下大了很多。
5、呼吸灯
void led_twinkle(uint1 key, uint32 step, uint32 period, uint1* led)
#pragma HLS INTERFACE s_axilite port=period
#pragma HLS INTERFACE s_axilite port=step
#pragma HLS INTERFACE ap_none port=key
#pragma HLS INTERFACE ap_none port=led
#pragma HLS INTERFACE ap_ctrl_none port=return
int i;
int j;
if(key)
for(i = 0; i <period; i+=step)
for(j = 0; j <period; j++)
*led = (j < i) ? 1:0;
for(i = period; i > 0 ; i-=step)
for(j = 0; j <period; j++)
*led = (j < i) ? 1:0;
else
*led = 0;
相比较4而言,这一次多了两个控制量。一个是period,一个是step。period保证了led控制的周期,而step保证了心跳的频率。当然两个数据的接口类型都是s_axilite。
6、分析
2、3的示例和fpga一样,只不过3比2多了一个输入。4是比较有意义的,这也是zynq这一类的soc价值所在,不仅实现了特定的功能,还能实现软硬件交互,这就有价值了。5是4的拓展,从一个控制参数,变成两个控制参数。
7、其他
c、c++编译生成的代码最终也是要变成verilog综合的,这一点需要注意下。所以语言只是手段,不是目的。目的还是为了构建一个能被cpu操作的ip核。
以上是关于学fpga(hls之花式led配置)的主要内容,如果未能解决你的问题,请参考以下文章