|
原文链接: https://mp.weixin.qq.com/s/aWW5JK12Kt3hA-1lgqPsUQ
1. FPGA学习时使用的 VHDL 和 verilog HDL 不是编程语言,而是一种可综合的硬件描述语言,我们在描述的时候一定要明白所要设计的是一个怎样的电路。
2. 当今社会做开发用的 Verilog HDL 语言偏多,Verilog HDL 支持两种进程 initial 和 always 进程,前者只能用在TB(TestBench)中,后者才是可综合的。
3. 阻塞与非阻塞指都是相对于进程本身而言的,简单来讲,阻塞用在描述组合逻辑电路,而非阻塞用于时序逻辑电路。
4. 使用进程模块的电路类型:
组合电路-----对组合逻辑中使用的所有输入敏感
例子:
always@(a or b or c)
时序电路-----仅对时钟和控制信号敏感
例子:
always @(posedge clk or negedge rst_n)
always既可以描述组合逻辑,也可以描述时序逻辑。
5. 可以用case语句完成多路选择器的功能,但是列举的情况一定要考虑全,否则会产生Latch。
6. verilog中有两类子程序:
函数和任务
函数-----根据输入返回一个值
-----产生组合逻辑
-----用在表达式中:assign mult_out=mult(ina,inb);
-----函数是组合逻辑,不能含有任何延时,事件,或者时序控制声明,至少有一个输入变量
总是返回一个变量
-----可以调用函数,但是不能调用任务。
任务-----可以是组合或者寄存器
-----以声明的形式调用任务:stm_out(nxt,first,sel,filter);
-----与其他编程语言中的任务相似
-----与函数不同任务不需要传递参数,而函数要传递参数
-----可以调用任务和函数。
----- 可以含有任何延时,事件,或者时序控制声明
-----返回零个或者多个数值
可综合的verilog语法子集是指用硬件可以实现的语法。力求用最简单的语言实现最复杂的硬件电路。
7. 硬件都有相应的输入输出的接口,或者是输入或者是输出,或者是输入输出。
8. reg 型是指时序逻辑里面的一个寄存数据(寄存机类型),wire 是组合逻辑里面的一条连线(线型)。
9. define 定义了一个参数,在整个工程里面都是有效地使用。parameter 定义的一个参数只在当前文件里面进行使用。
10. 各种逻辑操作符,移位操作符,算术操作符大多是可综合的。
11. assign一般是只针对于组合逻辑,而always语句既可以用于组合逻辑又可以用于时序逻辑,always模块的敏感表,如果是电平,则为组合逻辑,如果是沿信号posedge或者negedge 则为时序逻辑。
12. begin----end和C语言里面的{}是类似的。
13. for 语句-----循环因为综合出来的结果可能比较浪费资源,所以就一般用的比较少,但是在一些特定的设计中可以起到事半功倍的效果。
14. Total logic element 总共消耗的逻辑单元。
15. 行为级仿真可以理解为功能仿真(前仿真);布局布线后仿真可以理解为时序仿真(后仿真)。
16. 时序逻辑中时钟和复位信号是必须的。
17. 注意wire赋值的一个问题如下:
wire[2:0] key_an=key_rst_r&(~key_rst)
其相当于如下的一个赋值语句
wire[2:0] key_an;
assign key_an=key_rst_r&(~key_rst);
其实现的效果是一样的。
此种方法为: 脉冲边沿检测法。
18. 实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,极少在RTL级编码中使用for循环,这是因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,造成巨大的浪费。一般常用case语句代替。
19. FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富。
20. FPGA使用的两种语言:VHDL 和 verilog HDL 。
VHDL 为美国国防部发明,用于较多的设计人员合作完成的特大型项目(一百万门以上),语法/结构比较严谨,因为编写出的模块风格清晰。
verilog HDL 第三方支持工具较多,语法结构比VHDL简单,学习来比较容易,仿真工具比较好用,测试激励模块容易编写。
21. 时序设计的实质:电路设计的难点在于时序设计,实质就是满足么一个触发器 建立时间/保持时间 的要求。
(备注:建立时间:触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间;保持时间:触发器在时钟上升沿到来之后,触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间。)
22. 为什么触发器要满足建立时间和保持时间?
因为触发器内部数据的形成是需要一定的时间的,如果不满足建立和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在0和1之间变化,这时需要经过一个恢复时间,其输出才能 稳定,但稳定后的值并不一定是你的输入值。这就是为什么要用两级触发器来同步异步输入信号。这样做可以防止由于异步输入信号对于本级时钟可能不满足建立保持时间而使本级触发器产生的亚稳态传播到后面逻辑中,导致亚稳态的传播。
23. 锁存器(latch)和触发器(flip-flop)区别?
电平敏感的存储器件称为锁存器。可分为高电平锁存器和低电平锁存器,用于不同时钟之间的信号同步。
有交叉耦合的门构成的双稳态的存储原件称为触发器。分为上升沿触发和下降沿触发。可以认为是两个不同电平敏感的锁存器串连而成。前一个锁存器决定了触发器的建立时间,后一个锁存器则决定了保持时间。
24. and so on.
最后,我们来简单聊一聊FPGA的应用范围。FPAG的应用越来越广泛,航天航空、汽车驾驶、医疗、广播、测量测试、消费电子、工业控制、计算机设备、武器装备等等。从应用场景角度分析,我们可以看到随着谷歌的阿尔法狗打败了人类围棋冠军后,深度学习已经从神坛走下来,越来越多的人开始认识到深度学习可能会改变未来的生活,成为未来科技发展的方向;而FPGA设计工具使其对深度学习领域经常使用的上层软件兼容性更强,FPGA正是助力深度学习的一大技术。不同于CPU的是,FPGA和GPU内都有大量的计算单元,因此它们的计算能力都很强。在进行神经网络运算的时候,两者的速度会比CPU快很多。但是GPU由于架构固定硬件原生支持的指令固定了,而FPGA则是可编程的。
随着国家综合实力越来越强大,国民经济越来越好,FPGA从之前的运用广泛的军工行业在慢慢延伸到民用行业,并且会越来越广泛。 |
|