|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) T" b- D7 E9 |; [
0 ~9 _, v+ Z, ]3 X. X9 f
实验目的: 1.学习Altera公司Cyclone IV系列器件的内部结构 2.学会调用Quartus II软件中提供双口RAM核并进行仿真 7 J2 W- l2 f9 w$ I+ ^. o i
实验原理: 本开发板使用的为Altera公司的CycloneIV系列芯片,其体系结构如图13-1所示。其核心架构是四输入查找表 (LUTs) 构成的 LE, 存储器模块以及乘法器。体系结构中还包括通用PLL以及I/O,其他诸如多用PLL、高速收发器以及PCIe硬核模块会在其高端系列IVGX中存在。 ![]()
' c) ] a! e7 I0 e/ V图13-1Cyclone IV体系结构 逻辑单元 (LE) 在 Cyclone IV 器件结构中是最小的逻辑单位。LE 紧密且有效的提供了高级功能的逻辑使用。其内部结构如图13-2所示。可以LE基本包含以下几个部分:4输入查找表LUT、D触发器(可以对每个LE 配置可编程的寄存器为D、T、JK或SR触发器操作)以及其它组合逻辑。详细介绍可参考器件手册中Chapter2. LogicElements and Logic Array Blocks in Cyclone IV Devices 。 : {; j) l( I8 m- u w; D
图13-2逻辑单元内部结构 嵌入式存储器结构由一列列M9K 存储器模块组成,通过对这些 M9K存储器模块进行配置,可以实现各种存储器功能,例如:RAM、移位寄存器、ROM 以及FIFO缓冲器。详细介绍可参考器件手册中Chapter 3. MemoryBlocks in Cyclone IV Devices。 图13-3为一个嵌入式乘法器列以及相邻的逻辑阵列模块 (LAB)。嵌入式乘法器可 以配置成一个18 × 18乘法器,或者配置成两个 9 × 9 乘法器。对于那些大于18 × 18的乘法运算,Quartus® II 软件会将多个嵌入式乘法器模块级联在一起。虽然没有乘法器数据位宽的限制,但数据位宽越大,乘法运算就会越慢。每个嵌入式乘法器均由以下几个单元组成:乘法器级、输入与输出寄存器以及输入与输出接口,其乘法器模块的体系结构如图12-4所示。详细介绍可参考器件手册中Chapter4. EmbeddedMultipliers in Cyclone IV Devices。 ![]() 0 F* O2 Z& L' J! h9 h: K/ d+ t' M' S2 O
图12-3与 LAB 相邻的按列排列的嵌入式乘法器 图12-4乘法器模块的体系结构 Cyclone IV内部其他部分功能均可在Altera官网提供的CycloneIV 器件手册中下载学习。 实验步骤: 新建一个以名为dpram的工程保存在prj下,然后单击Tools—MegaWizard Plug-In Manager来启动Mega Wizard插件管理器,并新建一个IP核。选择MemoryCompiler下的RAM:2-PORT,并将输出目录确定为工程文件夹下的ip文件夹,并以dpram保存,单击Next。对于单端口RAM,读写操作公用端口A的地址,数据通过端口A写入和读出;对于本节使用的双端口RAM,则是一个读端口和一个写端口。 ![]()
/ n( P- y5 s7 U" c图12-5新建一个双端口的RAM 这里将双端口RAM的使用方式设置为一个读端口和一个写端口,另一种方式为两个端口都可用做读/写。这也就是设置一般而言的简单双端口RAM还是真正双端口RAM。 & ^/ T- E, h1 n
图12-6两端口RAM设置第三页 设置存储器大小的方式为按照字数确定,另一种方式为按照比特数;不同端口使用相同数的位宽;端口位宽为8;存储器使用的存储块类型为软件自动选择;存储器深度为软件自动选择。 ![]()
V+ _! b; }$ ~图12-7两端口RAM设置第四页 时钟选择这里为单时钟,用一个时钟和一个时钟使能信号控制存储块所有的寄存器。其他应用场所还可以设置为双时钟使用独立的输入时钟和输出时钟或者双时钟使用单独的读时钟和写时钟。不创建读使能信号; ![]()
( T) z8 e1 k0 A/ ]6 a图12-8双端口RAM设置第五页 对输出端口进行寄存;不创建时钟使能信号;不创建异步复位端口,需注意这里复位并不复位RAM中的数据而是只复位寄存器上的值。 1 ~4 O6 p7 X1 @/ F' N) r- J; z/ A
图12-9两端口RAM设置第七页 这个选项只会在前面选择“一个读端口和一个写端口”或者“两个端口都可用读写”,才会出现如果对同一个地址既要写又要读,那么输出端口q的输出是什么。这里选择不关心,另一种可以设置为写数据之前的存储数据。 C6 O1 N; j* n- x3 w& X" H& U# R
图12-10两端口RAM设置第8页 这里不对RAM进行初始化,在后面使用ROM时必须进行初始化,初始化步骤将在ROM部分再讲解。 ![]()
+ F# x2 S: C' ~, K; ~图12-11两端口RAM设置第10页 然后确定配置信息后即可点击Finish完成配置。 并将生成的IP核加入工程,即可在工程下看到加入的IP核文件并设置为顶层文件。 为了测试仿真编写测试激励文件,新建dpram_tb.v文件并输入以下内容再次进行分析和综合直至没有错误以及警告,保存到testbench文件夹下。这里除了实现例化需要仿真的文件以及时钟创建,还实现了在地址从0~16上写入数据从255减至240。延时一段时间后读地址为0~16上的数据。 ![]() ![]() ![]()
* G$ \( a- V+ r+ \" J0 N C4 \# `5 C& I {( q4 c6 u
, A& B% m* v& q: M8 q! r$ o! S
编译无误后可以在图12-12设计报告中看到本设计的使用的逻辑单元为0,这是因为这里我们只生成了一个RAM的IP核,没有使用逻辑设计。 4 G/ `- \. E; U$ a) e, A/ K' ?
图12-12设计报告 设置好仿真脚本后进行功能仿真,可以看到如图12-12所示的数据写入时的波形文件。在写入信号使能有效后,上升沿来到后地址0写入数据’d255,下一个上升沿在地址1处写入数据’d254,以此类推。可以看出数据写入正常。
2 C- X- J( m4 I8 p7 n: R5 j9 ?$ ]图12-12数据写入时波形 放大读取部分数据波形,在图12-13中发现在写入与读间隔中,输出端口移植是’d255不利于分析数据。这里将激励文件中的rdaddress初始值改为一个写操作用不到的地址,大于16即可:rdaddress = 30;重启仿真即可看到图12-14波形数据。可看出输出总是延迟一个系统时钟周期。 8 X: q3 z* u1 w# `
图12-13读数据波形文件
9 S- u5 c$ ?, R9 N图12-14修改后的读取波形数据 为了更好的观察时钟沿与地址、数据变化的过程,全编译后进行时序仿真。读数据时,可以看出第一个箭头时钟上升沿采到地址0 ;第二个时钟上升沿开始赋值,但是由于逻辑延迟(红框)后才开始赋值;因此第三个时钟上升沿的数据才是稳定的。
' i; m0 B9 o0 p& F; g9 { 这样就完成了,一个双端口RAM的配置与仿真。下一讲将以此为基础,进行串口收发+按键+双口RAM组成的简易系统设计。 9 b3 Q$ T/ m' K' ]% @
& `" v% X% b) H7 v. e6 b
) `7 a$ p. u9 F& c8 n5 a K8 W, t; j: c
小梅哥 芯航线电子工作室 ! e% J/ P: [( k5 D" K( I9 ?
" i" X7 x* O4 z) r
r! G6 e% H1 P+ M& I , i* m! i1 ~7 J
& S; {$ T4 n u ) [3 ^1 F& ?! \- W$ J: i
9 _. [) h% E. C, J$ w
/ [# }& j0 r: _) c, [* r$ c7 T. C2 N# u+ J! i1 K, T8 a4 W9 j ]" i; E% L
9 s1 o7 U6 L _( c. k
@! ^) Y1 y- {$ z$ Y5 G
; L h3 ~$ I% a9 j ; {% x- N- o$ A# J8 d" f7 V& ]
5 p3 t# a8 E4 E( l. J3 z
5 d9 M/ A2 z# o1 _* { ( L. F! H6 x1 a) ~
+ M( {3 G2 C* Q0 V9 {
6 l0 @+ I3 l9 y/ ]+ k6 c2 E
$ H% q' _ L/ |% _7 n! s) g; e$ _# ^$ _/ L: n
% k: S' \2 x: o& ~- z% x
0 ]- |, z6 P! G8 K1 L$ _8 ~) c
0 G( m1 K; C1 X/ c- a/ E |
$ u6 q7 n" r5 ^6 C @5 H" x |
|