本篇实现基于叁芯智能科技的SANXIN -B02 FPGA开发板,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。
6 {( k3 v" {( ^
随机存取存储器(random access memory,RAM)又称作"随机存储器"。存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。按照存储单元的工作原理,随机存储器又分为静态随机存储器(Static RAM,SRAM)和动态随机存储器(Dynamic RAM,DRAM)。在FPGA内部的存储块为SRAM。
7 m& G s" D& J' s7 N' K
- 设计要求
5 ^8 J; S7 L; |' t. [3 O, G
设计一个深度为256,宽度为8的RAM。不需要初始化内容。
4 l X% u2 @! Q2 W- n$ Y
- 设计原理
+ M- I3 A. A C5 Q: s
RAM,此种存储器支持写操作,支持读操作。在存储器建造时,可以进行初始化数据,也可以不进行初始化数据。RAM的初始化文件也是coe文件,原理和ROM类似。
由于设计RAM深度为256,故而地址的宽度为8位。
1 ?% {, q0 v1 Q
RAM工作原理为,在时钟上升沿采样到rden为1时,将addr所指示的存储空间的数据进行输出;在时钟上升沿采样到wren为1时,将wdata存储到addr所指示的存储空间中去。
( T/ Y) ~6 g) B* i3 A) l; A# I. d
- 架构设计和信号说明
* _! R/ ^2 k+ m# e8 i/ g
此模块命名为ram_test。my_ram为ip core。
: T4 w. B0 P2 r2 w) A. v0 m
7 V2 M& g6 e# }$ t P
% ]. Y& w. q" r; u& @, x: q
8 Z" n$ X# ] ~$ A
8 Z) }5 r7 s! G- I8 X/ j( O r
- 调用 ip core 之 RAM
4 D8 L+ b ?( e
$ |" c8 r, ]6 a% Y P建好工程之后,右键点击工程,选择New Source,新建IP核。
9 J) K, N; L+ {; d( L
2 @! W8 N. I! ]$ S
. X4 O) B, O6 |* ]6 N5 y
0 b7 i* H) |& ^
找到对应路径,命名为my_ram。
! f! h( e0 R3 s$ j% _9 v1 S# {9 H
$ ]* t+ U5 J( |1 S
打开IP核库之后,搜索Block Memory即可看到我们的RAM。
+ `4 E! X2 ]7 e; q" g
6 p$ Q. @! j# s) ~4 E
, O# Z2 T1 w5 V5 Y$ `
点击Next。
* E# I3 c8 M: J8 Q
/ F" }# t: K. z- e4 V! \ n
, J! ~" I% v; Z& F0 f" z2 v
点击Finish。
% d1 ?& v4 v& V0 K! W+ S
- T: _2 s+ h: t
- o0 O# z# a1 Z* [' F, g
点击Next。
1 [$ D8 f. ?$ I
) N* B8 Z% P4 I5 Q& Y% `; @
- n& | ?- @! f" `: t" D
选择默认的Single Port RAM。点击Next。
, z/ m" a4 j7 R' w* H$ q: x
% ` J6 H1 {9 H% Q1 n# [4 b$ j
1 A* g4 i# [) v4 F
数据位宽为8,数据深度为256。Enable选择Always Enable。点击Next。
" c$ D8 P' g$ |# ]. U" {
$ s% L- D$ e T1 p( n$ S2 T' b& Y$ a4 D$ E/ l
0 }' p; V& ]! D1 Z ~此界面的数据初始化我们不需要做,因为RAM的数据是我们自己写入的,不是提前固化好的,所以这个界面我们保持默认点击Next。
( W2 x% J y+ k3 c9 z6 m
( Y" }7 L5 h V7 h$ m6 \/ b. x7 ~9 W! B* T! v9 g
1 i5 s' o; i2 J9 j" Q6 l
复位端口同样不使用,如果需要,可以勾选上。我们这里保持默认点击Next。
' ~1 j6 j P7 c: r: O
1 L/ K7 ~. N/ I' l$ J2 i: ^# [
4 k* g1 n7 o: R8 D点击Generate。
) J$ a" V; ^7 X0 D
- 顶层设计
9 t, W4 ?( ]0 \, V% [, W- L+ _& q
顶层负责调用my_ram,例化文件在ipcore_dir -> my_ram.veo中。
; {, r8 J5 A" F3 I5 Y
设计代码为:
6 z+ h+ }1 Y5 r; q& @
% q- `' U$ ]3 \
7 X( I9 ?8 |5 V; p' ?9 r6 W0 ^
在某些地址中,写入一些数据,然后读出来。由于写进去后,还需要读出来,所以地址不在使用随机值,固定在0,100,200,255地址写入随机值。
: _2 ]% A$ q9 u" Z* n6 ]" \4 U( g仿真代码为:
% }* M# r4 Z% a4 \
' D* f# N" V' l. ^' D# S' |2 U
[& q" M& Q' O. a# M
经过设置后,进行RTL仿真。
9 ~3 |6 {% ~# w+ \9 D1 K. U4 h% J0 R1 a
通过波形图中,可以看出,在地址为0时,写入数据为36;在地址为100时,写入数据为129;在地址为200时,写入数据为9;在地址为255时,写入数据为99。经过一段时间后,对上述几个地址进行读取,输出的数据与写入数据相同(输出时,输出数据要比地址晚两拍)。