题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那
DOWNLOAD
来的,首先对整理者表示感谢。
这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一个有志于
FPGA/CPLD
方面发展的工程师学习的。
1
、硬件设计基本原则
(1)
、速度与面积平衡和互换原则
:一个设计如果时序余量较大,所能跑的频率远高于设计要求,能可以通过模块复用来减少整个设计消耗的芯片
面积,这就是用速度优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么可以通过数据流串并转换,并行
复制多个操作模块,对整个设计采用
“
乒乓操作
”
和
“
串并转换
”
的思想进行处理,在芯片输出模块处再对数据进行
“
并串转换
”
。从而实现了用面积复
制换取速度的提高。
(2)
、硬件原则
:理解
HDL
本质
(3)
、系统原则
:整体把握
(4)
、同步设计原则
:设计时序稳定的基本原则
2
、
Verilog
作为一种
HDL
语言,对系统行为的建模方式是分层次的。比较重要的层次有
系统级(
system
)、算法级(
Algorithm
)、寄存器传输
级(
RTL
)、逻辑级(
Logic
)、门级(
Gate
)、电路开关级(
Switch
)。
3
、实际工作中,
除了描述仿真测试激励(
Testbench
)时使用
for
循环语句外,极少在
RTL
级编码中使用
for
循环
,这是因为
for
循环会被综合器
展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,造成巨大的浪费。
一般常用
case
语句代替
。
4
、
if…else…
和
case
在嵌套描述时是有很大区别的,
if…else…
是有优先级的
,一般来说,第一个
if
的优先级最高,最后一个
else
的优先级最低。
而
case
语句是平行语句,它是没有优先级的,而建立优先级结构需要耗费大量的逻辑资源,所以能用
case
的地方就不要用
if…else…
语句。
补充:
1.
也可以用
if…; if…; if…;
描述不带优先级的
“
平行
”
语句。(但是这样容易引入锁存器)
5
、
FPGA
一般触发器资源比较丰富,而
CPLD
组合逻辑资源更丰富
。
6
、
FPGA
和
CPLD
的组成:
FPGA
基本有可编程
I/O
单元、基本可编程逻辑单元、嵌入式块
RAM
、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等
6
部分组成。
CPLD
的结构相对比较简单,主要由可编程
I/O
单元、基本逻辑单元、布线池和其他辅助功能模块组成。
7
、
Block RAM:
3
种块
RAM
结构,
M512 RAM
(
512bit
)、
M4K RAM
(
4Kbit
)、
M-RAM(64Kbit).
M512 RAM:
适合做一些小的
Buffer
、
FIFO
、
DPRAM
、
SPRAM
、
ROM
等;
M4K RAM:
适用于一般的需求
M-RAM:
适合做大块数据的缓冲区。
Xlinx
和
Lattice FPGA
的
LUT
可以灵活配置成小的
RAM
、
ROM
、
FIFO
等存储结构,这种技术被称为
分布式
RAM
。
补充:但是在一般的设计中,不提倡用
FPGA/CPLD
的片内资源配置成大量的存储器,这是处于成本的考虑。所以
尽量采用外接存储器
。
8
、
善用芯片内部的
PLL
(
Phase Locked Loop
模拟锁相环)或
DLL
(
Delay Locked Loop
数字锁相环)资源完成时钟的分频、倍频率、移相等
操作
,不仅简化了设计,并且能有效地提高系统的精度和工作稳定性。
DLL
是基于数字抽样方式,在输入时钟和反馈时钟之间插入延迟,使输入时钟和反馈时钟的上升沿一致来实现的。又称数字锁相环。
PLL
使用了电压控
制延迟,用
VCO
来实现和
DLL
中类试的延迟功能。又称模拟锁相环。功能上都可以实现倍频、分频、占空比调整,但是
PLL
调节范围更大,比如说:
XILINX
使用
DLL
,只能够
2
、
4
倍频;
ALTERA
的
PLL
可以实现的倍频范围就更大毕竟一个是模拟的、一个是数字的。两者之间的对比:对于
PLL
,用的晶振存在不稳
定性,而且会累加相位错误,而
DLL
在这点上做的好一些,抗噪声的能力强些;但
PLL
在时钟的综合方面做得更好些。总的来说
PLL
的应用多
,DLL
则在
jitter power
precision
等方面优于
PLL
。
目前大多数
FPGA
厂商都在
FPGA
内部集成了硬的
DLL
(
Delay-Locked Loop
)或者
PLL
(
Phase-Locked Loop
),用以完成时钟的高精度、低抖动的倍
频、分频、占空比调整移相等。目前高端
FPGA
产品集成的
DLL
和
PLL
资源越来越丰富,功能越来越复杂,精度越来越高(一般在
ps
的数量级)。
Xilinx
芯片
主要集成的是
DLL
,而
Altera
芯片集成的是
PLL
。
Xilinx
芯片
DLL
的模块名称为
CLKDLL
,在高端
FPGA
中,
CLKDLL
的增强型模块为
DCM
(
Digital Clock
Manager
)。
Altera
芯片的
PLL
模块也分为增强型
PLL
(
Enhanced PLL
)和高速(
Fast PLL
)等。这些时钟模块的生成和配置方法一般分为两种,一种是在
HDL
代码和原理图中直接实例化,另一种方法是在
IP
核生成器中配置相关参数,自动生成
IP
。
Xilinx
的
IP
核生成器叫
Core Generator
,另外在
Xilinx ISE 5.x
版本
中通过
Archetecture Wizard
生成
DCM
模块。
Altera
的
IP
核生成器叫做
MegaWizard
。另外可以通过在综合、实现步骤的约束文件中编写约束属性完成时钟模
块的约束。
9
、
异步电路和同步时序电路的区别
异步电路
:
1
/
8
电路核心逻辑有用组合电路实现;
异步时序电路的最大缺点是容易产生毛刺;
不利于器件移植;
不利于静态时序分析(
STA
)、验证设计时序性能。
同步时序电路
:
电路核心逻辑是用各种触发器实现;
电路主要信号、输出信号等都是在某个时钟沿驱动触发器产生的;
同步时序电路可以很好的避免毛刺;
利于器件移植;
利于静态时序分析(
STA
)、验证设计时序性能。
10
、同步设计中,稳定可靠的数据采样必须遵从以下两个基本原则:
(寄存器的建立和保持时间)
(1)
、在有效时钟沿到达前,数据输入至少已经稳定了采样寄存器的
Setup
时间之久,这条原则简称满足
Setup
时间原则;
(2)
、在有效时钟沿到达后,数据输入至少还将稳定保持采样寄存器的
Hold
时钟之久,这条原则简称满足
Hold
时间原则。
11
、同步时序设计注意事项:
异步时钟域的数据转换。
组合逻辑电路的设计方法。
同步时序电路的时钟设计。
同步时序电路的延迟。
同步时序电路的延迟最常用的设计方法是用分频或者倍频的时钟或者同步计数器完成所需的延迟
,
对比较大的和特殊定时要求
的延时,一般用高速时钟产生一个计数器,根据计数产生延迟;对于比较小的延迟,可以用
D
触发器打一下,这样不仅可以使信号延时了一个时钟周
期,而且完成了信号与时钟的初次同步。
在输入信号采样和增加时序约束余量中使用。
另外,还有用行为级方法描述延迟,如
“#5 a<=4’0101;”
这种常
用于仿真测试激励,但是在电路综合时会被忽略,并不能起到延迟作用。
Verilog
定义的
reg
型,不一定综合成寄存器。在
Verilog
代码中最常用的两种数据类型是
wire
和
reg
型,一般来说,
wire
型指定的数据和网线通过组
合逻辑实现,而
reg
型指定的数据不一定就是用寄存器实现。
12
、常用设计思想与技巧
(1)
、乒乓操作;
(2)
、串并转换;
(3)
、流水线操作;
(4)
、异步时钟域数据同步
。
是指如何在两个时钟不同步的数据域之间可靠地进行数据交换的问题。
数据时钟域不同步主要有两种情况:
两个域的时钟频率相同,但是相差不固定,或者相差固定但是不可测,简称为
同频异相问题
。
两个时钟频率根本不同,简称
异频问题
。
两种不推荐的异步时钟域操作方法:一种是通过增加
Buffer
或者其他门延时来调整采样;另一种是盲目使用时钟正负沿调整数据采样。
13
、模块划分基本原则:
(1)
、对每个同步时序设计的子模块的输出使用寄存器(用寄存器分割同步时序模块原则)。
(2)
、将相关逻辑和可以复用的逻辑划分在同一模块内(呼应系统原则)。
(3)
、将不同优化目标的逻辑分开。
(4)
、将送约束的逻辑归到同一模块。
(5)
、将存储逻辑独立划分成模块。
(6)
、合适的模块规模。
(7)
、顶层模块最好不进行逻辑设计。
14
、组合逻辑的注意事项
(1)
、避免组合逻辑反馈环路(容易毛刺、振荡、时序违规等)。
解决:
A
、牢记
任何反馈回路必须包含寄存器
;
B
、检查综合、实现报告的
warning
信息,发现反馈回路(
combinational loops
)后进行相应修改。
(2)
、替换延迟链。
解决:用倍频、分频或者同步计数器完成。
(3)
、替换异步脉冲产生单元(毛刺生成器)。
2
/
8
3
/
8
解决:用同步时序设计脉冲电路。
(4)
、慎用锁存器。
解决:
A
、使用完备的
if…else
语句;
B
、检查设计中是否含有组合逻辑反馈环路;
C
、对每个输入条件,设计输出操作,对
case
语句设置
default
操作。特别是在状态机设计中,最好有一个
default
的状态转移,而且每个状态最好也
有一个
default
的操作。
D
、如果使用
case
语句时,特别是在设计状态机时,尽量附加综合约束属性,综合为完全条件
case
语句。
小技巧:仔细检查综合器的综合报告,目前大多数的综合器对所综合出的
latch
都会报
“warning”
,通过综合报告可以较为方便地找出无意中生成的
latch
。
15
、时钟设计的注意事项
(1)
、同步时序电路推荐的时钟设计方法:
时钟经全局时钟输入引脚输入,通过
FPGA
内部专用的
PLL
或
DLL
进行分频
/
倍频、移相等调整与运算,然后经
FPGA
内部全局时钟布线资源驱动到
达芯片内所有寄存器和其他模块的时钟输入端。
FPGA
设计者的
5
项基本功
《佟林传》里,佟林练的基本功是
“
绕大树、解皮绳
”
,然后才练成了什么
“
鬼影随行、柳叶绵丝掌
”
。
在我看来,成为一名说得过去的
FPGA
设计者,需要练好
5
项基本功:仿真、综合、时序分析、调试、验证。
对于
FPGA
设计者来说,练好这
5
项基本功,与用好相应的
EDA
工具是同一过程,对应关系如下:
1.
仿真:
Modelsim, Quartus II(Simulator Tool)
2.
综合:
Quartus II (Compiler Tool, RTL Viewer, Technology Map Viewer, Chip Planner)
3.
时序:
Quartus II (TimeQuest Timing Analyzer, Technology Map Viewer, Chip Planner)
4.
调试:
Quartus II (SignalTap II Logic Analyzer, Virtual JTAG, Assignment Editor)
5.
验证:
Modelsim, Quartus II(Test Bench Template Writer)
掌握
HDL
语言虽然不是
FPGA
设计的全部,但是
HDL
语言对
FPGA
设计的影响贯穿于整个
FPGA
设计流程中,与
FPGA
设计的
5
项基本功是相
辅相成的。
对于
FPGA
设计者来说,用好
“HDL
语言的可综合子集
”
可以完成
FPGA
设计
50%
的工作
——
设计编码。
练好仿真、综合、时序分析这
3
项基本功,对于学习
“HDL
语言的可综合子集
”
有如下帮助:
1.
通过仿真,可以观察
HDL
语言在
FPGA
中的逻辑行为。
2.
通过综合,可以观察
HDL
语言在
FPGA
中的物理实现形式。
3.
通过时序分析,可以分析
HDL
语言在
FPGA
中的物理实现特性。
对于
FPGA
设计者来说,用好
“HDL
语言的验证子集
”
,可以完成
FPGA
设计另外
50%
的工作
——
调试验证。
1.
搭建验证环境,通过仿真的手段可以检验
FPGA
设计的正确性。
2.
全面的仿真验证可以减少
FPGA
硬件调试的工作量。
3.
把硬件调试与仿真验证方法结合起来,用调试解决仿真未验证的问题,用仿真保证已经解决的问题不在调试中再现,可以建立一个回归验证流程,
有助于
FPGA
设计项目的维护。
FPGA
设计者的这
5
项基本功不是孤立的,必须结合使用,才能完成一个完整的
FPGA
设计流程。反过来说,通过完成一个完整的设计流程,才能
最有效地练习这
5
项基本功。对这
5
项基本功有了初步认识,就可以逐个深入学习一些,然后把学到的知识再次用于完整的设计流程。如此反复,就
可以逐步提高设计水平。采用这样的循序渐进、螺旋式上升的方法,只要通过培训入了门,就可以自学自练,自我提高。
市面上出售的有关
FPGA
设计的书籍为了保证结构的完整性,对
FPGA
设计的每一个方面分开介绍,每一方面虽然深入,但是由于缺少其他相关方面
的支持,读者很难付诸实践,只有通读完全书才能对
FPGA
设计获得一个整体的认识。这样的书籍,作为工程培训指导书不行,可以作为某一个方面
进阶的参考书。
对于新入职的员工来说,他们往往对
FPGA
的整体设计流程有了初步认识,
5
项基本功的某几个方面可能很扎实。但是由于某个或某几个方面能力的
欠缺,限制了他们独自完成整个设计流程的能力。入职培训的目的就是帮助他们掌握整体设计流程,培养自我获取信息的能力,通过几个设计流程来
回的训练,形成自我促进、自我发展的良性循环。在这一过程中,随着对工作涉及的知识的广度和深度的认识逐步清晰,新员工的自信心也会逐步增
强,对个人的发展方向也会逐步明确,才能积极主动地参与到工程项目中来。
2
、
FPGA
芯片速度等级认识(分享)
最初接触
speed grade
这个概念时,很是为
Altera
的
-6
、
-7
、
-8
速度等级逆向排序的方法困惑过一段时间。不很严密地说,
“
序号越低,速度等级越高
”
这是
Altera FPGA
的排序方法,
“
序号越高,速度等级也越高
”
这是
Xilinx FPGA
的排序方法。
riple
从那时起,就一直没搞明白
speed grade
是怎么来的,唯一的概念是:同一款芯片可以有多个速度等级,不同的速度等级代表着不同的性能,不同的
性能又导致芯片价格的巨大差异。脑子里总有一个模模糊糊的推测:
FPGA
厂家为了提高利润,专门给同一款芯片生产了不同的速度等级。
riple
直到一年前和一位学过
IC
设计的同事
hammer
讨论这一问题时,才有了新的认识:对
FPGA
厂家来说,为了得到同一款芯片的不同速度等级而专门设
计不同的芯片版图是不划算的;
所以芯片的速度等级不应该是专门设计出来的,而应该是在芯片生产出来之后,实际测试标定出来的;速度快的芯片
在总产量中的比率低,价格也就相应地高。
riple
这一解答很是合理,纠正了我的一个错误认识。但是我仍然有两点困惑:
1.
是什么因素导致了同一批芯片的性能差异;
2.
如果因素已知,为什么不人为控制这些因素,提高高速芯片的产率,达到既增加芯片厂商的利润又降
低高速芯片价格的目的呢。
riple
前些天在博客里看到
huge
朋友的一篇
FPGA speed grade
,激发了我进一步探索上述问题的动力。通过在网络上搜索,逐步得到了以下一些认识:
riple
1.
芯片的速度等级决定于芯片内部的门延时和线延时,这两个因素又决定于晶体管的长度
L
和容值
C
,这两个数值的差异最终决定于芯片的生产工艺。
怎样的工艺导致了这一差异,我还没找到答案。
riple
2.
在芯片生产过程中,有一个阶段叫做
speed binning
。就是采用一定的方法、按照一组标准对生产出来的芯片进行筛选和分类,进而划分不同的速
度等级。
“
测试和封装
”
应该就包含这一过程。
riple
关于
speed binning
的技术有很多专利:
riple
Integrated circuit with adaptive speed binning
Semiconductor device with speed binning test circuit and test method thereof
Binning for semi-custom ASICs
Method and apparatus for determining wafer quality profiles
Method of sorting dice by speed during die bond assembly and packaging to customer order
Method for prioritizing production lots based on grade estimates and output requirements
3.
速度等级的标定不仅仅取决于芯片本身的品质,还与芯片的市场定位有很大关系,返修概率和成本也是因素之一。
riple
4.
芯片的等级可以在测试后加以具体调整和改善,在存储器芯片的生产中这一技术应用很广泛。
riple
5.
芯片生产的过程是充满各种变数的,生产过程可以得到控制,但是控制不可能精确到一个分子、一个原子,产品质量只能是一个统计目标。同一个
wafer
上的芯片会有差异,即使是同一芯片的不同部分也是有差异的。
速度等级是一个统计数字,反映了一批芯片的某些共同特性,
不代表个别芯片的
4
/
8
质量。而且由于某些芯片的测试是抽样进行的,也不排除个别芯片的个别性能会低于标定的速度等级。不过,据说
FPGA
的测试是极严格的,很可能
我们拿到手的芯片个个都经过了详尽的测试。这也是
FPGA
芯片价格高于普通芯片的原因。
riple
6.
同一等级的芯片中的绝大多数,其性能应该高于该速度等级的划分标准。这也是为什么在
FPGA
设计中,有少许时序分析违规的设计下载到芯片中
仍然能够正常运行的原因(时序分析采用的模型参数是芯片的统计参数,是最保守也是最安全的)。不过,由于同一等级的芯片仍然存在性能差异,
存在时序违规但是单次测试成功的
FPGA
设计不能确保在量产时不在个别芯片上出现问题(出了问题就要返修或现场调查,成本一下子就上去了)。
所以,还是要把时序收敛了才能放心量产,这就是工程标准对产品质量的保证。
riple
7.
概率和统计学源于工程实践,对工程实践又起到了巨大的指导作用。工程实践中的标准都是前人经验教训的积累,是人类社会的宝贵精神财富。
ri
ple
8.
现实世界是模拟的,不是数字的。在考察现实问题时,我们这些数字工程师和软件工程师应该抛弃
“
一是一、〇是〇
”
的观念,用连续的眼光看待这
个连续变化的真实世界。
riple
9.
芯片生产过程中的不确定性导致了芯片的性能差异,这一差异影响了芯片的价格,价格和性能的折中又影响了我们这些
FPGA
设计工程师在器件选
型、设计方法上的决策,我们生产的产品的性价比决定了产品的销售,产品的销量又决定了芯片的采购量,采购量又影响了芯片的采购价格
...
。原子、
分子级别上的差异,就这样一级一级地传递和放大。人类社会就是这样环环相扣,互相制约的。嘿,真是神奇!
3
、转
FPGA
学习
学习
FPGA
我主要经历了这么几个阶段:
①、
Verilog
语言的学习,熟悉
Verilog
语言的各种语法。
②、
FPGA
的学习,熟悉
QuartusII
软件的各种功能,各种逻辑算法设计,接口模块
(RS232,LCD,VGA,SPI,I2c
等
)
的设计,时序分析,硬件优化等,
自己开始设计简单的
FPGA
板子。
③、
NiosII
的学习,熟悉
NiosII
的开发流程,熟悉开发软件
(SOPC,NiosII IDE),
了解
NiosII
的基本结构,设计
NiosII
开发板,编写
NiosII C
语言程
序,调试板子各模块功能。
其实有
C
语言的基础,学起
Verilog
的语言很简单,关键要有并行的概念,所有的
module
,
assign
,
always
都是并行的,这一点与软件语言有
明显不同。这里推荐几本评价比较好的学习
Verilog
的书籍:
①、
《
verilog
数字系统设计教程》
,这本书对于入门是一本很好的书,通俗易懂,让人很快上手,它里面的例子也不错。但本书对于资源优化方面
的编程没有多少涉及到。
5
/
8
②、
《设计与验证
Verilog HDL
》
,这本书虽然比较薄,但是相当精辟,讲解的也很深入,很多概念看了这本书有种豁然开朗的感觉,呵呵。
学习
Verilog
其实不用看很多书,基本的语法部分大家都一样,关键是要自己会灵活应用,多做练习。
Verilog
语言学了一段时间,感觉自己可以编点东西,希望自己编的程序在板子上运行看看结果,下面就介绍我学习的第二个阶段。
刚开始我拿了实验室一块
CPLD
的开发板做练习,熟悉
QuartusII
的各种功能,比如
IP
的调用,各种约束设置,时序分析,
Logiclock
设计方法
等,不过做到后面发现
CPLD
的资源不太够
(
没有内嵌的
RAM
、不能用
SignalTapII
,
LE
太少等
)
,而实验室没有
FPGA
开发板,所以就萌生了自己做
FPGA
开发板的意图,刚好
Cadence
我也学的差不多了,就花了几天时间主要研究了
FPGA
配置电路的设计,在板子上做了
Jtag
和
AS
下载口,在
做了几个用户按键和
LED
,其他的口全部引出作为
IO
口,电路比较简单,板子焊好后一调就通了
(
心里那个爽啊
...)
。我选的
FPGA
是
cycloneII
系列
的
EP2C5
,资源比以前的
FPGA
多了好几倍,还有
PLL
,内嵌的
RAM
,可以试试
SignalTapII
,用内嵌的逻辑分析仪测试引脚波形,
对于
FPGA
的调
试,逻辑分析仪是至关重要的。
利用这块板子我完成了项目中的几个主要功能:
RS232
通信,指令译码,配置
DDS
,
AD
数据高速缓存,电子开关状
态设置等,在实践中学习起来真的比平时快很多,用到什么学什么动力更大。这个时候我主要看的数据有这几本感觉比较好:
①、
《
Altera FPGA/CPLD
设计(基础篇)》
:讲解一些基本的
FPGA
设计技术,以及
QuartusII
中各个工具的用法(
IP
,
RTL
,
SignalProbe
,
Si
gnalTapII
,
Timing Closure Floorplan
,
chip Editor
等),对于入门非常好。
②、
《
Altera FPGA/CPLD
设计(高级篇)》
:讲解了一些高级工具的应用,
LogicLock
,时序约束很分析,设计优化,也讲述了一些硬件编程的
思想,作为提高用。
③、
《
FPGA
设计指南
--
器件,工具和流程》
:这本书看了他的目录忍不住就买了,这本书讲述了
FPGA
设计的各个方面,虽然每个方面都是点到
为止,但能让你有个整体的概念,了解
FPGA
的所有设计功能,了解
FPGA
开发的整个流程。
④、在这里也推荐几个学习
FPGA
比较好的论坛
http://www.edacn.net/bbs
http://www.eetop.cn/
⑤、其实最好的学习网站莫过于
Altera
的官方网站
www.altera.com
,不过很多人一看到英语就不想看,其实上面的英文很简单,很多时候不敢看是
因为对自己没信心或心静不下来看。不过官方网站上资料很多,刚开始可能会觉得资料安排的有点乱,不方便查找,以后有时间我列个资料的链接目
录,整理一下,方便大家查找。
到这里,自己最
FPGA
的学习有一段时间了,练习了很多实例,自己也编写了不少程序,也有了一些项目经验,算是对
FPGA
有些了解了。在不
断的学习中发现
FPGA
不仅可以做逻辑设计,算法设计等,还能做嵌入式开发,
altera
先后开发了
Nios
,
NiosII
两款
FPGA
的嵌入式软核
,并有配套
的软件,刚开始看到这些我真是心中突然豁然开朗,学习真的是无止境,又一个全新的领域摆在我面前,我决定学习
NiosII
,要学就要学最好。
刚开始入门是很痛苦的,
嵌入式设计需要从硬件到驱动到软件全部熟悉
,硬件系统问题还不是很大
(
以前做过单片机,
DSP
等
MCU),
处理器的架
构心里还有点数,对于驱动和软件工程,刚开始学习真的很头痛。
NiosII
应该还算比较新的内容
(
应该是
2004
年出的
)
,国内的书籍不算很多,网上这
方面的资料也比较零碎,所以我就开始将
Altera
网站上这方面的资料系统的看一边,这里推荐几本网站上的
handbook
:
①、
Embedded Design Handbook
6
/
8
②、
Nios II Processor Reference Handbook
③、
Nios II Software Developer's Handbook
④、
Quartus II Handbook, Volume 4: SOPC Builder
⑤、
Quartus II Handbook, Volume 5: Embedded Peripherals
看完这些
handbook
,总算基本明白整个架构,软硬件设计方法,驱动的编写等,感觉自己可以编一些嵌入式的程序了,不过虽然前面做的那块
e
p2c5
的板子支持
NiosII
系统,不过对于嵌入式设计来说还是显得单薄了一点,没有
SDRAM
,
Flash
这两个比较基本的模块,
Ep2C5
内嵌的
RAM
太
小,程序写不大,而且每次总要绞尽脑汁优化程序代码大小,很多时候优化了后函数功能会受到限制,不利于初学者,也不利于调试。所以到这里我
有产生了自己做一块
Nios
开发板的想法
(
直接买比较贵,自己做便宜,而且还能锻炼自己,一举两得
)
,通过借鉴其他开发板,选择自己开发板上需要
包含什么模块,确定各个模块使用什么芯片,阅读各个芯片的
datasheet
,画出原理图并做出
PCB
图,这块板子我选的是
Ep2c8Q208
,比上一块资源
又将近多了一倍,板子上还有以下模块:
SDRAM
,
Flash
,
EPCS4
,
RS232
,
USB,VGA,PS2,AD,DA,LCD
等,满足了一般开发板的配置要求。板子回
来以后调试了四五天,
(flash
工作了,
LCD
显示了,
RS232
通了,
USB
通了,
AD
,
DA
工作了,
SDRAM
正常了
...)
,真是每天都有惊喜,每个模块都
编写了
NiosII
软件测试程序,调试硬件的时候对软件的运行也更熟悉了。在这次调试的过程中真的学到了很多,为此专门写了好几页调试笔记,下次
拿出来和大家一起分享。现在硬件平台有了,
NiosII
也了解的差不多了,终于可以自己编写一些规模大一点的程序了。
以后的路还很长,不过也有很多惊喜在等着我们
4
、
FPGA
牛人的经验谈(转)
这里我谈谈我的一些经验和大家分享,希望能对
IC
设计的新手有一定的帮助,能使得他们能少走一些弯路,欢迎讨论!
我相信
“
如果有梦想,就会实现!
”
在
IC
工业中有许多不同的领域,
IC
设计者的特征也会有些不同。在
A
领域的一个好的
IC
设计者也许会花很长时间去熟悉
B
领域的知识。在我们职业
生涯的开始,我们应该问我们自己一些问题,我们想要成为怎样的
IC
设计者?消费?
PC
外围?通信?微处理器或
DSP
?等等?
IC
设计的基本规则和流程是一样的,无论啥样的都会加到其中。
HDL,FPGA
和软件等是帮助我们理解芯片的最好工具。
IC
的灵魂是知识。因此我们遇
到的第一个挑战将是获得设计的相关信息,然后理解信息并应用它。
但是有些信息不是免费的,我们需要加入一些协会或从如
IEEE/ISO
等那些组织购买一些文档。设计者应该有很强的背景知识来很快的理解他们,甚至
能改进存在的标准或。一个好的设计者应该有足够的设计技能和工具应用知识并且不断的积累他们。
HDL
,计算机仿真和只能解决
ASIC
设计流程的数字部分。如果在
IC
中有任何模拟部分,他将依赖模拟设计者或从另外的厂家购买。甚至一些纯数字
部分也能从另外一些厂家购买以加速上市时间。
那些不是被我们设计的部分称为
IP
,包括
HDL
代码,网表,硬核。
对于我们设计的技术取决于硬核。
一些
IP
是非常贵的,如在
USB2.0
中的
PHY
。一些小的公司没有足够的人力和软件资源来完成有些工作,甚至他们不能在缺货期预定足够的晶原,因
此涉及服务公司取代了他们的工作。但并不是每个
IP
都满足我们的需要,有时我们需要在购买后作一些修改。我们要在设计前决定所要用到的
IPs
。
7
/
8
在设计开始,设计者必须理解所有相关的标准、规范和算法。但是有许多方法来应用这些规范和算法。最好的结构是快速和最小芯片尺寸的结合。不
幸的是,快速的需求常常和最小芯片尺寸的需求是对立的。因此,在
HDL
编码工作前规划一个最优的结构也是一个重要的问题。
以下条款是一些对一个稳步的和成功的设计的建议:(可能有些朋友也指出了其中的部分,我这里只作简要说明,可能稍有不同)
命名风格:
1
不要用关键字做信号名;
2
不要在中用
VERILOG
关键字做信号名;
3
命名信号用含义;
4
命名
I/O
口用尽量短的名字;
5
不要把信号用高和低的
情况混合命名;
6
信号的第一个字母必须是
A-Z
是一个规则;
7
使模块名、实例名和文件名相同;
编码风格:记住,一个好的代码是其他人可以很容易阅读和理解的。
1
尽可能多的增加说明语句;
2
在一个设计中固定编码格式和统一所有的模块,根从项目领导者定义的格式;
3
把全部设计分成适合数量的不同的模
块或实体;
4
在一个
always/process
中的所有信号必须相关;
5
不要用关键字或一些经常被用来安全综合的语法;
6
不要用复杂逻辑;
7
在一个
if
语
句中的所有条件必须相关;
设计风格
1
强烈建议用同步设计;
2
在设计时总是记住时序问题;
3
在一个设计开始就要考虑到地电平或高电平复位、同步或异步复位、上升沿或下降沿触发
等问题,在所有模块中都要遵守它;
4
在不同的情况下用
if
和
case
;
5
在锁存一个信号或总线时要小心;
6
确信所有寄存器的输出信号能够被复位
/
置位;
7
永远不要再写入之前读取任何内部存储器(如
SRAM
)
8
从一个时钟到另一个不同的时钟传输数据时用数据缓冲,他工作像一个双时钟
FIF
O
;
9
在
VHDL
中二维数组可以使用,它是非常有用的。在
VERILOG
中他仅仅可以使用在测试模块中,不能被综合;
10
遵守
register-in register-out
规则;
11
像
synopsys
的
DC
的综合工具是非常稳定的,任何
bugs
都不会从综合工具中产生;
12
确保
FPGA
版本与
ASIC
的版本尽可能的相似,特别
是
SRAM
类型,若版本一致是最理想的;
13
在嵌入式存储器中使用
BIST
;
14
虚单元和一些修正电路是必需的;
15
一些简单的测试电路也是需要
的,经常在一个芯片中有许多测试模块;
16
除非低功耗不要用门控时钟;
17
不要依靠脚本来保证设计。但是在脚本中的一些好的约束能够起到更好
的性能(例如前向加法器);
18
如果时间充裕,通过时钟做一个多锁存器来取代用
MUX
;
19
不要用内部
tri-state, ASIC
需要总线保持器来处理内部
tri-state
;
20
在
top level
中作
pad insertion
;
21
选择
pad
时要小心(如上拉能力,施密特触发器,
5
伏耐压等);
22
小心由时钟偏差引起的问题;
23
不要试着产生半周期信号;
24
如果有很多函数要修正,请一个一个地作,修正一个函数检查一个函数;
25
在一个计算等式中排列每个信号的位数
是一个好习惯,即使综合工具能做;
26
不要使用
HDL
提供的除法器;
27
削减不必要的时钟。它会在设计和布局中引起很多麻烦,大多数
FPGA
有
1
-
4
个专门的时钟通道;
以上是大家在设计中最好遵守的要点,它可以使你的设计更好。