SPARTAN6 + Verilog - FPGA step by step 从0开始学习(1)
从0开始学习FPGA,最好的办法就是先建一个最简单的模块,并且跑起来,然后再慢慢展开。下面这个例子是要按照一定的周期点亮核心板上的一个led。
Step 1 软件安装
这个从0开始学习是用的xilinx的SPARTAN6。SPARTAN6集成开发环境用ISE,不能用Vivado,各自对应的版本不同。安装版本ISE14.7+ModelSim SE+64 10.4,网上安装方法很多,这里不赘述。
Step 2 硬件获取
硬件在TB搜SPARTAN6,有LX9的,有LX16的,百来块搞定核心板和下载器,芯片的材料可以在网上找。下载器需要安装驱动,驱动由找TB店家提供。
Step 3 开始从头到脚建一个工程
Step 3.1 新建一个工程
在ISE里点击New Project。
然后给工程取个名字,点下一步。看帖子说最好路径里不要出现中文,并且路径不要太深,避免文件名过长。
选择芯片类型,封装,speed。这里说明下,很多帖子,包括芯片的文档都说speed是-1,-2这样标识,但实际上我买的两块核心板的芯片都没有这样标识。芯片最后标识的是2C,代表-2。点击next。
点击finish。
现在左侧的导航栏里出现了刚才选的芯片。
现在在芯片上点右键,新建一个verilog文件。
选择verilog module,输入文件名,点next。
弹出一个对话框,让你定义模块的输入输出端口。这个端口不是芯片的管脚,只是模块的逻辑端口。现在定义两个逻辑端接口,一个是clk(这个名字随便取,后面通过约束文件关联到物理管脚上),这个就是板载的系统时钟,由晶振产生;一个是led,用一根线连接一个led和物理管脚,低电平点亮。点next。
点finish。
可以看到集成环境帮建立了一个新的verilog文件,后缀是.v。文件里只有一个模块最简定义。
编辑模块代码,如下。
module test2(
input clk, //板载时钟
output reg led //板载LED
);
reg[31:0] counter; //32位计数器
always@(posedge clk) //上升沿
if (counter<50_000_000) //板载时钟50M,计数1秒
counter=counter+1;
else if(counter>=50_000_000)
begin
counter=0;
led<=~led; //led点亮或熄灭
end
endmodule
##3.3 把设计好的工程烧录进芯片,看实际的效果。
先定义端口和物理管脚的绑定。右键点击verilog文件,选择New Source。
选择Implementation Constraints File,输入文件名,点击Next。
点击Finish,ISE建了一个空文件。
输入如下代码,并保存文件。
NET “clk” LOC=P8;
NET “led” LOC=P7;
上面的P8,P7是原理图上的芯片管脚名,一个是连再时钟上一个是连在led1上。
到这里最简单的工程文件就搞完了。依次右键->run下面三个:implement design, generate programming file和configure target device。会花点时间,第一个是综合,第二个产生bit文件,可以在工程目录下找到,第三个打开ISE的iMPACT。
impact的初始界面如下:
连接好下载器和核心板电源。点击boundary scan,然后在右边空白处右键点击,选择add xilinx device。
选择刚生成的bit文件,打开。
右键点击芯片,点击program。
在下图中点击OK。
会出现一个进度条,然后就是program succeed。
这个时候看核心板的led已经闪起来了!不过上述代码仿真的时候会出问题,led是红线,因为整个代码里没有给led初始化值。因此要加个reset信号才能正常仿真。下篇记下最简单的仿真。