本篇实现基于叁芯智能科技的SANXIN -B02 FPGA开发板,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。
' l( O9 U+ O9 E* I
随机存取存储器(random access memory,RAM)又称作"随机存储器"。存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。按照存储单元的工作原理,随机存储器又分为静态随机存储器(Static RAM,SRAM)和动态随机存储器(Dynamic RAM,DRAM)。在FPGA内部的存储块为SRAM。
5 L, K6 ?. t! ]0 |1 O" S) Q0 j4 O
- 设计要求
- n+ |2 o; J- r3 N0 E8 z4 t/ _
设计一个深度为256,宽度为8的RAM。不需要初始化内容。
9 _3 K5 _+ n$ a% q
RAM,此种存储器支持写操作,支持读操作。在存储器建造时,可以进行初始化数据,也可以不进行初始化数据。RAM的初始化文件也是coe文件,原理和ROM类似。
由于设计RAM深度为256,故而地址的宽度为8位。
$ L+ `! D! m9 z) y/ p8 T
RAM工作原理为,在时钟上升沿采样到rden为1时,将addr所指示的存储空间的数据进行输出;在时钟上升沿采样到wren为1时,将wdata存储到addr所指示的存储空间中去。
$ e7 Z- Y' ?( e5 \+ w4 u1 E
- 架构设计和信号说明 w) g* {' w+ U7 ~
此模块命名为ram_test。my_ram为ip core。
, N) v; k4 i) P$ R3 ^# S- y) y6 w
2 Z. a# j+ g$ D4 B0 \) P2 n) h* D. \ s# A R5 y5 W
3 @5 \# b$ e6 W3 S6 l# d
; ~6 P! g# a0 t3 N
- 调用 ip core 之 RAM
. y# G! m; m F
: I( L4 [5 U' i" w4 x' a
建好工程之后,右键点击工程,选择New Source,新建IP核。
9 F8 c7 Q+ k5 @8 G+ c9 g
+ e5 h4 f3 q! g' v* G4 c2 p% N" j! b5 x
- x. S q9 X+ c
找到对应路径,命名为my_ram。
/ C" r- F) k) G
* e5 ^- m2 S; O- h+ W
打开IP核库之后,搜索Block Memory即可看到我们的RAM。
0 t& c, l& M- }2 ?4 k
2 l0 L3 e) \% h; a3 K2 L( a
! ]) I7 n2 F; p2 A, L w
点击Next。
: \+ G% q' ^6 {% {1 Q: |
' c* s9 I, _& \4 _; z$ M
; i) \+ ~9 `& w0 ^
点击Finish。
4 h! M8 [6 `6 N5 e5 m
2 v$ E5 a* @! q& W+ ?- F+ r
2 W+ Z+ k) A: E& f7 U* B7 F
点击Next。
# H4 Z' ]% A+ ~' G
9 O* K6 q K1 M" k0 n, e$ x$ ]1 l3 T/ S# z5 }2 g, H0 S
选择默认的Single Port RAM。点击Next。
4 f. C2 c! \9 Z8 b5 j0 I
: U4 P$ n$ I; a" U- Q" ] d. X1 }
- w; M* w/ ^$ R; g% x
数据位宽为8,数据深度为256。Enable选择Always Enable。点击Next。
! w1 e9 s+ r/ ` S( ^7 i9 m
! M* S) K5 h; t6 N4 P# i
% O- r! l. x6 H' J3 o
# r; s& l+ O* Z ?0 N
此界面的数据初始化我们不需要做,因为RAM的数据是我们自己写入的,不是提前固化好的,所以这个界面我们保持默认点击Next。
- g2 w7 J- C5 \
6 c5 p5 a; b. G
; [6 `' O) Z( M4 C/ b) L+ P
+ M% ?3 Q. b; t' z5 v% b$ ]0 e2 N
复位端口同样不使用,如果需要,可以勾选上。我们这里保持默认点击Next。
! e. D) T3 s/ ?- Q, e3 R
0 @% T ^+ z- J/ }5 R
2 h' L6 C/ o2 C点击Generate。
9 u9 ]: v. M6 N- l2 i. m, _& t
顶层负责调用my_ram,例化文件在ipcore_dir -> my_ram.veo中。
: s- s7 k8 U! e7 Q0 L, M# c设计代码为:
9 v9 @' |; h/ t; r' H: |( ]- F
- ?' D8 _6 G& t! j5 o
( K9 v0 P, J8 w- n
- RTL仿真
) Q* x' m2 {% G$ t ]
在某些地址中,写入一些数据,然后读出来。由于写进去后,还需要读出来,所以地址不在使用随机值,固定在0,100,200,255地址写入随机值。
) f y4 ]9 k* @/ J6 w仿真代码为:
: y/ n$ e2 u$ M; j! V$ L8 \( B5 O
1 S9 ^7 S" a$ V. z# u
0 h! s2 h/ P0 J9 x3 u4 X$ m) b
经过设置后,进行RTL仿真。
5 a& o3 j- u _6 r# k, _4 I) q" l% c! ?5 @" O+ \ x
通过波形图中,可以看出,在地址为0时,写入数据为36;在地址为100时,写入数据为129;在地址为200时,写入数据为9;在地址为255时,写入数据为99。经过一段时间后,对上述几个地址进行读取,输出的数据与写入数据相同(输出时,输出数据要比地址晚两拍)。