本篇实现基于叁芯智能科技的SANXIN -B02 FPGA开发板,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。
8 q4 t$ g1 c# F, ~ |
随机存取存储器(random access memory,RAM)又称作"随机存储器"。存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。按照存储单元的工作原理,随机存储器又分为静态随机存储器(Static RAM,SRAM)和动态随机存储器(Dynamic RAM,DRAM)。在FPGA内部的存储块为SRAM。
3 Z$ M9 j- ^& z6 O0 W
- 设计要求/ k: ?2 M) h5 f9 k4 q, e+ _5 `
设计一个深度为256,宽度为8的RAM。不需要初始化内容。
8 m, L" q# F/ ^' d6 K6 M( S6 O8 n
RAM,此种存储器支持写操作,支持读操作。在存储器建造时,可以进行初始化数据,也可以不进行初始化数据。RAM的初始化文件也是coe文件,原理和ROM类似。
由于设计RAM深度为256,故而地址的宽度为8位。
8 Q- ]$ d3 r0 E2 {( F2 X
RAM工作原理为,在时钟上升沿采样到rden为1时,将addr所指示的存储空间的数据进行输出;在时钟上升沿采样到wren为1时,将wdata存储到addr所指示的存储空间中去。
7 t4 c+ W& a! x. R5 n
- 架构设计和信号说明& M/ _' O& p* G, y+ s5 G4 T
此模块命名为ram_test。my_ram为ip core。
7 s& |- a- N( T* X2 e7 M
% T& G3 S) S, x
; _9 m- B9 N4 ~) x
3 c% P$ }) b5 j1 M5 B& |
2 p1 }7 V: [6 W
- 调用 ip core 之 RAM
9 N7 M7 N1 h2 n* m. O
" J) w( a' g0 _: ?) y* N建好工程之后,右键点击工程,选择New Source,新建IP核。
, s8 f1 z1 g0 T' E& \7 b
) g' @: L' f9 F3 d, Q2 ?0 x
- q2 V/ h0 C" q M$ o" f) R
; y$ n+ K. W2 M3 z
找到对应路径,命名为my_ram。
) P( |+ _6 M9 i3 d( I( `4 R( f4 i
% G# q7 z4 E) m7 B( M n
打开IP核库之后,搜索Block Memory即可看到我们的RAM。
6 t5 c) O8 o) ?1 k5 j
3 p) Q4 X* k' F: _1 t0 Z3 h
. L3 d m, Z# z1 k% e- w$ ]! W
点击Next。
0 z( x% Y: x. m& G7 x4 g
" m2 ]# r# N4 |
/ a2 @; y3 S }
点击Finish。
. K. e6 B& S" ], W, n
+ g+ R4 A* i( c+ G' ?! I
|: C% j _7 p' T6 M2 [' T
点击Next。
0 B3 l9 x/ J8 [" a" a. J
- {/ S {6 q2 q
! l1 O( x& a" a& a8 e9 y5 d
选择默认的Single Port RAM。点击Next。
( A E5 B; ^& ]9 L% `3 C
3 m. b$ r4 b0 H5 W3 w, o$ ]' v0 S7 x! e# {4 B" Q& o3 ~
数据位宽为8,数据深度为256。Enable选择Always Enable。点击Next。
9 h; j' |, v- G0 {3 i& R0 u/ O. p
0 Y& I6 L; |/ K# ~( }4 Y. w0 Y! @- G% I9 A, n
: g8 d7 k3 E$ E2 K+ G& f
此界面的数据初始化我们不需要做,因为RAM的数据是我们自己写入的,不是提前固化好的,所以这个界面我们保持默认点击Next。
Y1 M; W9 G1 T. m; W5 w
4 j. m$ g0 h# q* O. a
% m/ ^- W% G" r/ x: |6 m+ q: p; V
1 u9 A/ B3 V- G8 N6 w& k
复位端口同样不使用,如果需要,可以勾选上。我们这里保持默认点击Next。
% P6 h Y1 K& }( a5 Q
. s& F1 g3 z% u4 H2 t- H
* n3 Z8 x8 h+ o7 \6 M点击Generate。
3 _$ c* N: g* z' O6 i顶层负责调用my_ram,例化文件在ipcore_dir -> my_ram.veo中。
* E; A- t3 h3 X+ L设计代码为:
3 w7 L6 t7 g3 L7 v% B
! Z8 c8 ^8 W3 W/ N& t- ^+ L8 Z* ^0 b* D; @/ u
- RTL仿真" h9 o) M, s' L' L5 j
在某些地址中,写入一些数据,然后读出来。由于写进去后,还需要读出来,所以地址不在使用随机值,固定在0,100,200,255地址写入随机值。
) }1 x. X1 T) ~# P
仿真代码为:
5 k& p' q k3 D0 y) Q$ H
9 T: `5 H6 N- T2 E' h8 {, R. o8 u6 J) e* u: ?
经过设置后,进行RTL仿真。
2 ?# f! O4 s" C8 e/ h8 D% E) K3 Q
通过波形图中,可以看出,在地址为0时,写入数据为36;在地址为100时,写入数据为129;在地址为200时,写入数据为9;在地址为255时,写入数据为99。经过一段时间后,对上述几个地址进行读取,输出的数据与写入数据相同(输出时,输出数据要比地址晚两拍)。