OpenEdv-开源电子网
标题:
【FPGA开源教程连载】第十三章A 嵌入式RAM使用之双端口RAM
[打印本页]
作者:
芯航线跑堂
时间:
2017-1-2 09:29
标题:
【FPGA开源教程连载】第十三章A 嵌入式RAM使用之双端口RAM
本帖最后由 芯航线跑堂 于 2017-1-2 10:10 编辑
嵌入式RAM使用之双端口RAM
https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&v=20161117&vid=z01889opnjk&auto=0
实验目的:
1.
学习
Altera
公司
Cyclone IV
系列器件的内部结构
2.学会调用Quartus II软件中提供双口RAM核并进行仿真
实验平台:芯航线FPGA学习套件核心板
(, 下载次数: 3)
上传
点击文件名下载附件
实验原理:
本开发板使用的为Altera公司的CycloneIV系列芯片,其体系结构如图13-1所示。其核心架构是四输入查找表 (LUTs) 构成的 LE, 存储器模块以及乘法器。体系结构中还包括通用PLL以及I/O,其他诸如多用PLL、高速收发器以及PCIe硬核模块会在其高端系列IVGX中存在。
(, 下载次数: 2)
上传
点击文件名下载附件
图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
。
(, 下载次数: 3)
上传
点击文件名下载附件
图
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
。
(, 下载次数: 2)
上传
点击文件名下载附件
(, 下载次数: 2)
上传
点击文件名下载附件
图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,则是一个读端口和一个写端口。
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-5
新建一个双端口的
RAM
这里将双端口
RAM
的使用方式设置为一个读端口和一个写端口,另一种方式为两个端口都可用做读
/
写。这也就是设置一般而言的简单双端口
RAM
还是真正双端口
RAM
。
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-6
两端口
RAM
设置第三页
设置存储器大小的方式为按照字数确定,另一种方式为按照比特数;不同端口使用相同数的位宽;端口位宽为
8
;存储器使用的存储块类型为软件自动选择;存储器深度为软件自动选择。
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-7
两端口
RAM
设置第四页
时钟选择这里为单时钟,用一个时钟和一个时钟使能信号控制存储块所有的寄存器。其他应用场所还可以设置为双时钟使用独立的输入时钟和输出时钟或者双时钟使用单独的读时钟和写时钟。不创建读使能信号;
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-8
双端口
RAM
设置第五页
对输出端口进行寄存;不创建时钟使能信号;不创建异步复位端口,需注意这里复位并不复位
RAM
中的数据而是只复位寄存器上的值。
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-9
两端口
RAM
设置第七页
这个选项只会在前面选择“一个读端口和一个写端口”或者“两个端口都可用读写”,才会出现如果对同一个地址既要写又要读,那么输出端口q的输出是什么。这里选择不关心,另一种可以设置为写数据之前的存储数据。
(, 下载次数: 3)
上传
点击文件名下载附件
图
12-10
两端口
RAM
设置第
8
页
这里不对
RAM
进行初始化,在后面使用
ROM
时必须进行初始化,初始化步骤将在
ROM
部分再讲解。
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-11
两端口
RAM
设置第
10
页
然后确定配置信息后即可点击
Finish
完成配置。
并将生成的IP核加入工程,即可在工程下看到加入的IP核文件并设置为顶层文件。
为了测试仿真编写测试激励文件,新建dpram_tb.v文件并输入以下内容再次进行分析和综合直至没有错误以及警告,保存到testbench文件夹下。这里除了实现例化需要仿真的文件以及时钟创建,还实现了在地址从0~16上写入数据从255减至240。延时一段时间后读地址为0~16上的数据。
(, 下载次数: 2)
上传
点击文件名下载附件
(, 下载次数: 5)
上传
点击文件名下载附件
(, 下载次数: 2)
上传
点击文件名下载附件
编译无误后可以在图12-12设计报告中看到本设计的使用的逻辑单元为0,这是因为这里我们只生成了一个RAM的IP核,没有使用逻辑设计。
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-12
设计报告
设置好仿真脚本后进行功能仿真,可以看到如图12-12所示的数据写入时的波形文件。在写入信号使能有效后,上升沿来到后地址0写入数据’d255,下一个上升沿在地址1处写入数据’d254,以此类推。可以看出数据写入正常。
(, 下载次数: 2)
上传
点击文件名下载附件
图
12-12
数据写入时波形
放大读取部分数据波形,在图12-13中发现在写入与读间隔中,输出端口移植是’d255不利于分析数据。这里将激励文件中的rdaddress初始值改为一个写操作用不到的地址,大于16即可:rdaddress
=
30
;
重启仿真即可看到图12-14波形数据。可看出输出总是延迟一个系统时钟周期。
(, 下载次数: 3)
上传
点击文件名下载附件
图
12-13
读数据波形文件
(, 下载次数: 3)
上传
点击文件名下载附件
图
12-14
修改后的读取波形数据
为了更好的观察时钟沿与地址、数据变化的过程,全编译后进行时序仿真。读数据时,可以看出第一个箭头时钟上升沿采到地址0 ;第二个时钟上升沿开始赋值,但是由于逻辑延迟(红框)后才开始赋值;因此第三个时钟上升沿的数据才是稳定的。
(, 下载次数: 3)
上传
点击文件名下载附件
这样就完成了,一个双端口
RAM
的配置与仿真。下一讲将以此为基础,进行串口收发
+
按键
+
双口
RAM
组成的简易系统设计。
小梅哥
芯航线电子工作室
关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:
http://yun.baidu.com/share/home?uk=402885837&view=share#category/type=0
欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/)
Powered by Discuz! X3.4