片上存储器原型设计
Tags
On-chip Memory Architecture
Memory Interface Design
Digital Signal Processing Design
Last edited by
AI summary
本文讨论了片上存储器的原型设计,包括其分类、优缺点及应用场景,特别强调了FIFO的使用。片上存储器适用于缓存而非大规模数据存储,FIFO用于跨时钟域处理和带宽转换。文中还提供了FIFO的架构设计、读写状态判断及存储器读写程序设计的详细信息。
Last edited time
Nov 5, 2024 01:59 PM
第一节:On-chip-memery1.1 On-chip-memory1.1.1 On-chip-memery分类1.1.2 On-chip-memery标准参考接口1.2 FIFO1.2.1 FIFO应用场景第二节:FIFO原型设计2.1 架构设计2.2 关于读写状态判断2.3 存储器读写程序设计2.4 写地址计算与状态判断2.5 读地址计算与状态判断2.6 原型验证第三节:vivado工具
第一节:On-chip-memery
存储器是数字电路设计中必不可少的电路,我们的设计电路的核心是数据,任何情况下数据始终是我们的电路设计的要素,只要有数据,就会存有储电路参与,对于数字电路设计者而言,熟悉掌握存储器的应用是基本技能。
从数据电路设计的应用角度来说,存储器分为片上存储器(on-chip-memery)和片外存储器。
On-chip-memery:存储器被集成在设计电路中,对于FPGA而言,存储器在其内部,对于ASIC而言,存储器被集成在设计电路中。
优点:读写数据延迟小,随时读写,读写操作简单
缺点:由于是作为设计电路的一部分,因此占用设计资源,存储量非常小
片外存储器 :存储器独立于设计电路,2个独立电路需要特定的引脚连接
优点:存储量大,可以存储大批量数据
缺点:读写延迟较大,读写操作复杂
1.1 On-chip-memory
On-chip-memery由于作为设计电路一部分,占用设计资源,因此存储数据量非常小,如果存储数据量较大,不适合用片上存储器。
在实际应用选中,片上存储器在设计中用于缓存,而不是用于数据存储器。
缓存:零时存储器,一般加快数据读写
数据存储器:真正用来存储数据
应用中存储器 = 缓存 + 数据存储器
1.1.1 On-chip-memery分类

Rom:一般用于lut(查找表)/复杂译码电路
Ram: 一般缓存数据,随机读写用双端口ram,顺序读写用fifo
1.1.2 On-chip-memery标准参考接口
写操作接口
wr_clk
:写时钟wr_en
:写使能wrdata[W-1:0]
:写数据读操作接口
rd_clk
:读时钟rd_en
:读使能,有时可以忽略rddata[W-1:0]
:读数据rdaddr[A-1:0]
/读存储状态标志 :写地址/读状态标志1.2 FIFO
这里重点介绍FIFO,在数字电路设计中FIFO是On-chip-memery中使用率最高的,它是双端口ram的一种特殊结构,它和双端口ram的本质区别是顺序读写。
对于ram的2种读写方式,有着本质的区别,操作要求如下:
随机读写:
写数据:往指定的地址空间写入数据,当我们往同一地址空间写数据,之后的数据会覆盖掉之前的数据。
读数据:从指定的地址空间读出数据,当我们从同一地址空间读取数据,数据会反复被读出
顺序读写:
写数据:从开始地址空间按顺序写数据,同一地址空间只能写一次数据,不支持数据覆盖
读数据:从开始的地址空间按书序读出数据,同一地址空间只能读出一次数据(必须有有效数),不支持反复读数据。
1.2.1 FIFO应用场景
- 跨域处理

Clk1和clk2是2个不同的时钟,有可能是同步时钟,也有可能是异步时钟,我们把这2个电路系统叫做跨时钟域系统。
如果clk1和clk2是相关时钟,这2个系统为同步跨时钟域,否则异步跨时钟域。
无论是同步跨时钟域还是异步跨时钟域,为了保证2个电路系统能够稳定采样到数据,需要在这2个时钟域之间加缓存。
- 带宽转换
现在片上存储器读写支持带宽转换,但是数据位宽之间的比例必须是2n倍的关系,满足如下关系:
K为2n是
wrdata[k-1:0]
rddata[N*K-1:0]
rddata[k-1:0]
wrdata[N*K-1:0]

- 缓存
在数字电路设计中任何情况都必须保证总带宽匹配(读带宽>=写带宽),当总带宽匹配的情况下保证了数据的稳定性,但是即使总带宽匹配了,有可能会存在瞬时带宽不匹配,数据稳定性不能完全保证。
总带宽 :是数字电路设计的关键指标,任何电路保证总带宽匹配,在我们规定时间时间内数据传输的带宽。

电路总带宽 = XBITMAX/T (Xbit表示时间轴上T时间内最大数据量,T:突发周期)
瞬时带宽:在突发周期内某一时间的带宽

最小深度计算
burst_length
:突发数据个数X,Y
:读时钟周期里,每Y个时钟周期会有X个数据读出FIFOr_clk
:读时钟w_clk
:写时钟读数据有效频率=
r_clk*(X/Y)
写时钟周期 =
1/w_clk
一个写周期内可以读出的数据个数 =
(1/w_clk * r_clk*(X/Y))
在突发周期内读出的数据个数 =
bl*(1/w_clk * r_clk*(X/Y))
在突发周期内未读出的数据个数 =
bl- bl*(1/w_clk * r_clk*(X/Y))
=
bl- bl*( r_clk /w_clk *(X/Y))
Fifo最小深度 =
2*bl- 2*bl*( r_clk /w_clk *(X/Y))
第二节:FIFO原型设计
需求:
- 不支持带宽转换
- 数据位宽8位
- 深度为16
2.1 架构设计

2.2 关于读写状态判断

2.3 存储器读写程序设计
功能:存储块读写

信号名 | 描述 |
写数据相关 | ㅤ |
wr_clk | 写时钟 |
wr_en | 写使能 |
wrdata[7:0] | 写数据 |
wraddr[3:0] | 写地址 |
full | 写状态标志 |
读数据相关 | |
rd_clk | 读时钟 |
rd_en | 读使能 |
rddata[7:0] | 读数据 |
rdaddr[3:0] | 读地址 |
empty | 读状态标志 |
2.4 写地址计算与状态判断

功能:计算写地址,判断写状态
信号名 | 描述 |
系统相关 | ㅤ |
rst_n | 系统复位 |
写操作相关 | ㅤ |
wr_en | 写使能 |
wr_clk | 写时钟 |
输出写地址与状态 | ㅤ |
wraddr[3:0] | 存储块写地址 |
full | 当full==1表示满 |
存储块状态判断有关地址 | ㅤ |
wraddr_e[4:0] | 扩位后写地址 |
rdaddr_e[4:0] | 扩位后读地址 |
2.5 读地址计算与状态判断

功能:计算存储块读地址,判断状态
信号名 | 描述 |
系统相关 | ㅤ |
rst_n | 系统复位 |
写操作相关 | ㅤ |
rd_en | 读使能 |
rd_clk | 读时钟 |
输出写地址与状态 | ㅤ |
rdaddr[3:0] | 存储块读地址 |
当empty ==1表示空 | |
存储块状态判断有关地址 | ㅤ |
wraddr_e[4:0] | 扩位后写地址 |
rdaddr_e[4:0] | 扩位后读地址 |
2.6 原型验证
- 写fifo验证

- 读FIFO正常输出模式验证


- 读fifo超前输出模式验证
由于FIFO读数据时顺序读,因此数据可以超前输出


- 边写边读验证

第三节:vivado工具

Loading...