一、前期准备

        vivado 2018.3(同时自动安装SDK、HLS开发软件)

        其可以实现针对Xilinx的FPGA创建工程,编译Verilog,使用各类IP核等,前期只需要使用vivado,对于tb仿真而言,vivado是自带仿真功能的,对于ila而言,vivado同样自带。


二、知识储备

        对于从零开始学习FPGA的同学,应该都是有过51或者32单片机的学习基础,而对于FPGA而言,可以先不了解其芯片的最小系统等。

        FPGA所用的Verilog语言是非常通用的,在不调用特殊IP核的情况下,很多算法或者功能,都可以完全适配另一个芯片。你可以理解为,在自己电脑用C语言写的printf("hello world!"); 在别人电脑上也可以运行。


三、开发语言

        Verilog,FPGA作为并行设备而言,很多学习过C语言的非常好上手Verilog,但同时受限于C语言的串行顺序处理,Verilog作为并行的编程逻辑,也同样让很多人无法深入理解。

        例如,如果用单片机去点亮两个LED,多少是有先后顺序的,即使在运行速度非常快的情况下,肉眼几乎差别不到两灯亮起的时差;但是对于FPGA而言,同时点亮100个LED也是完全没问题的。

        例如对于单片机而言,通过C语言灯的闪烁,一定是先执行LED0亮,再执行LED1亮,先执行LED0灭,再执行LED1灭。

LED0=1;
LED1=1;
delay_ms(500);
LED0=0;
LED1=0;
delay_ms(500);

        对于FPGA而言,通过Verilog点灯,LED0 1的亮灭就完全是同步了(不考虑实际线路的延时)。

        同时对于C语言常写的判断if(i==50),此时若i的递增在定时器中断进行,if(i==50)在主函数while(1)执行,是有一定概率无法判断成功的,取决于while(1)里运行的代码时间,大多采用的是>=

        而对于fpga而言,一个值在always块递增,在另一个always块判断是否达到,只要两个always块调用的同一个时钟,那么就不会“错过”。例如:cnt在计数器模块增加,在LED亮灭模块被判断,都是用的==,因为时钟一致(不够准确,后续深入再谈)。

//计数器模块,cnt从0计数到200_000_000 -1
always@(posedge clk_50M or negedge rst_n)begin
	if(!rst_n)
		cnt <= 1'b0;//按下复位键,清零
	else if(cnt == 28'd200_000_000 -1)
		cnt <= 1'b0;//计数达到顶值,清零
	else
		cnt <= cnt + 1'b1;         
end

//控制LED亮灭
always@(posedge clk_50M or negedge rst_n)begin
	if(!rst_n)
		led <= 4'b1111;
	else if(cnt == 28'd50_000_000 -1)
		led <= 4'b0001;
	else if(cnt == 28'd100_000_000 -1)
		led <= 4'b0010;
	else if(cnt == 28'd150_000_000 -1)
		led <= 4'b0100;
	else if(cnt == 28'd200_000_000 -1)
		led <= 4'b1000;
end
	
endmodule

四、管脚绑定

        这个是单片机里没有的,因为单片每一个IO基本上都确定了他的作用,同时例如点灯函数的初始化会针对某些引脚配置,各类模块的初始化,IIC、SPI已经初始化好了IO,只需要进行物理的连接就好了。

        但是FPGA的Verilog在综合后,还是需要进行管教绑定,例如4个led,需要分配到实际的电路里,同时也需要物理连接。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐