学号:16010199021
姓名:李若宇
转载自 http://blog.csdn.net/sun19910114/article/details/38683703(有删改)
嵌牛导读:fpga的学习是一条漫长又艰辛路程,需要我们不断记录
嵌牛鼻子:FPGA
嵌牛提问:在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寄存器
reg[15:0] breg; //乘数b寄存器
reg[31:0] yout_r; //乘积寄存器
这里之所以设置成寄存器类型的是为了后面的
完成相应的以为和累加的过程。
33.max232在传输电平的过程中如果传输数据没有开始前,则TX和RX是一直保持为高电平的。
34.SDRAM比较SRAM
因为制造工艺的原因,SDRAM比SRAM的读写速度要慢一些,并且容量比SRAM要大一些
但是 控制起来相对复杂,而且要不停的刷新。
SRAM 控制起来相对简单,不需要定时进行刷新操作。
35.无论是读写一个对应的芯片 还是自己编写一个IIC的通信协议 :
那么必须搞清楚的是时序图问题,即读写时序必须搞清楚。
36.对FPGA必须强势,没有退路。
37.HY57V641620ET-7 是最常用的SDRAM容量是64M 位宽是16位的。
38.注意FPGA进行代码下载时AS口是把代码配置到EPCS 中,JTAG口不是配置到EPCS中
这一点要求要注意。
39.M4K 指的就是4K bit的存储容量。
40.注意FPGA中存储器的设计。存储器的工作原理是:
存储器为每一个存储单元编写一个地址,
因此,只有地址指定的那些存储单元才能够
与公共的IO连接,然后进行存储数据的读/写操作。
通常存储器分为:
只读存储器(ROM),随机存储器(RAM) 顺序存储器和直接存储器。
41.只读存储器ROM:
ROM是一种重要的时序逻辑存储电路,它的逻辑功能是在地址信号的选择下,
从指定的存储单元中读取相应的数据。ROM只能进行数据的读取,而不能修改或者
写入新的数据。
42.注意PLL的对应一个对应的应用,PLL产生的时钟从频率和相位上都比较稳定,而且
其时钟网络延时都比内部逻辑产生的分频时钟要小的多。
43.做顶层PPL,如果我们要看c0和c1的对应输出 ,哪怕是在仿真里面看其输出的对应结果
也要求把c0 c1定义成reg(寄存器)型,如果不作为输出,即如果作为另外两个always
语句的驱动时钟,那么就不用定义成寄存器类型的变量,而相应的其只是在内部起到连线、
作用,那么就可以(必须)定义成wire型的变量。
44.要注意FPGA中总线和总线的操作。
45.通过加法器和乘法器等一些基本模块,讨论流水线的一些基本概念。
46.所谓流水线设计实际上就是把规模较大,层次较多的组合逻辑电路分为几个级,在
每一级插入寄存器组并暂存中间数据。K级的流水线就是从组合逻辑的输入到组合逻辑
的输出恰好有K个寄存器组(分为K级,每一级都有一个寄存器组),上一级的输出
是下一级的输入而且没有反馈的电路。
47.流水线设计在性能上的提高是以消耗较多的存储器资源为代价的。
48.流水线处理是提高组合逻辑设计的处理速度和吞吐量的最常用的手段。
49.流水线处理方式之所以能提高时钟频率,是因为复制了处理模块,它是面积换取
速度思想的一种具体体现。
50.数字逻辑的门类千变万化,但就其本质而言,只有组合逻辑和时序逻辑两大类。