FPGA个人学习总结1Word下载.docx
- 文档编号:18345183
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:17
- 大小:350.97KB
FPGA个人学习总结1Word下载.docx
《FPGA个人学习总结1Word下载.docx》由会员分享,可在线阅读,更多相关《FPGA个人学习总结1Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
寄存器在声明时最好给个初始值,即加载时的值,例如:
reg[1:
0]a=2’b00或直接写0;
复位信号不要列在敏感列表中,直接使用if(rst),使rst成为控制信号
9.如何看出接口读取数据所用的时钟沿
上图可以看出,时钟的下降沿对准数据中心,说明该芯片的此接口是用时钟的下降沿来读取数据的
上图可以看出,时钟的上升沿对准数据中心,说明该芯片的此接口是用时钟的上升沿来读取数据的
故:
如果芯片AB之间有走线延迟的话,那么我们在芯片A要用相反的时钟沿送出数据,经过走线延迟后,芯片B对应接口读取数据的时钟沿正好对准到达芯片B的数据的保持时间,即使最大延迟半个周期,也正好对准数据的中心
10.FPGA内部寄存器都是高复位,综合时综合工具会自动为复位信号反相,
若外部芯片为低复位,则可在FPGA设计时,先将复位信号反相,然后使用if(rst)
11.当控制信号高于slice的供应时,可将控制信号转化为数据信号,例如:
If(a)q<
=b;
转换为q<
=(a&
b)|(!
a&
q);
elseq<
=q;
12.毛刺问题
概念:
由于延迟的作用,多个信号到达终点的时间有先有后,形成了竞争,由竞争产生的错误输出就是毛刺
产生条件:
在同一时刻有多个信号输入发生改变
出现时间:
由于冒险多出现在信号发生电平跳变的时刻,即在输出信号的建立时间内会产生毛刺,而在保持时间内不会出现,
13.调用ram
在建立RAM的IP核时,关于是否选择输出寄存器,根据需要!
选择一个寄存器,数据则在采到地址后,延迟一个时钟周期,才会输出
14.综合后的寄存器
fd为普通的寄存器;
fdr为带复位端的寄存器;
fdre为带复位端和使能端得寄存器
15.寄存器地址注重参数化设计
可以先用define定义相关寄存器的地址参数,然后在运用中使用该参数,如下:
`definereset_addr4'
b1101;
always@(posedgeCLK32MornegedgeRST)
begin
if(!
RST)
begin
SPI_EN<
=8'
b0010_0000;
CTL[7:
1]<
=7'
b1111_101;
RESET<
b1101_0000;
end
elseif(wr_reg==2'
b01)
case(ADDR)
`spi_en_addr:
SPI_EN[7:
0]<
=DATA[7:
0];
`reset_addr:
RESET[7:
……….
则
地址
寄存器名
R/W
默认值
说明
4’b1101
RESET
8’b1101_0000
复位寄存器
当给寄存器的赋值是某一固定值时,为只读寄存器
16.综合问题
将一输入端口赋值给一个寄存器,再将该寄存器赋值给一个wire型输出端口,则在综合后,输入不会赋值给输出,注意上面的输入输出指的是整个工程的输入输出
解决办法:
给输入添加一个ibuf,或者给输出添加一个obuf
有时不必延迟一个时钟周期,而直接将输入赋值给输出
17.时序约束问题
寄存器到寄存器:
过周期约束来设置,一般为实际时钟频率的110%;
输入管脚到寄存器:
通过offsetin来设置,一般为半个时钟周期;
由于上游芯片的数据输出和该FPGA的数据输入使用的是同一个时钟,故如果上游芯片的数据输出采用下降沿,那么FPGA的offsetin就需采用上升沿;
上游芯片的输出到FPGA寄存器之间的延迟可能不到半个周期;
寄存器到输出管脚:
参考
18.系统同步接口和源同步接口的区别
系统同步接口:
上游芯片发送数据的时钟和FPGA接收数据的时钟均为系统时钟,或者FPGA发送数据的时钟和下游芯片接收数据的时钟均为系统时钟;
源同步接口:
上游芯片发送数据给FPGA的同时,也发送接收时钟给FPGA,或者FPGA发送数据给下游芯片的同时,也发送接收时钟给下游芯片。
19.在为寄存器分配地址时,常表示为0x…,这样也表示是十六进制!
20.FPGA设计面积与速度
面积指设计所占用的FPGA逻辑资源数目,即触发器FF和查找表LUT的数目
速度指芯片稳定运行时所能达到的最高频率
实际运用中,存在二者之间的平衡
操作有:
模块复用、乒乓操作、串并转换以及流水线操作,其中流水线操作比较重要。
21.同步电路与异步电路
区别在于电路触发是否与驱动时钟同步,从行为上将就是所有电路是否在同一时钟沿的触发下处理数据。
以复位电路为例,如果在敏感表中使用negedgerst,则为异步电路
设计原则:
在多时钟设计中,使设计做到局部同步,即同一时钟驱动的电路要同步于其同一时钟沿(要么均采用上升沿,要么均采用下降沿),即尽量使用单时钟和单时钟沿。
避免使用门控时钟。
门控时钟是指产生时钟使用了组合逻辑。
门控时钟相关的逻辑不是同步电路,可能带有毛刺。
虽可减小功耗,但随着低功耗FPGA的发展,应尽可能避免使用门控时钟。
禁止在模块内部使用计数器分频来产生所需的时钟,这样会使时序分析变得复杂,产生较大的时钟漂移,浪费时序裕量,降低设计可靠性,不过对于低速系统采用一两个是没太大问题,可以设计成时钟使能电路,参考本目录下其他资料。
同步电路优点:
有效避免毛刺,提高设计可靠性;
简化时序分析过程;
减少工作环境对设计的影响,异步电路受工作温度、电压等影响,器件延时变化较大,异步电路时序变得更加苛刻,导致芯片无法正常工作,而同步电路只要求时钟和数据沿相对稳定,时序要求相对宽松。
22.单片机与ARM
二者都可通过Intel总线或者SPI或者串口与外部芯片通信,并且通过CS信号来选择要通信的芯片,故允许一定数量的芯片挂在Intel总线上
23.FPGA配置过程及配置方式
配置过程:
上电后,FPGA若满足相关条件便会自动进行初始化,初始化完成后DNOE信号将变低,并且以后都会是低电平;
初始化完成后,FPGA会将INIT信号置低,开始清空配置寄存器,清空完后将INIT信号置高;
用户可将PROG或者INIT信号置低,来延长清空寄存器时间(注:
INIT信号为双向端口);
清空寄存器后,FPGA对配置模式管脚M[2:
0]采样,确定数据配置模式;
<
001>
为SPI模式,<
000>
为JTAG模式;
若需重新配置,只需将PROG置低即可,这里不要使用INIT。
配置模式:
根据芯片能否自动加载配置数据,分为主模式、从模式和JTAG模式;
主模式,能自动将配置数据从相应外存储器读入到SRAM中,实现内部结构映射,如我们比较常用SPI模式<
FPGA是基于SRAM工艺的>
;
JTAG模式,数据直接从TDI进入FPGA,完成相应的配置,该模式用来对芯片进行测试。
<
jointtestactiongroup>
24.关于双向端口的综合结果分析
例如:
input[15:
0]data_in,
input[3:
0]work_state,
input[1:
0]cnt_cl,
inout[15:
0]sdram_data,
output[15:
0]data_out,
assignsdram_data=(work_state==W_WR)?
data_in:
16'
bz;
----------------------------
assigndata_out=(cnt_cl==2'
d2)?
sdram_data:
------------------------------------
综合后如下:
语句
综合成下面的BUFT;
当T2=0时,sdram_data输出data_in,当T2=1时,BUFT输出高阻。
需要注意两点:
T1和T2要存在制约关系;
不要去追究太多,程序中的式
就综合成下面的BUFT,式
就综合成上面的BUFT,另外,由于data_out不是双向端口,故可将
式改成:
assigndata_out=(cnt_cl==2'
b0;
这样上面BUFT就会用与门代替(本项目中综合后是这样的)
上面的BUFT就等价于下面的电路:
在功能仿真时,双向端口上如果没有数据,则输出高阻态
25.关于设计中给寄存器赋初值的分析
赋初值后,在程序加载时,会自动为寄存器赋值,避免了在程序初始时刻出现“X”状态
26.SPI系统设计,如下图所示
从SPI接口出来的数据地址总线以及读写命令进入各寄存器模块管理,注意数据收发总线是独立的两组总线;
数据线数据读写,通过地址线高位来控制,个人认为,用高位地址来产生片选,用片选去控制输出端,未被片选时输出高阻态,同时使用片选控读写信号,未被片选时,不进行读写操作;
功能接口只负责数据处理,然后数据送到相关寄存器模块,供外部访问;
对于被选中的寄存器管理模块,在写命令下,将从SPI送来的数据写入到功能接口发送寄存器,将数据从功能接口发送出去,或者也可写入其他相应的寄存器,由寄存器地址决定;
在读命令下,将功能接口接收的数据写入SPI发送寄存器,从而发送到SPI总线上,注意地址要对应。
27.上电加载管脚PROG_B端的电容的容值要合适,在XC3S250E中为10UF,这样才能正确下载程序!
28.在FPGA上板调试过程中,如果相关信号不正确,考虑方向?
查看PCB板上的时钟芯片的时钟频率是否准确;
29.在问题26中,遇见如下问题:
在接口1reg管理模块中,有个寄存器既输出给SPI接口端数据总线,也输出给功能接口1,在功能接口1中,对输入的数据进行了如下操作
4'
b0110:
SERD<
=datain[7];
4'
b0111:
=datain[6];
b1000:
=datain[5];
b1001:
=datain[4];
b1010:
=datain[3];
b1011:
=datain[2];
b1100:
=datain[1];
b1101:
=datain[0];
结果导致从SPI接口读出的数据与写入的不一致
解决办法:
将进入功能接口1的数据,先缓存,再使用,如下
reg[7:
0]datai_delay;
always@(posedgeCK4MornegedgeRST)
if(!
RST)
datai_delay<
elseif(fame_len==4'
b0000)
=datain;
else
datai_delay<
=datai_delay;
再将第一段程序datain换成datai_delay
所以,以后如果多个模块共用一个寄存器的数据,出现错误的话,不妨在某些模块中,将该寄存器数据延迟。
30.在顶层模块中,输出端口由多个模块的输出端口驱动时,综合时报错怎么办?
在各个模块使用使能信号将各个驱动信号变成三态使能门
31.FPGA调试方法
对于在一段时间内,只在一个时钟发生变化的信号,可用点灯来测试该信号的正确性
测试程序是:
当该信号来时,测试灯状态改变,其他时刻保持不变
同理:
对于不循环的计数器的特定也可以这样来测试
程序参考:
regrun_r=1'
b1;
assignrun=run_r;
always@(posedgeCLK32M)
if(!
rst)
run_r<
=1'
elseif(cs_send_ram)
else
=run_r;
对于整个程序,从时序的后端往前端,逐步测试,逐步判断出错的地方
32.关于总线驱动
在CPLD中,用assign语句直接对信号进行驱动,不需要时钟;
同样在FPGA中对信号进行驱动,也采用一样的方法,不要用时钟去采样,直接用assign
33.关于时钟选取的问题
有两个时钟A和B,若要将它们合并成一个时钟C,从而在设计中使用C时钟沿
方法是:
assignC=A&
B,而不要弄成A|B
34.数据选择
问题:
使用x条件判断来从a和b中选择一个赋值给c
错误语言:
Wire[7:
0]a,b,c;
Wirex;
Assignc=(!
x&
a)||(x&
b);
错误原因:
x是一位,a是8位,如何相与?
正确写法:
Assignc=x?
a:
b
注意:
这里的括号并不对多位数据进行逻辑判断(已经综合验证),只有在if等判断语句中才对括号进行逻辑判断
35.FPGA错误排除方法
当得到的信号不正确时,检查该信号在顶层端口是否对应,位宽是否正确
36.FPGA选型
对于中低速信号,选择FPGA主要考虑两个方面:
容量和管脚,其次还有价格和速度
容量:
看FPGA内部的RAM的大小是否够存数据帧,以及RAM的数目是否够用
管脚:
数目是否够用
对于高速信号,才考虑速度
37.BlockRAM和DistributedRAM有什么区别?
较大的存储应用,建议用bram;
零星的小ram,一般就用dram。
但这只是个一般原则,具体的使用得看整个设计中资源的冗余度和性能要求
dram可以是纯组合逻辑,即给出地址马上出数据,也可以加上register变成有时钟的ram。
而bram一定是有时钟的。
如果要产生大的FIFO或timing要求较高,就用BlockRAM。
否则,就可以用DistributedRAM。
在XilinxAsynchronousFIFOCORE的使用时,有两种RAM可供选择,Blockmemory和Distributedmemory。
差别在于,前者是使用FPGA中的整块双口RAM资源,而后者则是拼凑起FPGA中的查找表形成。
38.FIFO核生成时,如下界面:
第一列是选择读写时钟是共用的还是独立的,第二列选择实现FIFO时是使用块RAM还是使用分布式RAM
第一列根据自己需要选择,第二列根据FIFO大小及时序来选择,如37题所述。
注:
各项选择用同一个按钮来选择,而非分开选择
39.板上调试时,有时用示波器测量信号,出现问题是:
无论量哪个管脚,都出来的是50HZ正弦波。
问题出在:
探针的接地断了
40.调试FPGA,信号不输出
当仿真时,某信号不输出或者输出为高阻时,检查方向:
该模块内的信号是否与该模块内被调用模块的信号相对应,包括被调用的IP核
例如A模块内有信号a,A模块内调用了模块B,模块B中的信号b与顶层模块A中的信号a相对应,则在A中,调用要正确,即对应为.b(a)
41.FIFO使用总结
如果使用IP核的RST端口,请注意RST是高复位
42.MCU数据双向端口处理
对于双向端口,要通过片选处理成两个独立的输入端口和输出端口,从而方便挂多个器件。
方法如处理SDRAM双向数据端口一样。
43.MCU读写时序分析
图一
图二
由上图时序分析可知:
单片机在ALE下降沿对准地址中心处,故FPGA用ALE下降沿去采样地址;
单片机在读信号上升沿读取数据,故FPGA要在读信号下降沿给出数据;
单片机在写信号下降沿送出数据,故FPGA在写信号上升沿读取数据。
44.FPGA模块调用问题——可参考项目OPU4中528K(V35网管信息)的FPGA设计
举例:
工程中有相同的4组功能端口,它们实现相同的功能。
在实现一组功能端口的功能后,不需要将该组模块复制3遍,只需要将该组模块在顶层模块例化三遍,改变例化端口名即可。
如下,P是同一个功能接口,x和y是整个工程的输入输出端口,由于有四组端口,故在例化时要给不同的变量名,而四组端口调用同一模块,故a和b不变。
综合时,例化了多少次,rtl级电路中便有多少个该电路模块,ip核同样例化调用。
inputx1,x2,x3,x4;
outputy1,y2,y3,y4;
PU1(.a(x1),.b(y1),……);
PU2(.a(x2),.b(y2),……);
PU3(.a(x2),.b(y2),……);
PU4(.a(x4),.b(y4),……);
45.模块间通信
功能相同,但作用不同的模块不要组合成一个模块。
例如收发寄存器管理模块要分开,各自与收发功能模块相连,这样避免模块间信号交叉,增加电路复杂度
46.“普通IO管脚作时钟信号输入”问题
在ISE工程设计中,如果某个信号(如时钟信号AC97_CLK)是从非专用时钟引脚输入的,但在设计时又是作为时钟使用的,ISE布局布线时也会自动将该信号作为全局时钟信号来布线,因其不是从全局时钟脚接入,故出现上述错误,无法布线成功。
如果不使用全局网络,这时可在约束文件(.ucf)中加上如下约束:
NET"
AC97_CLK"
CLOCK_DEDICATED_ROUTE=FLASE;
这样做是强制ISE不分配全局时钟网络给AC97_CLK,布线就能成功了。
注意:
Xilinx的FPGA时钟管脚一定连着全局时钟管脚
47.对于offsetin/out设置,上下流芯片时钟要与FPGA对应一致
48.差分信号
差分信号(DifferentialSignal)在高速电路设计中的应用越来越广泛,电路中最关键的信号往往都要采用差分结构设计。
何为差分信号?
通俗地说,就是驱动端发送两个等值、反相的信号,接收端通过比较这两个电压的差值来判断逻辑状态“0”还是“1”。
对于高速信号,采用差分信号,可以抗干扰,进入FPGA内部后,通过例化差分转单端模块,将信息转化为单路进行处理,信息的速率不变,信息的内容不变(差分信号两路等值反相)
差分信号一般传输速率较高,因此对信号的完整性有严格要求。
要通过UCF语句在FPGA内部添加差分termination。
INST<
I/O_BUFFER_INSTANTIATION_NAME>
DIFF_TERM="
TRUE/FALSE>
"
49.关于保持时间
FPGA内部触发器所需保持时间很短,故一般设计都满足。
以自加1计数器为例,根据其综合RTL逻辑图,需要保持时间小于寄存器D端到Q端的最小时间与加法器组合逻辑延迟最小时间之和。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 个人 学习 总结