佚名通过本文主要向大家介绍了学习FPGA100个值得注意的要点等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 学习FPGA100个值得注意的要点
描述:
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; //寄存器cnt 20ms循环计数
//----------------------------------------------------
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;
4'h3: sm_dbr <= seg3;
4'h4: sm_dbr <= seg4;
4'h5: sm_dbr <= seg5;
4'h6: sm_dbr <= seg6;
4'h7: sm_dbr <= seg7;
4'h8: sm_dbr <= seg8;
4'h9: sm_dbr <= seg9;
4'ha: sm_dbr <= sega;
4'hb: sm_dbr <= segb;
4'hc: sm_dbr <= segc;
4'hd: sm_dbr <= segd;
4'he: sm_dbr <= sege;
4'hf: sm_dbr <= segf;
default: ;
endcase
27. 乘法器是众多数字系统中的基本模块。从原理上说属于组合逻辑范畴;
但从工程实际设计上来说,它往往会利用时序逻辑设计的方法来实现,属于时序逻辑的
范畴。
28. 一个基本的要求是能够把自己设计的乘法器应用到基本的工程应用实践中。乘法器设计有
两种方法,一种是组合逻辑设计,一种是时序逻辑设计。
29.利用时序逻辑来设计一个16位的乘法器,既然是利用时序逻辑来设计,那么就要利用时钟信号来控制
乘法运算。
30.组合和时序的乘法器的比较:
利用时序设计可以使整体设计具有流水线结构的特征,能适用在各种工程实践中。
31.注意理解乘法器的对应的速度。
32.这里设置了几个内部的寄存器:
reg[15:0] areg; //乘数a寄存器
描述:
fpga
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; //寄存器cnt 20ms循环计数
//----------------------------------------------------
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;
4'h3: sm_dbr <= seg3;
4'h4: sm_dbr <= seg4;
4'h5: sm_dbr <= seg5;
4'h6: sm_dbr <= seg6;
4'h7: sm_dbr <= seg7;
4'h8: sm_dbr <= seg8;
4'h9: sm_dbr <= seg9;
4'ha: sm_dbr <= sega;
4'hb: sm_dbr <= segb;
4'hc: sm_dbr <= segc;
4'hd: sm_dbr <= segd;
4'he: sm_dbr <= sege;
4'hf: sm_dbr <= segf;
default: ;
endcase
27. 乘法器是众多数字系统中的基本模块。从原理上说属于组合逻辑范畴;
但从工程实际设计上来说,它往往会利用时序逻辑设计的方法来实现,属于时序逻辑的
范畴。
28. 一个基本的要求是能够把自己设计的乘法器应用到基本的工程应用实践中。乘法器设计有
两种方法,一种是组合逻辑设计,一种是时序逻辑设计。
29.利用时序逻辑来设计一个16位的乘法器,既然是利用时序逻辑来设计,那么就要利用时钟信号来控制
乘法运算。
30.组合和时序的乘法器的比较:
利用时序设计可以使整体设计具有流水线结构的特征,能适用在各种工程实践中。
31.注意理解乘法器的对应的速度。
32.这里设置了几个内部的寄存器:
reg[15:0] areg; //乘数a寄存器