StepFPGA有两块物美价廉的FPGA开发板:1. 基于Altra的MAX10,2. 基于Lattice的MachXO2。都比较合适于教学,现以后者为例介绍FPGA开发的入门步骤(后者的优势是Lattice的Diamond是免费的,前者可能存在的优势是该MAX10开发板有可能支持Simulink的FPGA在环(FIL)设计,有待进一步验证)。这是一篇step-by-step的学习手册,仿照即可学会。
第1部分 安装Diamond——编程、综合、仿真的集成环境
- 在Lattice官网注册账号登录,下载Diamond(http://www.latticesemi.com/latticediamond)
- 获取许可证(http://www.latticesemi.com/Support/Licensing#requestDiamond),选择Request Node-locked License,该许可证支持MachXO2。在NIC一栏中输入自己电脑的网卡物理地址(网卡物理地址查看方式:win+R -- cmd -- ipconfig /all)。随后即可收到License邮件,该邮件附件为“license.dat”,保存好。
- 安装Diamond
- 将之前收到邮件中的license.dat保存到"\lscc\diamond\3.xx\license"中
- 检查设置环境变量,确保环境变量中存在下面一项内容:
key: LM_LICENSE_FILE
value: lscc\diamond\3.xx\license\license.dat
- 运行Diamond
第2部分 Diamond中的Verilog HDL设计——从编程到烧录
参考“STEP-MXO2 软件手册”的15-29页。期间涉及到管脚分配环节,这部分必须看懂所用FPGA(开发板)电路原理图和芯片引脚图,否则将会无从分配,除非仅作仿真,不烧录程序。
tip: 应该仔细认真的阅读厂家提供的电路原理图,这一点对于电路原理的理解至关重要,要习惯于通过厂家的资料学习专业知识,从而消弭大学课堂学习的理论课知识和工程实践之间的障碍。如果能够指出产品设计或相关文档不完善的地方就更好了,如此便产生了与厂家工程师交流的契机,快速提高自己的实操水平。比如该开发板在驱动板载数码管时采用了直接驱动的方式,无论公共端还是各段码端都没有限流措施,可能设计者已经考虑到了核心芯片的引脚和所用数码管的内阻,能够保证安全(由于笔者没有详细查找datasheet,所以不敢妄下结论),但实际使用过程中,在静态显示时还是有一定热度,问工程师,反馈是最好做一下限流。为了使用安全,只能自己想办法,比如将公共端引脚设置为高阻状态(assign C9 = 1'bz;)的同时外接限流电阻后接地。其实这只是简单的电路知识,学过电子电路原理之后应该能够理解。
第3部分 ModelSim中仿真
- 仿真工具不止一种,可以使用Active-HDL,也可以使用ModeSim,前者需要单独下载安装,后者可在Diamond 3.12中直接调用,这里以后者为例。(其实都差不多,入门先学会一种也可以了,甚至包括Xilinx ISE、Quartus和Diamond之间操作上也都大同小异)
- 正式进入ModelSim之前的工作流程可以继续参考“STEP-MXO2 软件手册”的29-35页,只是中途会有“Active-HDL”和“Modelsim”选项的差别
- 进入ModelSim之后的操作如下
1. 编译所有文件,包括程序和测试文件
2. 进入仿真流程
3. 切换至Librabry选项卡,从库中找到对应系列的芯片
4. 切换至Design选项卡,选择相应的测试文件
5. 选中并添加所有将要参与仿真的信号
6. 设置单步仿真时间,并点击Run图标仿真
7. 观察波形
程序:
module seg7 (bcd, leds, CC); input [3:0] bcd; output [1:7] leds; output CC; reg [1:7] leds; always @(bcd) case (bcd) 0: leds = 7'b1111110; 1: leds = 7'b0110000; 2: leds = 7'b1101101; 3: leds = 7'b1111001; 4: leds = 7'b0110011; 5: leds = 7'b1011011; 6: leds = 7'b1011111; 7: leds = 7'b1110000; 8: leds = 7'b1111111; 9: leds = 7'b1111011; default: leds = 7'bx; endcase assign CC = 1'b0; endmodule
测试程序:
`timescale 1ns/100ps module decoder_tb; reg [3:0] bcd; wire [1:7] leds; initial begin bcd = 4'b0000; #50 bcd = 4'b0010; #50 bcd = 4'b0110; #50 bcd = 4'b1001; #50; end seg7 seg7_u1
( .bcd (bcd), .leds (leds) ); endmodule