-
FPGA不是编程语言,而是一种可综合的硬件描述语言,我们再描述的时候一定要明白所要设计的是一个怎样的电路。
-
Verilog 支持两种进程initial和always进程,前者只能用在TB(TestBench)中,后者才是可综合的。
-
阻塞与非阻塞指都是相对于进程本身而言的,简单来讲,阻塞用在描述组合逻辑电路,而非阻塞用于时序逻辑电路。
-
使用进程模块的电路类型:
组合电路-----对组合逻辑中使用的所有输入敏感
例子:
always@(a or b or sel)
时序电路-----仅对时钟和控制信号敏感
例子:
always @(posedge clk or negedge clr)always既可以描述组合逻辑,也可以描述时序逻辑。
-
可以用case语句完成多路选择器的功能,但是列举的情况一定要考虑全,否则会产生Latch。
-
verilog中有两类子程序:
函数和任务
函数-----根据输入返回一个值
-----产生组合逻辑
-----用在表达式中:assign mult_out=mult(ina,inb);
-----函数是组合逻辑,不能含有任何延时,事件,或者时序控制声明,至少有一个输入变量
总是返回一个变量
-----可以调用函数,但是不能调用任务。
任务-----可以是组合或者寄存器
-----以声明的形式调用任务:stm_out(nxt,first,sel,filter);
-----与其他编程语言中的任务相似
-----与函数不同任务不需要传递参数,而函数要传递参数
-----可以调用任务和函数。
----- 可以含有任何延时,事件,或者时序控制声明
-----返回零个或者多个数值可综合的verilog语法子集是指用硬件可以实现的语法。力求用最简单的语言实现最复杂的硬件电路。
-
硬件都有相应的输入输出的接口,或者是输入或者是输出,或者是输入输出。
-
reg型是指时序逻辑里面的一个寄存数据,wire是组合逻辑里面的一条连线。
-
define定义了一个参数,在整个工程里面都是有效地。parameter定义的一个参数只在这个文件里面进行适用的。
-
各种逻辑操作符,移位操作符,算术操作符大多是可综合的。
-
assign一般是只针对于组合逻辑,而always语句既可以用于组合逻辑又可以用于时序逻辑,always模块的敏感表,如果是电平,则为组合逻辑,如果是沿信号posedge或者negedge 则为时序逻辑。
-
begin----end和C语言里面的{}是类似的。
-
for 语句-----循环因为综合出来的结果可能比较浪费资源,所以就一般用的比较少,但是在一些特定的设计中可以起到事半功倍的效果。
-
Total logic element总共消耗的逻辑单元。
-
行为级仿真可以理解为功能仿真(前仿真);布局布线后仿真可以理解为时序仿真(后仿真)。
-
时序逻辑中时钟和复位信号是必须的。
-
注意wire赋值的一个问题如下:
wire[2:0] key_an=key_rst_r&(~key_rst)
其相当于如下的一个赋值语句
wire[2:0] key_an;
assign key_an=key_rst_r&(~key_rst);其实现的效果是一样的。此种方法为: 脉冲边沿检测法。
-
实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,极少在RTL级编码中使用for循环,这是因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,造成巨大的浪费。一般常用case语句代替。
-
FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富。