张利平总结的FPGA学习119个要点

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FPGA学习119个要点--张利平

1.FPGA不是编程语言,而是一种可综合的硬件描述语言。

2.Verilog支持两种进程initial和always进程

3.阻塞与非阻塞指的相对于进程本身而言的。

4.使用进程模块的电路类型:

组合电路-----对组合逻辑中使用的所有输入敏感

例子:

always@(a or b or sel)

时序电路-----仅对时钟和控制信号敏感

例子:

always@(posedge clk or negedge clr)

5.可以用case语句完成多路选择器的功能。

6.verilog中有两类子程序:

函数和任务

函数-----根据输入返回一个值

-----产生组合逻辑

-----用在表达式中:assign mult_out=mult(ina,inb);

-----函数是组合逻辑,不能含有任何延时,事件,或者时序控制声明,至少有一个输入变量

总是返回一个变量

-----可以调用函数,但是不能调用任务。

任务-----可以是组合或者寄存器

-----以声明的形式调用任务:stm_out(nxt,first,sel,filter);

-----与其他编程语言中的任务相似

-----与函数不同任务不需要传递参数,而函数要传递参数

-----可以调用任务和函数。

-----可以含有任何延时,事件,或者时序控制声明

-----返回零个或者多个数值

7.可综合的verilog语法子集是指用硬件可以实现的语法。力求用最简单的语言实现最复杂的硬件电路。

8.硬件都有相应的输入输出的接口,或者是输入或者是输出,或者是输入输出。

9.reg型是指组合逻辑里面的一个寄存数据的,wire是组合逻辑里面的一条连线。

10.define定义了一个参数,在整个工程里面都是有效地。parameter定义的一个参数

只在这个文件里面进行适用的。

11.各种逻辑操作符,移位操作符,算术操作符大多是课综合的。

12.assign一般是只针对于组合逻辑,而always语句既可以用于组合逻辑

又可以用于时序逻辑,always模块的敏感表,如果是电平,则为组合逻辑

如果是沿信号posedge或者negedge则为时序逻辑。

13.begin-------end和C语言里面的{}是类似的。

14.for语句-----循环因为综合出来的结果可能比较浪费资源

所以就一般用的比较少,但是在一些特定的设计中可以起到

事半功倍的效果。

15.total logic element总共消耗的逻辑单元。

16.行为级仿真可以理解为功能仿真(前仿真);布局布线后仿真可以理解为时序仿真(后

仿真)

17.第一个写的非常好的代码如下:注意其中clk_div_r和cnt为什么被定义成reg型的,并且对应的含义是什么

module clkdiv(

clk,rst_n,

clk_div

);

input clk;//50MHz

input rst_n;//低电平复位信号

output clk_div;//分频信号,连接到蜂鸣器

//---------------------------------------------------

reg[19:0]cnt;//分频计数器

always@(posedge clk or negedge rst_n)//异步复位

if(!rst_n)cnt<=20'd0;

else cnt<=cnt+1'b1;//寄存器cnt20ms循环计数

//----------------------------------------------------

reg clk_div_r;//clk_div信号值寄存器

always@(posedge clk or negedge rst_n)

if(!rst_n)clk_div_r<=1'b0;

else if(cnt==20'hfffff)clk_div_r<=~clk_div_r;//每20ms让clk_div_r值翻转一次

assign clk_div=clk_div_r;

endmodule

18.时序逻辑中时钟和复位信号是必须的。

19.注意wire赋值的一个问题如下:

wire[2:0]key_an=key_rst_r&(~key_rst)

其相当于如下的一个赋值语句

wire[2:0]key_an;

assign key_an=key_rst_r&(~key_rst);

其实现的效果是一样的。此种方法为:脉冲边沿检测法

20.实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,

极少在RTL级编码中使用for循环,这是因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,

造成巨大的浪费。一般常用case语句代替。

21.FPGA一般触发器资源比较丰富,而CPLD组合逻辑资源更丰富。

22.异步电路和同步时序电路的区别异步电路:

电路核心逻辑有用组合电路实现;??????异步时序电路的最

大缺点是容易产生毛刺;??????不利于器件移植;??????不利于静态时序分析(STA)、验证设计时序性能。同步时序电路:??????电路核心逻辑是用各种触发器实现;??????电路主要信号、输出信号等都是在某个时钟沿驱动触发器产生的;??????

同步时序电路可以很好的避免毛刺;??????利于器件移植;

利于静态时序分析(STA)、验证设计时序性能。

23.led_value_r;//LED值寄存器(可以理解为LED的输出寄存器)

24.assign{led3,led2,led1,led0}=~led_value_r;

//注意这个赋值语句的特点和优点所在。

25.注意在FPGA里面计数器计时到了,即计数器计数到某一位了,就相当于单片机里的延时的功能。

要求注意。

26.如下所示的是一个组合逻辑的功能实现的一个实例:

always@(num)//注意着就是组合逻辑的实现,其中num一旦发生变化,那么对应的case语句就会执行。

case(num)//NUM值显示在两个数码管上

4'h0:sm_dbr<=seg0;

4'h1:sm_dbr<=seg1;

4'h2:sm_dbr<=seg2;

相关文档
最新文档