本篇实现基于叁芯智能科技的SANXIN -B02 FPGA开发板,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。
8 y+ W( `! m \2 ?! o2 A) O
随机存取存储器(random access memory,RAM)又称作"随机存储器"。存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。按照存储单元的工作原理,随机存储器又分为静态随机存储器(Static RAM,SRAM)和动态随机存储器(Dynamic RAM,DRAM)。在FPGA内部的存储块为SRAM。
" o+ e8 E9 m L& j
- 设计要求
+ a7 j" h- f7 L. \, n% L1 R! S
设计一个深度为256,宽度为8的RAM。不需要初始化内容。
% m( d& w; F0 m$ y
RAM,此种存储器支持写操作,支持读操作。在存储器建造时,可以进行初始化数据,也可以不进行初始化数据。RAM的初始化文件也是coe文件,原理和ROM类似。
由于设计RAM深度为256,故而地址的宽度为8位。
. d1 P7 C) h4 {2 }
RAM工作原理为,在时钟上升沿采样到rden为1时,将addr所指示的存储空间的数据进行输出;在时钟上升沿采样到wren为1时,将wdata存储到addr所指示的存储空间中去。
& w4 H# N: _* w- X+ K ?
- 架构设计和信号说明
9 k T, l% d+ E# d9 ^
此模块命名为ram_test。my_ram为ip core。
. d b z4 U/ c( x/ U' R6 v
. F4 c. L7 u1 T5 T( ~0 v
1 T# n9 m/ A8 C- ^. {$ S
9 |; ^, x+ `8 Q- |0 H
* D8 C( C) p0 n+ \9 v
- 调用 ip core 之 RAM8 b$ V, ^( o$ B. g" @
( t+ `% N/ R! r# g" a1 h$ W$ c) P- P" P建好工程之后,右键点击工程,选择New Source,新建IP核。
& c( P1 L/ w* e0 [! h! U. r
3 K; N( { q9 o6 E. t+ z3 a9 r# J( Q3 x
. H4 C6 y4 a# R% B/ @' C
找到对应路径,命名为my_ram。
; |! }/ y; N) `& e
5 M0 b5 r5 P9 g5 W2 x+ N, k! R打开IP核库之后,搜索Block Memory即可看到我们的RAM。
+ d/ @! l7 o8 S- s! M
. {( r% M: {4 N5 F2 w5 C) @- [+ r& ]
点击Next。
) B& X* y) R W; ~6 N/ D0 I9 [
7 U5 q% `+ R# P% L0 }' r2 \
( \2 O! ~! Q/ O" }9 B" z' B
点击Finish。
) E6 L, X. V- I1 ~
3 R6 B2 L4 N. k3 {: Y( W
9 w: t' J: z( F5 g& _$ L) ^
点击Next。
|8 j; Y% N4 n5 ]" ~: k& |
& L6 S k1 d, H
2 L3 h- K8 d2 F. B& C$ j4 t
选择默认的Single Port RAM。点击Next。
1 b! L, H4 T: N0 `+ t i6 Z
4 F9 x* C, R8 R: }8 e
9 F5 O9 h4 |) ^/ Y
数据位宽为8,数据深度为256。Enable选择Always Enable。点击Next。
. m$ B- B$ X$ F( Y" ^! L
- ^1 s& X# o, g* f, v. Y9 n/ W ?
3 [. g M4 Q9 Y) X, H8 Z
+ u) _* @* b, v6 m- M! \( r0 ^
此界面的数据初始化我们不需要做,因为RAM的数据是我们自己写入的,不是提前固化好的,所以这个界面我们保持默认点击Next。
! K& d j9 E2 _
( |. e9 z2 E8 L8 I* j
- S' ? i) w& \3 V0 |
& Y8 Y- v. `) r# G
复位端口同样不使用,如果需要,可以勾选上。我们这里保持默认点击Next。
9 \; P$ D0 F5 Q
4 F) W& E- _6 t2 Q6 N; u7 P' I9 {+ _0 ?5 X/ z9 ^8 V
点击Generate。
! \, g2 n* V, M+ W# G. f
- 顶层设计
$ @- R' \% Q$ j/ Z2 S
顶层负责调用my_ram,例化文件在ipcore_dir -> my_ram.veo中。
6 B% R h2 J p' B7 k3 P设计代码为:
4 K8 Z: k8 u+ J: f3 i7 n
% P* X0 s8 T, n; V0 n, X
% f% W+ S, ^5 o
在某些地址中,写入一些数据,然后读出来。由于写进去后,还需要读出来,所以地址不在使用随机值,固定在0,100,200,255地址写入随机值。
6 ]. o0 h: x& ]2 _3 @$ t
仿真代码为:
7 P0 M [& c+ d) k, E, R S1 d
" K5 r2 r! b u: _: c X4 j& g/ d- Z
5 W3 u( `7 H; w: ~8 J- p( |
经过设置后,进行RTL仿真。
( Z& p5 E* Q- @4 j3 y* m2 F' s; E
5 y. |" O! |1 K0 [) Y通过波形图中,可以看出,在地址为0时,写入数据为36;在地址为100时,写入数据为129;在地址为200时,写入数据为9;在地址为255时,写入数据为99。经过一段时间后,对上述几个地址进行读取,输出的数据与写入数据相同(输出时,输出数据要比地址晚两拍)。