×

modelsim使用教程,modelsim仿真不出波形显示win64错误?

admin admin 发表于2023-12-25 05:30:34 浏览18 评论0

抢沙发发表评论

本文目录一览:

quartus怎么仿真?Quartus II调用modelsim无缝仿真详细图文教程

Quartus II 是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程,那么quartus怎么仿真?Quartus II怎么调用modelsim无缝仿真?下面我们的小编带来Quartus II调用modelsim无缝仿真详细图文教程。
Quartus 中调用modelsim的流程:
1. 设定仿真工具
assignmentsettingEDA tool settingsimulation 选择你需要的工具。
2. 自动产生测试激励文件模板:
processingstartStart test bench template writer
我们点击之后系统会自动在目录:当前文件夹 simulation modelsim (这个文件夹名字跟你选的仿真工具有关) 中产生一个测试激励文件 xxx.vt(Verilog test bench) 或者 xxx.vht(VHDL test bench), 文件名跟你工程中的Top module 的名字一样, 后缀为.vt或者.vht。
3. 编辑走动生成的test bench文件
我们加入自己需要的激励以及初始化语句,这里我们还要修改test bench的模块名字为tb(我们会看到这个名字和后面的设定有联系)。
4. 连接test bench,我们需要从Quartus中自动调用仿真工具,所以需要设定Native Link选项。
a) 还是在simulation的设置页面里,设定Native Link对话框中的设定。我们这里因为需要工具自动调用激励所以选中
b) 点击右边的Test Benches, 我们需要在这里设定一个相关联的test bench.
这里会弹出一个让你指定test bench的对话框,因为我们之前没有指定任何的test bench,所以这里是空白的。
c) 指定test bench
因为我们是第一次产生test bench,点击new.
点击New之后会产生一个New Test bench setting的对话框,在这里你将test bench和你的相应的test bench file进行绑定。
我们这里在Test bench name的对话框中输入一个名字my_1st_tb, 我们将看到,在下面的Top level module in test bench对话框中也自动显示my_1st_tb. 注意这个名字应该和你的test bench 中的module name一直,我们之前在第3步的时候将test bench的module name已经改成了tb,所以我们这里应该把对话框中的名字改成tb。
d) 加入test bench文件
5. 进行仿真
当这些设定都完成了之后, 选择菜单
toolRun EDA Simulation toolEDA RTL simulation
就可以直接调用modelsim进行仿真。
6. 小技巧:
我们这样调用仿真,如果是Modelsim AE每次不会编译lib文件,但如果我们使用的是Modelsim SE版本,每次调用都需要重新编译库,非常不爽,在这里我们建议自己修改脚本文件,进行仿真.
a) 当我们按照之前的描述,运行完仿真之后,停留在Modelsim的界面。
b) 在Modelsim界面的命令行上,我们点向上的方向键,就会出现我们上一条指令, 我们可以看到是
do xxxx.do 这说明工具执行的上一个命令式 xxxx.do这个脚本文件,我们这里的例子是
do oversampling_core_run_msim_rtl_verilog.do
i. 我们知道了工具执行的脚本,我们就可以按照自己的想法去改变这个脚本了。使用
edit oversampling_core_run_msim_rtl_verilog.do命令,可以看到这个脚本的内容(当然我们也可以使用Ultra Edit或者VIM等文本编辑软件去打开这个脚本文件)。这个脚本通常分成3部分 库文件编译部分,设计文件编译,运行参数设定和开始执行部分
ii. 通常来说库文件只在第一次编译的时候,需要编译,后面我们只需要在仿真的时候指定库文件的位置就好了,不需要每次都编译。因此我们可以注释掉库文件编译部分。下面图中红色框中的部分就是被注释掉的库编译部分,这样会节省我们的仿真时间,注意在脚本语言中#是注释符。
iii. 我们将编辑过的脚本文件另存为sim.do, 在以后的仿真中我们可以在Modelsim命令行中,直接在脚本中运行do sim.do(当然是先需要将Modelsim的工作目录改到 工程所在文件夹/simulation/modelsim/)。
c) 另外脚本生成的波形文件通常是将test bench的顶层加入到图形画面中我们可以看到在脚本的第3部分(运行参数和开始执行)部分,默认命令式
add wave *, 这条命令就是讲 test bench顶层的所有信好加入到wave窗口中。
对我们来说,在调试阶段,有很多底层信号都是想观测的,所以需要再手动修改一下命令
i. 在modelsim的窗口中,选中自己想要关心的模块,右键可以将自己关心的信号加入wave波形中
ii. 此时我们在wave 窗口中可以将这个波形的格式存下来,在wave窗口中点菜单filesave 选择文件名为wave.do.
iii. 在我们执行的脚本中将add wave *,这个命令替换成do wave .do, 就可以在每次执行仿真的时候自动添加想要观测的波形了。
7. 接下来最后一个问题,怎样才能一次性的编译好库文件,让软件不再每次编译。其实altera已经为客户准备了相应的选项,只不过藏得比较深,不好找。
a) 一次性编译库:
i. 点击tool launch EDA simulation Library Compiler
ii. 我们会看到一个让我们选择器件的页面。根据你的实际情况选择下面的设定。点击start compile,软件会自动帮你完成编译,然后关掉就好,至此你应该已经完成了库的编译。
iii. 接下来我们需要在QII的仿真设定页面做一些修改。
我们需要回到设定界面
Assignmentsettingsimulationmore Nativelink setting
设定好相应的路径。
好了,重新run仿真,就发现不会再编译我们的库文件了。

modelsim怎么自动生成testbench

ModelSim,首先(open)打开需要仿真的模块 ,Source -> Show Language Templates,
在显示的 Language Templates栏目中选择“Create Testbench”
软件自动弹出的"Create Testbench Wizzard”窗口中,在"work"下选择待仿真模块,按照提示走完,即自动生成。
扩展资料:
主要特点
RTL和门级优化,本地编译结构,快速编译和仿真,跨平台和跨版本仿真;
单内核VHDL和Verilog混合仿真;
源码模板及助理,项目管理;
集成性能分析、波形比较、代码覆盖、数据流ChaseX、信号间谍、虚拟对象、内存窗口、内存窗口、源窗口显示信号值、信号状态断点等调试功能;
C与Tcl/Tk接口,C调试;
直接支持SystemC,与HDL任意混合;
支持SystemVerilog设计功能;
对系统级描述语言,SystemVerilog,SystemC,PSL的最全面的支持;
ASIC关闭。行为、RTL和门级代码可以单独或同时使用。
ModelSim,首先(open)打开需要仿真的模块 ,Source -> Show Language Templates,
在显示的 Language Templates栏目中选择“Create Testbench”
软件自动弹出的"Create Testbench Wizzard”窗口中,在"work"下选择待仿真模块,按照提示走完,即自动生成。
扩展资料
主要特点
RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真;
单内核VHDL和Verilog混合仿真;
源代码模版和助手,项目管理;
集成了性能分析、波形比较、代码覆盖、数据流ChaseX、Signal Spy、虚拟对象Virtual Object、Memory窗口、Assertion窗口、源码窗口显示信号值、信号条件断点等众多调试功能;
C和Tcl/Tk接口,C调试;
对SystemC的直接支持,和HDL任意混合;
支持SystemVerilog的设计功能;
对系统级描述语言的最全面支持,SystemVerilog,SystemC,PSL;
ASIC Sign off。可以单独或同时进行行为(behavioral)、RTL级、和门级(gate-level)的代码。

modelsim仿真不出波形显示win64错误?

这个问题可能是由于在使用ModelSim进行仿真时,未正确安装或配置所导致的。
以下是一些常见的解决方法:
确认你的ModelSim版本是否与你的操作系统兼容。如果你的操作系统是64位的,那么你应该使用64位的ModelSim版本。
检查是否已经正确地配置了ModelSim的环境变量。如果没有,请参考ModelSim的安装手册或者网上的教程进行正确的配置。
如果你是在Windows 10操作系统下运行ModelSim,可以尝试将ModelSim运行时设置为“兼容模式”。在ModelSim的安装目录中找到modelsim.ini文件,右键点击选择“属性”,在“兼容性”选项卡中选择“Windows 7”,然后单击“应用”和“确定”。
尝试升级你的ModelSim版本,或者使用其他仿真软件进行仿真,例如Xilinx Vivado。
希望以上解决方法能够帮到你。如果问题仍然存在,请提供更多详细信息以便进一步诊断。

求EDA技术实用教程(潘松第三版)箜篌习题答案,在线等

http://www.baidu.com/s?tn=baiduadv&ie=gb2312&bs=filetype%3AallEDA%BC%BC%CA%F5%CA%B5%D3%C3%BD%CC%B3%CC&sr=&z=&cl=3&f=8&wd=filetype%3Aall+EDA%BC%BC%CA%F5%CA%B5%D3%C3%BD%CC%B3%CC
http://www.baidu.com/s?tn=baiduadv&bs=filetype%3Aall+EDA%BC%BC%CA%F5%BD%CC%B3%CC&ie=gb2312&sr=&z=&cl=3&f=8&wd=filetype%3Aall+EDA%BC%BC%CA%F5
http://www.baidu.com/s?tn=baiduadv&bs=filetype%3Aall+EDA%BD%CC%B3%CC&ie=gb2312&sr=&z=&cl=3&f=8&wd=filetype%3Aall+EDA%D7%CA%C1%CF
谢谢采纳
http://share.dzkf.cn/down/2009/0401/file_6497.html
自己去瞧瞧,可以下载的,不行的话,看看这里:http://www.kx-soc.com/download.asp
本书以掌握国内外最流行的电子设计自动化(EDA)技术为教学目标,以
培养学生的设计和应用开发能力为主线,系统地介绍EDA应用技术。
全书在取材和编排上,内容新颖、循序渐进,并注重理论联系实际。全
书共10章,主要内容包括VHDL硬件描述语言、Quartus Ⅱ等EDA工具软件、
可编程逻辑器件、实验开发系统、应用实例和综合设计实例。第4章对大量
常规的数字电路做出了VHDL描述,第7章详细阐述了9个典型数字系统的设计
方法,第9章选取了16个实验实例,第10章给出了4个代表性的全国大学生电
子设计竞赛赛题设计实例。读者完全可以通过这些实际操作,很好地掌握:
EDA的开发设计方法。每章后面附有小结和习题,便于读者学习和教学使用
。为方便教师教学,本书配有电子教案。
本书可作为高职高专及本科院校电子信息、电气、通信、自动控制、自
动化和计算机类专业的EDA技术教材,也可作为上述学科或相关学科工程技
术人员的参考书。还可作为电子产品制作、科技创新实践、EDA课程设计和
毕业设计等实践活动的指导书。

【本书目录】

第1章 EDA技术概述
1.1 EDA技术及其发展
1.1.1 EDA技术的涵义
1.1.2 EDA技术的发展史
1.2 EDA设计流程
1.3 EDA技术的主要内容及主要的EDA厂商
1.3.1 EDA技术的主要内容
1.3.2 主要EDA厂商概述
1.4 常用的EDA工具
1.5 EDA技术的发展趋势
1.5.1 可编程器件的发展趋势
1.5.2 软件开发工具的发展趋势
1.5.3 输入方式的发展趋势
1.6 EDA技术的应用
1.6.1 EDA技术的应用形式
1.6.2 EDA技术的应用场合
本章小结
思考题和习题
第2章 VHDL硬件描述语言
2.1 VHDL概述
2.1.1 常用硬件描述语言简介
2.1.2 VHDL及其优点
2.1.3 VHDL程序设计约定
2.1.4 VHDL程序设计举例
2.2 VHDL程序基本结构
2.2.1 实体
2.2.2 结构体
2.2.3 库
2.2.4 程序包
2.2.5 配置
2.3 VHDL语言要素
2.3.1 VHDL文字规则
2.3.2 VHDL数据对象
2.3.3 VHDL数据类型
2.3.4 运算操作符
2.3.5 VHDL语言结构体的描述方式
2.4 VHDL顺序语句
2.4.1 等待语句和断言语句
2.4.2 赋值语句
2.4.3 转向控制语句
2.4.4 子程序调用语句
2.4.5 返回语句
2.5 VHDL并行语句
2.5.1 进程语句
2.5.2 块语句
2.5.3 并行信号赋值语句
2.5.4 并行过程调用语句
2.5.5 元件例化语句
2.5.6 生成语句
本章小结
思考题和习题
第3章 Quartus Ⅱ软件及其应用
3.1 Quartus Ⅱ的使用及设计流程
3.1.1 Quartus Ⅱ的图形编辑输入法
3.1.2 Quartus Ⅱ的文本编辑输入法
3.2 Quartus Ⅱ设计正弦信号发生器
3.2.1 创建工程和编辑设计文件
3.2.2 编译
3.2.3 正弦信号数据ROM定制
3.2.4 仿真
3.2.5 测试
3.2.6 配置器件
3.3 MATLAB/DSP Builder设计可控正弦信号发生器
3.3.1 建立设计模型
3.3.2 Simulink模型仿真
3.3.3 SignalCompiler编译
3.3.4 使用Quartus Ⅱ实现时序仿真
3.3.5 使用Quartus Ⅱ进行硬件测试
与硬件实现
本章小结
思考题和习题
第4章VHDL应用实例
4.1 组合逻辑电路设计
4.1.1 基本门电路
4.1.2 译码器
4.1.3 编码器
4.1.4 数值比较器
4.1.5 数据选择器
4.1.6 算术运算电路
4.1.7 三态门及总线缓冲器
4.2 时序逻辑电路设计
4.2.1 时钟信号和复位信号
4.2.2 触发器
4.2.3 寄存器和移位寄存器
4.2.4 计数器
4.2.5 序列信号发生器和检测器
4.3 存储器设计
4.3.1 只读存储器ROM
4.3.2 随机存储器RAM
4.4 状态机设计
4.4.1 摩尔型状态机
4.4.2 米立型状态机
本章小结
思考题和习题
第5章 大规模可编程逻辑器件
5.1 可编程逻辑器件概述
5.2 简单可编程逻辑器件
5.3 复杂可编程逻辑器件
5.3.1 CPLD的基本结构
5.3.2 Altera公司的器件
5.4 现场可编程门阵列
5.4.1 FPGA的整体结构
5.4.2 Xilinx公司的’FPGA器件
5.4.3 FPGA的配置
5.5 在系统可编程逻辑器件
5.5.1 ispLsI/pLSI的结构
5.5.2 Lattice公司ispLSI系列器件
5.6 FPGA和CPI。D的开发应用选择
5.6.1 FPGA和CPL|D的性能比较
5.6.2 FPGA和CPLD的开发应用选择
本章小结
思考题和习题
第6章 常用印A工具软件
6.1 Altera MAX+plus Ⅱ的使用
6.1.1 MAX+plus Ⅱ功能简介
6.1.2 MAX+plus Ⅱ设计流程
6.1.3 MAX+plus Ⅱ设计举例
6.2 Xilinx Foundation的使用
6.2.1 Foundation设计流程
6.2.2.Foundation设计举例
6.3 ModelSim的使用
6.3.1 ModelSim的使用方法
6.3.2 ModelSim与MAX-+Iplus Ⅱ的接口
6.3.3 ModelSim交互命令方式仿真
6.3.4 ModelSim批处理工作方式。
本章小结
思考题和习题
第7章 EDA技术综合设计应用
7.1 数字闹钟的设计
7.1.1 系统的设计要求
7.1.2 系统的总体设计
7.1.3 闹钟控制器的设计
7.1.4 译码器的设计
7.1.5 键盘缓冲器(预置寄存器)的设计
7.1.6 闹钟寄存器的设计
7.1.7 时间计数器的设计
7.1.8 显示驱动器的设计
7.1.9 分频器的设计
7.1.10 系统的整体组装
7.1.11 系统的硬件验证
7.2 多功能信号发生器的设计
7.2.1 设计要求
7.2.2 设计实现
7.2.3 系统仿真
7.3 序列检测器的设计
7.3.1 设计思路
7.3.2 VHDL程序实现
7.3.3 硬件逻辑验证
7.4 交通灯信号控制器的设计
7.4.1 设计思路
7.4.2 VHDL程序实现
7.4.3 硬件逻辑验证
7.5 空调系统有限状态自动机的设计
7.5.1 设计思路
7.5.2 VHDL程序实现
7.6 电梯控制系统的设计
7.6.1 设计要求
7.6.2 设计实现
7.6.3 系统仿真
7.7 步进电机控制电路的设计
7.7.1 步进电机的工作原理
7.7.2 驱动电路的组成及VHDL实现
7.8 智力竞赛抢答器的设计
7.8.1 设计思路
7.8.2 VHDL程序实现
7.9 单片机与FPGA/CPLD总线接口的设计
7.9.1 设计思路
7.9.2 VHDL程序实现
本章小结
思考题和习题
第8章 EDA实验开发系统
8.1 GW48型EDA实验开发系统原理与使用
8.1.1 系统性能及使用注意事项
8.1.2 系统工作原理
8.1.3 系统主板结构与使用方法
8.2 GW48实验电路结构图
8.2.1 实验电路信号资源符号图说明
8.2.2各实验电路结构图特点与适用范围简述
8.3 GW48系统结构图信号名与芯片引脚对照表
8.4 GWDVP?B电子设计竞赛应用板 使用说明
8.5 GW48型EDA实验开发系统使用实例
本章小结
思考题和习题
第9章 EDA技术实验
实验1 8位全加器的设计
实验2 组合逻辑电路的设计
实验3 触发器功能的模拟实现
实验4 计数器的设计
实验5 计数译码显示电路
实验6 数字钟综合实验
实验7 序列检测器的设计
实验8 简易彩灯控制器
实验9 正负脉宽数控调制信号发生器的设计
实验10 数字秒表的设计
实验11 交通灯信号控制器的设计
实验12 模拟信号检测
实验13 4位十进制频率计设计
实验14 VGA显示器彩条信号发生设计
实验15 A/D转换控制器的设计
实验16 音乐发生器的设计
第10章 EDA技术在全国大学生电子设计竞赛中的应用
10.1 等精度频率计设计
10.1.l 系统设计要求
10.1.2 系统组成
10.1.3 工作原理
10.1.4 FPGA开发的VHDL设计
10.1.5 系统仿真
10.1.6 系统测试与硬件验证
10.1.7 设计技巧分析及系统扩展思路
10.2 测相仪设计
10.2.1 测相仪工作原理及实现
10.2.2 系统测试
10.3 基于DDS的数字移相正弦信号发生器设计
10.3.1 系统设计要求
10.3.2 系统设计方案
10.3.3 DDS内部主要模块的VHDL程序实现
10.3.4 系统仿真与硬件验证
10.3.5 设计技巧分析与系统扩展思路
10.4 逻辑分析仪设计
10.4.1 设计任务
lO.4.2 设计基本要求
10.4.3 设计实现
附录 常用FPGA/CPLD管脚图

nios ii 仿真问题

可以仿真,quartus和NIOS都内置了仿真器,也可以用modelsim仿真.
这里推荐modelsim仿真,学这个比quartus和NIOS重要.很多公司都用这个
步骤你在网上找把,Modelsim 6.0 使用教程

准备学习fpga,但不知怎么开始,求大虾指点,希望详细点,多谢。

1. 学习内容上,主要从以下几个方面来学:
(1)数字电路:数字电路是FPGA设计的灵魂!
(2)语言:Verilog HDL、VHDL..
Verilog HDL语言推荐北航夏宇闻老师《verilog数字系统设计教程》(我用的是Verilog,VHDL不妄加推荐)。
(3)器件:Xilinx、Altera...
一堆的器件手册, 要求扎实的英文阅读功夫。入门的话,选定一个基础资源少一些、功能简单一些的器件先建立FPGA的概念。如果Xilinx的话,推荐Spartan-3系列器件;如果Altera的话推荐Cyclone系列的器件。
(4)编译环境:ISE(Xilinx)、Quartus II(Altera)..
推荐两套书吧:如果是ISE,推荐EDA 先锋工作室编著的《FPGA\CPLD设计工具:Xilinx ISE使用详解》,如果是Altera,还是推荐EDA 先锋工作室编著的《Altera FPGA/CPLD设计(基础篇)》和《Altera FPGA/CPLD设计(高级篇)》两册。
(5)仿真环境:modelsim
第三方仿真工具,学习这个不必刻意买书,网上百度简单的教程,跑一个例子就知道怎么用了。
(6)综合环境:synplify
第三方综合工具,同上。
2. 学习方法上,以实践动手为主,多上论坛,多上网查资料,重视设计思想和方法,少直接向别人要代码。
能有一个开发板最好,或者参与到实验室的项目中去,会学的很快。FPGA开始学的时候,有种错觉:以为很简单,很像C程序(Verilog)。这也是很多论坛上常见的对FPGA一知半解的人对新手的误导!
注意:FPGA开发是数字电路设计!电路设计!
坚持下去,FPGA很有前景,祝你成功!

FPGA现在学起来怎么样?难不?需要了解哪些基础课程?

1 要有对FPGA的兴趣,只有这样才能用最大的热情对待它。
2 要有对数字系统设计比较全面的把握,reg ,ram,counter,fifo,dsp,uc......
3 最好能有一个具体的项目(最好复杂一些,对系统的性能要求高一些),这样才能有的放矢,有压力才有动力。
4 找一个好的老师
5 重视底层,即使你的系统性能可以满足要求,也尝试着从底层进行一些开放和优化
6 多看看别人成功的例子,拓宽自己的视野,没事的时候到FPGA论坛逛逛。帮助他人也是帮助自己。
7 对要求实现的算法或者系统有一个清楚的认识
FPGA知识基本分为这些方向:
器件结构 - FPGA芯片的内部构架
编程软件 - VHDL, Verilog 语言和ISE软件(综合工具、仿真工具、布局布线工具等)的使用方法
硬件问题 - PCB画板、信号完整性、高速IO、配置电路等等
嵌入式 - 使用EDK进行嵌入式设计
DSP设计 - 使用Matlab和Sysgem Generator进行DSP算法设计和实现
数字电路要求比较高
推荐一个培训 北京至芯科技FPGA培训
还要多上FPGA论坛
学习FPGA不仅仅是学一门HDL语言,FPGA是一个系统,因为除了FPGA本身,还要涉及到外设、时钟、电源、内存、接口等多方面的知识。
只要找对学习方法,不难的,这个行业发展很不错的,国内也很缺乏这方面的人才,我个人建议去明德扬看看,你可以选择去培训,还可以选择买个视频学习,你想问的问题直接问他们就可以了
还好吧,有数电基础更好一点
有数电基础会简单一些,没有的话很难入们
FPGA学习重点
1. 看代码,建模型
只有在脑海中建立了一个个逻辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写Verilog和写C整体思路是不一样的,才能理解顺序执行语言和并行执行语言的设计方法上的差异。在看到一段简单程序的时候应该想到是什么样的功能电路。
  
2. 用数学思维来简化设计逻辑
学习FPGA不仅逻辑思维很重要,好的数学思维也能让你的设计化繁为简,所以啊,那些看见高数就头疼的童鞋需要重视一下这门课哦。举个简单的例子,比如有两个32bit的数据X[31:0]与Y[31:0]相乘。当然,无论Altera还是Xilinx都有现成的乘法器IP核可以调用,这也是最简单的方法,但是两个32bit的乘法器将耗费大量的资源。那么有没有节省资源,又不太复杂的方式来实现呢?我们可以稍做修改:
  
将X[31:0]拆成两部分X1[15:0]和X2[15:0],令X1[15:0]=X[31:16],X2[15:0]=X[15:0],则X1左移16位后与X2相加可以得到X;同样将Y[31:0]拆成两部分Y1[15:0]和Y2[15:0],令 Y1[15:0]=Y[31:16],Y2[15:0]=Y[15:0],则Y1左移16位后与Y2相加可以得到Y,则X与Y的相乘可以转化为X1和X2 分别与Y1和Y2相乘,这样一个32bit*32bit的乘法运算转换成了四个16bit*16bit的乘法运算和三个32bit的加法运算。转换后的占用资源将会减少很多,有兴趣的童鞋,不妨综合一下看看,看看两者差多少。
  
3. 时钟与触发器的关系
“时钟是时序电路的控制者”这句话太经典了,可以说是FPGA设计的圣言。FPGA的设计主要是以时序电路为主,因为组合逻辑电路再怎么复杂也变不出太多花样,理解起来也不没太多困难。但是时序电路就不同了,它的所有动作都是在时钟一拍一拍的节奏下转变触发,可以说时钟就是整个电路的控制者,控制不好,电路功能就会混乱。
  
打个比方,时钟就相当于人体的心脏,它每一次的跳动就是触发一个 CLK,向身体的各个器官供血,维持着机体的正常运作,每一个器官体统正常工作少不了组织细胞的构成,那么触发器就可以比作基本单元组织细胞。
时序逻辑电路的时钟是控制时序逻辑电路状态转换的“发动机”,没有它时序逻辑电路就不能正常工作。因为时序逻辑电路主要是利用触发器存储电路的状态,而触发器状态变换需要时钟的上升或下降沿,由此可见时钟在时序电路中的核心作用。
  
最后简单说一下体会吧,归结起来就是多实践、多思考、多问。实践出真知,看100遍别人的方案不如自己去实践一下。实践的动力一方面来自兴趣,一方面来自压力。有需求会容易形成压力,也就是说最好能在实际的项目开发中锻炼,而不是为了学习而学习。
  
为什么你会觉得FPGA难学?
1. 不熟悉FPGA的内部结构
FPGA为什么是可以编程的?恐怕很多初学者不知道,他们也不想知道。因为他们觉得这是无关紧要的。他们潜意识的认为可编程嘛,肯定就是像写软件一样啦。软件编程的思想根深蒂固,看到Verilog或者VHDL就像看到C语言或者其它软件编程语言一样。一条条的读,一条条的分析。
拒绝去了解为什么FPGA是可以编程的,不去了解FPGA的内部结构,要想学会FPGA 恐怕是天方夜谭。那么FPGA为什么是可以“编程”的呢?首先来了解一下什么叫“程”。其实 “程”只不过是一堆具有一定含义的01编码而已。
  
编程,其实就是编写这些01编码。只不过我们现在有了很多开发工具运算或者是其它操作。所以软件是一条一条的,通常都不是直接编写这些01编码,而是以高级语言的形式来编写,最后由开发工具转换为这种01编码而已。对于软件编程而言,处理器会有一个专门的译码电路逐条把这些01编码翻译为各种控制信号,然后控制其内部的电路完成一个个的读,因为软件的操作是一步一步完成的。
而FPGA的可编程,本质也是依靠这些01编码实现其功能的改变,但不同的是FPGA之所以可以完成不同的功能,不是依靠像软件那样将01编码翻译出来再去控制一个运算电路,FPGA里面没有这些东西。
  
FPGA内部主要三块:可编程的逻辑单元、可编程的连线和可编程的IO模块。
可编程的逻辑单元
其基本结构某种存储器(SRAM、 FLASH等)制成的4输入或6输入1输出的“真值表”加上一个D触发器构成。任何一个4输入1输出组合逻辑电路,都有一张对应的“真值表”,同样的如果用这么一个存储器制成的4输入1输出的“真值表”,只需要修改其“真值表”内部值就可以等效出任意4输入1输出的组合逻辑,这些“真值表”内部值就是那些01编码。
如果要实现时序逻辑电路怎么办?任何的时序逻辑都可以转换为组合逻辑+D触发器来完成。但这毕竟只实现了4输入1输出的逻辑电路而已,通常逻辑电路的规模那是相当的大。
  
可编程连线
那怎么办呢?这个时候就需要用到可编程连线了。在这些连线上有很多用存储器控制的链接点,通过改写对应存储器的值就可以确定哪些线是连上的而哪些线是断开的。这就可以把很多可编程逻辑单元组合起来形成大型的逻辑电路。
可编程的IO
任何芯片都必然有输入引脚和输出引脚。有可编程的IO可以任意的定义某个非专用引脚(FPGA中有专门的非用户可使用的测试、下载用引脚)为输入还是输出,还可以对IO的电平标准进行设置。
总归一句话,FPGA之所以可编程是因为可以通过特殊的01代码制作成一张张 “真值表”,并将这些“真值表”组合起来以实现大规模的逻辑功能。
  
不了解FPGA内部结构,就不能明白最终代码如何变到FPGA里面去的,也就无法深入的了解如何能够充分运用FPGA。现在的FPGA,不单单是有前面讲的那三块,还有很多专用的硬件功能单元,如何利用好这些单元实现复杂的逻辑电路设计,是从菜鸟迈向高手的路上必须要克服的障碍。而这一切,还是必须先从了解FPGA内部逻辑及其工作原理做起。
2. 错误理解HDL语言,怎么看都看不出硬件结构
HDL语言的英语全称是:Hardware Deion Language,注意这个单词Deion,而不是Design。老外为什么要用Deion这个词而不是Design呢?因为HDL确实不是用用来设计硬件的,而仅仅是用来描述硬件的。
描述这个词精确地反映了HDL语言的本质,HDL语言不过是已知硬件电路的文本表现形式而已,只是将以后的电路用文本的形式描述出来而已。而在编写语言之前,硬件电路应该已经被设计出来了。语言只不过是将这种设计转化为文字表达形式而已。
硬件设计也是有不同的抽象层次,每一个层次都需要设计。最高的抽象层次为算法级、然后依次是体系结构级、寄存器传输级、门级、物理版图级。
使用HDL的好处在于我们已经设计好了一个寄存器传输级的电路,那么用HDL描述以后转化为文本的形式,剩下的向更低层次的转换就可以让EDA工具去做了,这就大大的降低了工作量。这就是可综合的概念,也就是说在对这一抽象层次上硬件单元进行描述可以被EDA工具理解并转化为底层的门级电路或其他结构的电路。
  
在FPGA设计中,就是在将这以抽象层级的意见描述成HDL语言,就可以通过FPGA开发软件转化为上一点中所述的FPGA内部逻辑功能实现形式。HDL也可以描述更高的抽象层级如算法级或者是体系结构级,但目前受限于EDA软件的发展,EDA软件还无法理解这么高的抽象层次,所以HDL描述这样抽象层级是无法被转化为较低的抽象层级的,这也就是所谓的不可综合。
所以在阅读或编写HDL语言,尤其是可综合的HDL,不应该看到的是语言本身,而是要看到语言背后所对应的硬件电路结构。
  
3. FPGA本身不算什么,一切皆在FPGA之外
FPGA是给谁用的?很多学校是为给学微电子专业或者集成电路设计专业的学生用的,其实这不过是很多学校受资金限制,买不起专业的集成电路设计工具而用FPGA工具替代而已。其实FPGA是给设计电子系统的工程师使用的。这些工程师通常是使用已有的芯片搭配在一起完成一个电子设备,如基站、机顶盒、视频监控设备等。当现有芯片无法满足系统的需求时,就需要用FPGA来快速的定义一个能用的芯片。
  
前面说了,FPGA里面无法就是一些“真值表”、触发器、各种连线以及一些硬件资源,电子系统工程师使用FPGA进行设计时无非就是考虑如何将这些以后资源组合起来实现一定的逻辑功能而已,而不必像IC设计工程师那样一直要关注到最后芯片是不是能够被制造出来。
本质上和利用现有芯片组合成不同的电子系统没有区别,只是需要关注更底层的资源而已。要想把FPGA用起来还是简单的,因为无非就是那些资源,在理解了前面两点再搞个实验板,跑跑实验,做点简单的东西是可以的。而真正要把FPGA用好,那光懂点FPGA知识就远远不够了。因为最终要让FPGA里面的资源如何组合,实现何种功能才能满足系统的需要,那就需要懂得更多更广泛的知识。
  
4. 数字逻辑知识是根本
无论是FPGA的哪个方向,都离不开数字逻辑知识的支撑。FPGA说白了是一种实现数字逻辑的方式而已。如果连最基本的数字逻辑的知识都有问题,学习FPGA的愿望只是空中楼阁而已。数字逻辑是任何电子电气类专业的专业基础知识,也是必须要学好的一门课。
如果不能将数字逻辑知识烂熟于心,养成良好的设计习惯,学FPGA到最后仍然是雾里看花水中望月,始终是一场空的。以上四条只是我目前总结菜鸟们在学习FPGA时所最容易跑偏的地方,FPGA的学习其实就像学习围棋一样,学会如何在棋盘上落子很容易,成为一位高手却是难上加难。要真成为李昌镐那样的神一般的选手,除了靠刻苦专研,恐怕还确实得要一点天赋。
  
荐读
1. 入门首先要掌握HDL(HDL=verilog+VHDL)
第一句话是:还没学数电的先学数电。然后你可以选择verilog或者VHDL,有C语言基础的,建议选择VHDL。因为verilog太像C了,很容易混淆,最后你会发现,你花了大量时间去区分这两种语言,而不是在学习如何使用它。当然,你思维能转得过来,也可以选verilog,毕竟在国内verilog用得比较多。
  
接下来,首先找本实例抄代码。抄代码的意义在于熟悉语法规则和编译器(这里的编译器是硅编译器又叫综合器,常用的编译器有:Quartus、ISE、Vivado、Design Compiler 、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然后再模仿着写,最后不看书也能写出来。编译完代码,就打开RTL图,看一下综合出来是什么样的电路。
  
HDL是硬件描述语言,突出硬件这一特点,所以要用数电的思维去思考HDL,而不是用C语言或者其它高级语言,如果不能理解这句话的,可以看《什么是硬件以及什么是软件》。在这一阶段,推荐的教材是《Verilog传奇》、《Verilog HDL高级数字设计》或者是《用于逻辑综合的VHDL》。不看书也能写出个三段式状态机就可以进入下一阶段了。
  
此外,你手上必须准备Verilog或者VHDL的官方文档,《verilog_IEEE官方标准手册-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些语法问题的时候能查一下。
  
2. 独立完成中小规模的数字电路设计
现在,你可以设计一些数字电路了,像交通灯、电子琴、DDS等等,推荐的教材是夏老《Verilog 数字系统设计教程》(第三版)。在这一阶段,你要做到的是:给你一个指标要求或者时序图,你能用HDL设计电路去实现它。这里你需要一块开发板,可以选Altera的cyclone IV系列,或者Xilinx的Spantan 6。
还没掌握HDL之前千万不要买开发板,因为你买回来也没用。这里你没必要每次编译通过就下载代码,咱们用modelsim仿真(此外还有QuestaSim、NC verilog、Diamond的Active-HDL、VCS、Debussy/Verdi等仿真工具),如果仿真都不能通过那就不用下载了,肯定不行的。在这里先掌握简单的testbench就可以了。推荐的教材是《WRITING TESTBENCHES Functional Verification of HDL Models》。
  
3. 掌握设计方法和设计原则
你可能发现你综合出来的电路尽管没错,但有很多警告。这个时候,你得学会同步设计原则、优化电路,是速度优先还是面积优先,时钟树应该怎样设计,怎样同步两个异频时钟等等。
推荐的教材是《FPGA权威指南》、《IP核芯志-数字逻辑设计思想》、《Altera FPGA/CPLD设计》第二版的基础篇和高级篇两本。学会加快编译速度(增量式编译、LogicLock),静态时序分析(timequest),嵌入式逻辑分析仪(signaltap)就算是通关了。如果有不懂的地方可以暂时跳过,因为这部分还需要足量的实践,才能有较深刻的理解。
  
4. 学会提高开发效率
因为Quartus和ISE的编辑器功能太弱,影响了开发效率。所以建议使用Sublime text编辑器中代码片段的功能,以减少重复性劳动。Modelsim也是常用的仿真工具,学会TCL/TK以编写适合自己的DO文件,使得仿真变得自动化,推荐的教材是《TCL/TK入门经典》。
你可能会手动备份代码,但是专业人士都是用版本控制器的,所以,为了提高工作效率,必须掌握GIT。文件比较器Beyond Compare也是个比较常用的工具。此外,你也可以使用System Verilog来替代testbench,这样效率会更高一些。如果你是做IC验证的,就必须掌握System Verilog和验证方法学(UVM)。推荐的教材是《Writing Testbenches using SystemVerilog》、《The UVM Primer》、《System Verilog1800-2012语法手册》。
  
掌握了TCL/TK之后,可以学习虚拟Jtag(ISE也有类似的工具)制作属于自己的调试工具,此外,有时间的话,最好再学个python。脚本,意味着一劳永逸。
  
5. 增强理论基础
这个时候,你已经会使用FPGA了,但是还有很多事情做不了(比如,FIR滤波器、PID算法、OFDM等),因为理论没学好。我大概地分几个方向供大家参考,后面跟的是要掌握的理论课。
 
信号处理 —— 信号与系统、数字信号处理、数字图像处理、现代数字信号处理、盲信号处理、自适应滤波器原理、雷达信号处理
接口应用 —— 如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G以太网接口)、SATA、光纤、DisplayPort
无线通信 —— 信号与系统、数字信号处理、通信原理、移动通信基础、随机过程、信息论与编码
CPU设计 —— 计算机组成原理、单片机、计算机体系结构、编译原理
仪器仪表 —— 模拟电子技术、高频电子线路、电子测量技术、智能仪器原理及应用
控制系统 —— 自动控制原理、现代控制理论、过程控制工程、模糊控制器理论与应用
压缩、编码、加密 —— 数论、抽象代数、现代编码技术、信息论与编码、数据压缩导论、应用密码学、音频信息处理技术、数字视频编码技术原理
  
现在你发现,原来FPGA会涉及到那么多知识,你可以选一个感兴趣的方向,但是工作中很有可能用到其中几个方向的知识,所以理论还是学得越多越好。如果你要更上一层,数学和英语是不可避免的。
  
6. 学会使用MATLAB仿真
设计FPGA算法的时候,多多少少都会用到MATLAB,比如CRC的系数矩阵、数字滤波器系数、各种表格和文本处理等。此外,MATLAB还能用于调试HDL(用MATLAB的计算结果跟用HDL算出来的一步步对照,可以知道哪里出问题)。推荐的教材是《MATLAB宝典》和杜勇的《数字滤波器的MATLAB与FPGA实现》。
    
7. 图像处理
Photoshop
花一、两周的时间学习PS,对图像处理有个大概的了解,知道各种图片格式、直方图、色相、通道、滤镜、拼接等基本概念,并能使用它。这部分是0基础,目的让大家对图像处理有个感性的认识,而不是一上来就各种各样的公式推导。推荐《Photoshop CS6完全自学教程》。
  
基于MATLAB或OpenCV的图像处理
有C/C++基础的可以学习OpenCV,否则的话,建议学MATLAB。这个阶段下,只要学会简单的调用函数即可,暂时不用深究实现的细节。推荐《数字图像处理matlab版》、《学习OpenCV》。
  
图像处理的基础理论
这部分的理论是需要高数、复变、线性代数、信号与系统、数字信号处理等基础,基础不好的话,建议先补补基础再来。看不懂的理论也可以暂时先放下,或许学到后面就自然而然地开窍了。推荐《数字图像处理》。
  
基于FPGA的图像处理
把前面学到的理论运用到FPGA上面,如果这时你有前面第七个阶段的水平,你将轻松地独立完成图像算法设计(图像处理是离不开接口的,上面第五个阶段有讲)。推荐《基于FPGA的嵌入式图像处理系统设计》、《基于FPGA的数字图像处理原理及应用》。
  
进一步钻研数学。要在算法上更上一层,必然需要更多的数学,所以这里建议学习实分析、泛涵分析、小波分析等。