学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配置)的主要内容,如果未能解决你的问题,请参考以下文章

学fpga(hls之系统开发)

学fpga(hls之图像处理)

学fpga(hls之BlockDesign)

学fpga(hls之平均值算法编写)

学fpga(hls之unroll的使用)

学fpga(hls之vivadozynq和petalinux)