一. 4位计数器的设计与仿真验证(1)

来源:互联网 发布:天策军爷捏脸数据 编辑:程序博客网 时间:2024/06/13 06:53

1. FPGA/CPLD的开发流程(基于Quartus II 和 Modelsim)

图1 Quartus II 和 Modelsim 联调设计开发流程


图2 Testbench仿真测试框图


2. Quartus II 工程创建流程(本学习笔记使用的软件版本为13.0,modelsim为quartus II 13.0一起的altera版)

(1) 打开软件,在菜单栏中选择"File -> New",在弹出的窗口中选择"New Quartus II Project"


(2) 目录的指定和文件架构的创建,这一步需要设定工程文件目录(本学习笔记的例程都存放在 C:\Users\26386\Documents\FPGA_code 下)


a. 新建01_Counter_Design文件夹


b. 如果有已经写好的工程代码,此步可以导入,我们是从头创建一个工程,所以此步跳过


c. 选择终端器件的型号,学习笔记使用都是EP2C20F484C7


d. 选择EDA工具,这里我们只用到了ModelSim-Altera,仿真用的语言为Verilog,其余项保持默认,之后再进行调整



e. 检查工程创建的各项信息是否正确,正确点击Finish完成创建,有错误的话,点击Back回去修改


(3) 建立完成的工程界面


图3 01_Counter_Design工程的页面


3. 4位计数器的逻辑电路设计

使用Quartus II 进行逻辑电路的设计一般来说是使用硬件描述语言,学习笔记使用的均是Verilog。

(1) 设计思路

图4 4位计数器的电路运行流程图


流程:FPGA上电启动之后,判断时钟上升沿与复位低电平信号,当主时钟上升沿到来的时候,判断cnt是否溢出,如果溢出了则归零(从0开始继续循环计数),当复位信号到来的时候,cnt直接复位归零。


(2) 文件创建,选择"File -> New",新建Verilog HDL 文件

图5 新建Verilog HDL 文件


(3) Verilog HDL 代码的主要流程


`timescale 1ns/1ns //设置之后testbench的仿真时间单位和精度//信号列表的定制module Counter_Design(input clk, //时钟信号,此时使用的是FPGA板卡上自带,主频为50MHZinput rst_n, //复位信号output reg[3:0] cnt //计数信号);//4位计数器的实现always @ (posedge clk or negedge rst_n)beginif(!rst_n)cnt <= 0; //检测到的是复位信号,则复位归零elsecnt <= cnt + 1'b1; //检测到的是clk上升沿,cnt+1,如果溢出则自动归零endendmodule


4. 编译流程和工程设置

(1) 工程的编译

a. 启动全编译


b. 编译结果


# 编译补充:

Flow Summary 显示了编译日志(包括但不限于工程名、期间特性、资源使用情况),我使用的FPGA板卡上由图可知一共使用了4个LE和6个引脚,其余资源均为使用。

Quartus II 的全编译一共要经历4大步骤,如下图所示:

图6 全编译需要经过的步骤


a.Analysis & Synthesis:分析与综合器,主要是分析源文件的语法错误等,同时生成门级代码。

b.Fitter:适配器,完成对RTL电路的布局和布线。

c.Assembler:装配器,即产生汇编文件。

d.Time Quest Timing Analyzer:时序分析器,约束关键路径,以达到更完美的时序收敛。


(2) 编译警告信息分析(上面的编译结果显示,此次编译产生了7个警告,有些警告信息是很重要的,即使并不影响编译过程的完成,但是最终会体现在电路的运行结果上)

a. IO引脚分配问题

图7 引脚分配警告的具体信息


该警告的出现是因为我们在编译的时候,没有对输入和输出引脚(clk、rst_n、cnt[3:)])分配确定的引脚,所以编译系统给出了提示,分配具体引脚的方式在Quartus II 中有很多种,此时为了方便我们使用最简单的:选择菜单栏 Assignments 的 "Pin Planner"。

图8 引脚分配功能单元界面


在查询了EP2C20F484C7的说明书之后,我们分配引脚如下图所示:

图9 基于EP2C20F484C7的引脚分配表


再次编译,警告提示会减少为6个。


b. Unused Pins 状态设计

比较低的Quartus II 的编译器会出现:"Warning(169174): The Reserve All Unused Pins setting has not been specifie, and will default to 'As output driving ground'."的警告,这是因为我们对未使用的引脚进行约束,一般来说是将未使用过的引脚设置为三态输入来降低器件的功耗。选择:菜单栏"Assignments -> Device -> Device and Pin Options -> Unused Pins",在该页面下将"Reserve all unused pins"状态改为"As input tri-stated"。

图10 "Reserve all unused pins"状态修改界面


再次编译,警告提示会减少为5个。


c. 输出引脚负载电容设置

图11 引脚负载电容配置警告详细信息


在查询了Altera官网的文档后,可以知道"output pin load logic option"的大致意识是,不同大小的负载电容可以改变Tco的大小,不同电平标准的负载电容默认值也不一样,这个信息我们可以在全编译之后,通过"compilation report"中的"resource section"下的"output pin default load for reported TCO"来查看。

图12 "output pin default load for reported TCO"界面详细信息


根据上图的信息,我们再去"Devices and Pin Options"的"Capacitive Loading"下设置每个引脚的负载电容值。

图13 "Capacitive Loading"页面


但是请注意,一般来说FPGA设计使用的都是默认设置,也就是说一般都是忽略该警告的,只有当我们对逻辑电路的运行速度有一定的要求,才会对其进行针对性的设置,前期的功能性验证阶段并不需要处理这部分内容。


d. SDC时序约束文件

在大型设计里时序的规定是非常严谨的,然而在Quartus II 13.0 中只有 Timing Analyzer ,也就是说我们需要自己手动添加时序约束,也就是自己编写SDC文件。

图14 时序约束警告


时序约束代码:


#约束时钟主频为50MHZcreate_clock -period 20 [get_ports clk] #完成对锁相环的全局时钟自动约束,如果我们的FPGA中调用了PLL,就不需要这句约束了derive_pll_clocks #对于不确定时间的自动检测,比如交互时钟、内部时钟和IO接口的不确定时间检测derive_clock_uncertainty #这里指定复位信号不需要进行时序分析,也不需要编译器对其进行优化,所以不允许综合工具分析他set_false_path -from rst_n -to * 


创建SDC文件的过程跟创建Verilog HDL文件的过程是一样的,只要注意最后选择创建 Synopsys Design Constrains File 。

再次编译,警告提示会继续减少,剩下的就是并不重要的警告提示,暂时不需要考虑。


e. RTL电路查询

在我们解决了大部分的警告,并全编译通过之后,可以认为我们已经得到了当前工程顶层设计的RTL电路,查看方式为"Tools -> Netlist Viewers -> RTL Viewer"。

图15 Counter_Design RTL图


目前设计的器件很简单,所以RTL图并没有什么可以考究的地方,但是我们需要时刻意识到的是,我们依靠Verilog HDL 最终设计出来的是数字电路,所以在设计过程中我们始终需要考虑的是我们设计出来的电路够不够优秀,而不是代码本身好不好,有时候看起来繁琐的代码最终体现出来的却是更为完美的电路,那才是FPGA设计的最终目的。

原创粉丝点击