工程准备
首先建立一个名为 led 的工程文件夹,文件夹下包含了 doc、quartus_prj、rtl、sim 四个子文件夹:
doc:该文件夹主要包含了文档资料、数据手册、Visio 波形等,相当于档案库; quartus_prj:该文件夹主要包括了使用 Quartus II 软件新建的工程,相当于操作台; rtl:该文件夹主要放置生成硬件电路的代码,相当于原材料; sim:该文件夹放置对生成硬件电路代码的仿真文件,相当于质检室。
这四个文件夹各自完成不同的分工,但是它们之间有什么联系呢?答案是:它们之间通过路径关联和文件引用,形成一个完美的 FPGA 开发闭环。quartus_prj 作为工程中枢,向上访问 doc 读取说明,向下访问 rtl 获取硬件代码,向外访问 sim 获取仿真脚本;sim 向上访问 rtl 在逻辑上验证硬件代码的正确性。
设计过程
无论我们使用 FPGA 做什么类型的项目时,都要参照一个具体的流程,这里介绍通用的开发流程:
- 看手册和原理图,搞清楚我们需要实现什么功能,就像做饭时我们需要看食谱,要知道自己吃什么。
- 搞清楚要做什么以后,就要开始选芯片,选好工程对应的开发芯片。
- 接下来就要开始写代码,运用 Verilog 代码实现电路功能。
- 写完代码以后,要去编译代码、写仿真软件测试是否有逻辑错误。
- 测试仿真完以后,要分配硬件引脚,这样我们的工程才能正常跑出来。
其实我们用 FPGA 做项目和炒菜流程是差不多的,有了具体的流程以后,我们就按着这个思路来实现项目。
工程实现
看食谱
首先,我们来看原理图,看看我们需要实现什么功能,这里要打开开发板的原理图,找到'按键'和'LED'这两个模块,这里取 KEY1 与 LED1:
我们来分析一下这两个原理图,看看它们是怎么共同实现 led 灯点亮的:
当 SW2 按键松开时,1、2 与 3、4 不导通,此时 KEY1 被拉低到 GND 低电平,发出低电平信号 key_in 为 0,对应的 FPGA 输入引脚接收 0 信号,并给 LED 电路发送 0 信号,LED1 电路收到 0 信号后,输出低电平信号 led_out 为 0,led 灯不亮; 当 SW2 按键按下时,1、2 与 3、4 导通,此时 KEY1 被拉高到 3V3 高电平,发出高电平信号 key_in 为 1,对应的 FPGA 输入引脚接收 1 信号,并给 LED 电路发送 1 信号,LED1 电路收到 1 信号后,输出高电平信号 led_out 为 1,led 灯亮。
接着我们在 Visio 中绘制我们 led 功能框图和波形图,这里就不多介绍了,相信大家看完上述我们对 led 电路实现的解析后很容易理解下面两个框图。
led 功能框图
led 波形图
记得做完以后保存到 doc 文件夹中。就此,我们的工程前提工作已经就绪了,也就是说我们看完菜谱已经知道自己要吃什么了,接下来我们就要新建工程,开始备菜了。
备菜
接着,我们在 Quartus 中新建工程,工程要放到 quartus_prj 文件夹中:
对于以下页面,官方文档中只做了简要说明,此处补充说明:其实就是把我们写好的代码文件和新建工程绑定在一起,Quartus 只有在列表里看到了这个文件,才会去读取它,生成对应的电路。不过我们还没有开始写代码,所以目前就不用添加代码文件了。
接下来是器件选择,我们也来做个解释:
- Family 是器件族,就是说我们使用的哪类芯片,这个在 FPGA 板芯片上有介绍,这里使用的是 Cyclone IV E 系列芯片。
- Package 是封装类型,这里我们选的是 Any QFP 封装。
我们来对这串数值进行拆解: a)EP4CE 是产品系列,也就是上面 Family 中选择的芯片型号:Cyclone IV 系列 E 型 b)后面的 10 就是 10k 个逻辑单元 c)再后面的 E 就是 EQFP 类型封装,归类在 QFP 大类下,所以我们在 Package 中选择的是 Any QFP 封装 d)22 就对应着 Pin count 中的引脚数量,即 144 个 e)C 对应着工作温度,0-85°,这个我们可做了解 f)8 则对应着速度等级,也就是 Speed grade 中的 8 g)N 就是工艺标识,无铅工艺,这个我们也只做简要了解
相信看完这个,大家已经懂得怎么去读一个 FPGA CPU 型号了,同时在讲解的过程中,我们也把工程配置好了。对于下面的 Available devices,就不做详细解说了。要注意的是,在新建工程中的配置一定要和 CPU 严格对应好,不然是很影响后面的编译结果的。
炒菜
看完食谱备好食材了之后呢,我们就要开始炒菜了,也就是要写代码。当然就是在 Notepad++ 中写代码。此时,我们在 rtl 文件夹下新建一个名为 led.v 的文本文件,然后用 Notepad++ 打开。
大家回想一下第一步在工程准备中对 quartus_prj 文件夹的介绍:'quartus_prj 作为工程中枢.....向下访问 rtl 获取硬件代码',也就是说,我们编写完代码以后,还要让 quartus_prj 这个文件夹访问提取使用才可以,那怎么才能实现这个流程呢?接下来我们就要回到 Quartus 软件,将我们编写的代码(led.v 文本文件)添加到工程中,这样 quartus_prj 就可以访问 rtl 获取硬件代码了,具体的步骤可参考相关文档。

