众所周知,软件语言的第一步是HelloWorld,而硬件的第一步就是点燃 引爆 点亮一颗LED灯。而想要点灯,就需要了解FPGA的开发流程。
FPGA开发流程
在硬件设计过程中,必须要明确自己的目标,细化要求,多沟通,这样才能实现想要的目标。第二步,要对整个目标进行划分,一点一点完成。然后就是对硬件的选型。接下来就是对具体功能的实现。第一步要对整个逻辑进行抽象,从具体的需求转化为数字信号的变化,绘制波形图就相当于是真值表或者状态机,最后就可以编写RTL代码了。为了验证代码,先要使用Modelsim进行仿真,然后就可以导入Vivado里,通过vivado生成电路图。实现电路后还要把电路的硬件绑定到引脚上。最后就可以调试了。
项目管理
一个好的团队就必须有纪律,一个好的项目也必须有组织。只有对项目文件合理管理,才能在开发时更有条理。
比如一个项目可以有四个子文件夹,分别存放项目、程序、仿真文件和数据手册。
实际操作
前置知识
原理图
教程中要实现一个把按键同步到LED的功能,这个功能非常简单(就是一个非门),所以前面的需求分析可以跳过,而我们手里也没有其他的FPGA。电路板也不是自己设计,所以需要了解开发板的原理图。如下
当按下时,导通,信号被下拉到地,所以当按下时是0,松开为1。LED的原理图就不放了,就是高电平点亮,加上限流电阻。
取反
取反分为两种,分别是按位取反~
和逻辑取反!
,在单比特情况下无差别,多位取反有如下差别
符号 | 名称 | 功能描述 |
| 按位取反 | 将每一位取反,如 |
| 逻辑取反 | 如果不全为零则视为一,把最低位设为取反值。如 |
项目实践
创建文件夹
这样整四个文件夹,接下来绘制系统框图。
需求梳理&逻辑抽象
先用Visio梳理一下输入和输出。这个模块比较简单,故不过多介绍
根据前面的原理图和系统框图,可以绘制出如下的功能示意图,可以看出他们之前是取反的关系
根据这种关系,可以获得如下的波形。
代码编写
接下来就可以开始编写RTL代码了(这部分由于没有正是学习,简单了解即可)
最主要的是第五行,将输入取反后给到输出。
module LED (
input Key, // Input of the module, default high
output LED // Output of the module, light up when it's high
);
assign LED = ~Key; // Set the output to nevagation of the input
endmodule
仿真测试
接下来就需要对其进行仿真,仿真需要编写仿真模块,它能够扫描所有的输入,并且检测输出是否符合与其波形。
`timescale 1ns/1ns // set the unit and accuracy by `timescale unit/accuracy
module TB_LED ();
reg key;
wire LED;
initial begin //run at the intitialize
// make an alternate changing signal
key <= 1'b1;
#200
key <= 1'b0;
#500
key <= 1'b1;
#1000
key <= 1'b0;
#1000
key <= 1'b1;
end
// connnect the test signal to the module
LED u_led(
.Key (key),
.LED (LED)
);
endmodule
因为这次是走一遍流程,所以程序的具体内容不需要掌握。
打开ModelSim,新建工程File-New-Project。名称TB_LED(和测试文件一致)路径为sim目录。
接下来,添加tb_led和led文件。然后编译,如果没有问题后开始仿真
在上面的界面中选择Testbench模块
还有优化选项里要开启全部信号模式。把待测信号添加到波形
在上图这个界面中点击Run All,得到如下波形,可以看到波形,符合预期
Vivado工程
在Vivado中新建工程,并命名为LED,取消创建子目录选项,并把路径设置在prj目录。在添加源文件的界面中添加led.v,器件型号7020:XC7Z020CLG400-2
来到下面这个界面
点击,就可以综合出电路,但此时的电路是无法和芯片的引脚对应的,所以要添加引脚约束
通过查阅原理图,查得LED的引脚为H15, 按键为L14,它们都连接在Bank35上,使用3.3V供电。具体查找过程参考视频。下面就可以进行综合了
点击左侧绿色三角,等待一个世纪,然后打开原理图
其中IBUF和OBUF是固有的(个人猜测是输出高质量01的),而非门是使用LUT实现的。
然后Run Implementation,接着Generate Bitstream。
烧录验证
将拨码开关都拨到on,链接下载器,上电,OpenTarget,自动连接后,点击ProgramDevice就可以进行烧录,由于ZYNQ PL部分没有Flash,所以掉电后无法保持。
总结
通过本节课学习,了解FPGA的开发流程,熟悉各种软件的使用,本课中的代码暂时不必完全掌握。