FPGA学习笔记-IP核
时间:2022-09-01 19:30:00
FPGA学习笔记-IP核
文章目录
- FPGA学习笔记-IP核
-
- 一、什么是IP核?
- 二、RAM
-
- 1. RAM特点
- 2. 单端口RAM
- 2. 双端口RAM
- 三、FIFO
-
- 1. 分类
- 2. 参数(请结合代码理解)
- 3. 原理
- 参考文献
本文暂时不完整,需要等待代码部分的后续更新
一、什么是IP核?
IP核,全称知识产权核(英语:Semiconductor Intellectual Property Core),在集成电路中**可重用设计方法学**指一方提供的可重用模块,形式为逻辑单元,芯片设计。
IP设计人员通常通过设计验证IP基于核的设计可以缩短设计所需的周期。[1]IP一方可以通过协议向另一方提供核,也可以由一方单独占有。IP核的概念来源于产品设计的专利证书和源代码的版权。设计师可以IP基于特殊应用积体电路或现场可编程逻辑门阵列/FPGA为了减少设计周期,逻辑设计。
IP分为软核、硬核和固核。软核通常是一个与过程无关的设计代码,具有寄存器传输级硬件描述语言描述,可以进行后续设计;硬核是一系列逻辑综合、布局、布线后的表征文件,具有特定的工艺形式和物理实现;固核通常介于上述两者之间,通过功能验证、时间分析等过程,设计师可以以逻辑门级网表的形式获得。[2]
二、RAM
RAM全称是Random Access Memory,也就是说,随机访问存储器,他可以将数据写入任何指定地址的存储单元,也可以随时单独从任何指定数据。读写速度由时钟频率决定。RAM主要用于存储程序和程序执行过程中产生的中间数据和操作结果。其特点适用于双向数据交换。
Quartus II自带存储器IP核分为RAM IP核和ROM IP核,每个都分为单端口和双端口。双端口分为真双端口和伪双端口/简单双端口。
- 单端口:只有一个端口,读写数据不能同时进行,共享数据通道。
- 伪双端口:有两个数据通道,一个用一个读。
- 真双端口:有两个数据通道,都可以用来读写。
一片RAM分为许多小格,每片容量为36k,这部电影是根据设定的位宽决定的RAM可存放分为几格,位宽一啊不能设置为1、2、4、8、16、32等,每两块相邻RAM可合成一片RAM,这片RAM它也是一个双端口,可以独立完成读写操作,在读写中可以配置位宽。
RAM读写速度一般都很快,所以通常作为操作系统或其他程序的临时数据存储介质。
RAM 存储器可以进一步分为静态随机存储器(SRAM)动态随机存储存储器(DRAM)两大类。SRAM 它具有快速访问的优点,但生产成本相对昂贵。一个典型的应用程序是缓存。 DRAM 由于单位容量价格较低,被广泛用作系统的主存。
**集成在芯片中(FPGA)的RAM属于SRAM,**芯片中的SRAM有以下用途:
- 作为微控制器RAM或者cache(通常从32 bytes到128 kilobytes)
- 作为x86等微处理器的缓存(如L1、L2、L3)
- 作为寄存器(见寄存器堆)
- 用于特定的ICs或ASIC(通常是几千字节量级)
- 用于FPGA与CPLD
1. RAM特点
- 随机存取
所谓的随机访问是指当存储器中的信息被读取或写入时,所需的时间与信息的位置无关。相对而言,串行访问存储器包括顺序访问存储器(如磁带)和直接访问存储器(如磁盘)。
- 易矢性
当电源关闭时 RAM 不能保留数据。若需要保存数据,则必须将其写入长期存储设备(如硬盘)。RAM 和 ROM 两者最大的区别是 RAM 上述数据在断电后会自动消失, ROM 则不会。
- 高访问速度(DRAM较高,SRAM则很高)
现代随机访问存储器几乎是所有访问设备中最快的写入和读取速度。与其他涉及机械操作的存储设备(如硬盘和光盘驱动器)相比,访问延迟也显得微不足道。 DRAM 速度还是不如行动 CPU 缓存用的 SRAM。
- 需要刷新(DRAM)
现代随机访问存储器依赖于存储数据。电容器充满电代表 1(二进制)代表未充电 0.由于电容器或多或少漏电,如果不进行特殊处理,电荷会随着时间的推移逐渐流失,导致数据错误。刷新是指重新为电容器充电,弥补流失了的电荷。DRAM 读取有刷新效果,但一般定期刷新不需要完全读取,只需要作为芯片的一列(Row)选择,可以刷新整个列的数据,所有相关的记忆芯片都可以同时选择相同的列。因此,所有列的刷新都可以在一段时间内逐一完成,所有存储器都可以刷新。随机存取存储器的易失性需要刷新。
- 时钟频率和功耗(SRAM)
SRAM功耗取决于其访问频率。如果高频访问SRAM,其功耗比得上DRAM。有的SRAM全带宽时功耗达到几个瓦特量级。SRAM若用于时钟频率温和的微处理器,其功耗将非常小,在空闲状态下的功耗可忽略不计——几个微瓦特级别。
2. 单端口RAM
单端口RAM只有一个端口,读写都是通过这个端口进行的。RAM只有一组数据总线、地址总线、时钟信号等控制信号。
单端口描述如下:
data:
RAM写数据端口
address:
RAM读写地址端口,读写地址共享同一组地址
wren:
写信号,高电平有效,平时高电平data可以写入口数据
rden:
读使能信号,高电平有效,平时高电平RAM只能读出中间的数据
clken:
控制时钟
aclr:
异步复位信号,高电平有效
inclock\outclock:
单口RAM端口支持双时钟模式和单时钟模式。
双时钟模式:所有输入寄存器,包括数据、地址、wren以及rden输出时钟控制数据输出寄存器。
单时钟模式:没有inclock与outclock只有一个clock信号由单时钟和时钟控制(M9K)存储模块中的所有寄存器。
2. 双端口RAM
**伪双口/简单双口:**两组数据通道,一组读取数据和地址线,一组写数据和地址线,可以同时读写,但不能同时读写同一地址。
**真双口RAM:**两组数据通道,每组都可以用来读写数据和地址线。可以同时读写两个端口,也可以同时写一个端口,读另一个端口。
真双口RAM其实是两个单口RAM组合在一起,只是真正的双口RAM两个单口RAM操作相同的存储空间。
三、FIFO
FIFO全称为First In First Out即先进先出。FPGA使用的FIFO一般指数据存储的先进先出缓存器,常用于数据缓存或告知异步数据交互,即所谓的跨时钟域信号传输。
它与FPGA内部的RAM和ROM区别在于没有外部读写地址线,采用顺序写入数据,顺序读取数据,使用简单方便,由此带来的缺点就是不能像RAM和ROM由地址线决定读取或写入指定地址。
FIFO它是一种常用于异步数据传输的存储器。该存储器的特点是数据先进先出(后进后出)。事实上,无论是从快时钟到慢时钟域,还是从慢时钟到快时钟域,都可以使用多个宽数据的异步传输问题 FIFO 处理。
1. 分类
输入时钟的角度分类:单时钟SCFIFO与双时钟DCFIFO;其中,DCFIFO从输出数据的位宽的角度又可以分为普通双时钟DCFIFO和混合宽度双时钟FIFO(DCFIFO_MIXED_WIDTHS)- SCFIFO:
单时钟FIFO具有一个独立的时钟端口clock,因此,所有的输入输出信号都同步于clock信号。双时钟FIFO结构中,写端口和读端口分别有独立的时钟,所有与写相关的信号都是同步于写时钟wrclk,所有与读相关的信号都是同步于读时钟rdclk。
通常应用于同步时钟的数据缓存。
- DCFIFO:
双时钟FIFO常用于跨时钟域的数据信号的传递,例如时钟域A下的数据datal传递给异步时钟域B,当datal为连续变化信号时,如果直接传递给时钟域B则可能会导致收非所送的情况,即在采集过程中会出现包括亚稳态(数据采样失真)问题在内的一系列问题,使用双时钟FIFO能够将不同时钟域中的数据同步到所需的时钟域中。
2. 参数(请结合代码理解)
FIFO的宽度:FIFO一次读写操作的数据位N;
FIFO的深度:FIFO可以存储多少个宽度为N位的数据;
空标志:对于双时钟FIFO,又分为读空标志rdempty和写空标志wrempty;FIFO已空或将
要空时由FIFO的状态电路送出的一个信号,以阻止继续从FIFO中读出数据而造成无效数据的读出。
满标志:对于双时钟FIFO,又分为读满标志rdfull和写满标志wrfull;FIFO已满或将要写
满时由FIFO的状态电路送出的一个信号,以阻止继续向FIFO中写数据而造成溢出。
读时钟:读FIFO时所遵循的时钟,在每个时钟的上升沿触发。
写时钟:写FIFO时所遵循的时钟,在每个时钟的上升沿触发。
wrusedw:在写时钟域下,FIFO中剩余的数据量;
rdusedw:在读时钟域下,FIFO中剩余的数据量。
3. 原理
工作流程
复位之后,在写时钟和状态信号的控制下,数据写入 FIFO 中。RAM 的写地址从 0 开始,每写一次数据写地址指针加一,指向下一个存储单元。当 FIFO 写满后,数据将不能再写入,否则数据会因覆盖而丢失。
FIFO 数据为非空、或满状态时,在读时钟和状态信号的控制下,可以将数据从 FIFO 中读出。RAM 的读地址从 0 开始,每读一次数据读地址指针加一,指向下一个存储单元。当 FIFO 读空后,就不能再读数据,否则读出的数据将是错误的。
FIFO 的存储结构为双口 RAM,所以允许读写同时进行。典型异步 FIFO 结构图如下所示。端口及内部信号将在代码编写时进行说明。
读写时刻
关于写时刻,只要 FIFO 中数据为非满状态,就可以进行写操作;如果 FIFO 为满状态,则禁止再写数据。
关于读时刻,只要 FIFO 中数据为非空状态,就可以进行读操作;如果 FIFO 为空状态,则禁止再读数据。
不管怎样,一段正常读写 FIFO 的时间段,如果读写同时进行,则要求写 FIFO 速率不能大于读速率。
读空状态
开始复位时,FIFO 没有数据,空状态信号是有效的。当 FIFO 中被写入数据后,空状态信号拉低无效。当读数据地址追赶上写地址,即读写地址都相等时,FIFO 为空状态。
因为是异步 FIFO,所以读写地址进行比较时,需要同步打拍逻辑,就需要耗费一定的时间。所以空状态的指示信号不是实时的,会有一定的延时。如果在这段延迟时间内又有新的数据写入 FIFO,就会出现空状态指示信号有效,但是 FIFO 中其实存在数据的现象。
严格来讲该空状态指示是错误的。但是产生空状态的意义在于防止读操作对空状态的 FIFO 进行数据读取。产生空状态信号时,实际 FIFO 中有数据,相当于提前判断了空状态信号,此时不再进行读 FIFO 数据操作也是安全的。所以,该设计从应用上来说是没有问题的。
写满状态
开始复位时,FIFO 没有数据,满信号是无效的。当 FIFO 中被写入数据后,此时读操作不进行或读速率相对较慢,只要写数据地址超过读数据地址一个 FIFO 深度时,便会产生满状态信号。此时写地址和读地址也是相等的,但是意义是不一样的。
此时经常使用多余的 1bit 分别当做读写地址的拓展位,来区分读写地址相同的时候,FIFO 的状态是空还是满状态。当读写地址与拓展位均相同的时候,表明读写数据的数量是一致的,则此时 FIFO 是空状态。如果读写地址相同,拓展位为相反数,表明写数据的数量已经超过读数据数量的一个 FIFO 深度了,此时 FIFO 是满状态。当然,此条件成立的前提是空状态禁止读操作、满状态禁止写操作。
同理,由于异步延迟逻辑的存在,满状态信号也不是实时的。但是也相当于提前判断了满状态信号,此时不再进行写 FIFO 操作也不会影响应用的正确性。
参考文献
维基百科: 半导体IP核
维基百科: 随机存取存储器/RAM
维基百科: 静态随机存取存储器/SRAM
菜鸟教程: 4.4 Verilog FIFO设计