0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【ZYNQ Ultrascale+ MPSOC FPGA教程】第六章FPGA片内RAM读写测试实验

FPGA技术专栏 来源:芯驿电子科技 作者:芯驿电子科技 2021-01-22 09:43 次阅读

原创声明:

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处。

适用于板卡型号:

AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG

实验Vivado工程为“ram_test”。

RAM是FPGA中常用的基础模块,可广泛用于缓存数据的情况,同样它也是ROM,FIFO的基础。本实验将为大家介绍如何使用FPGA内部的RAM以及程序对该RAM的数据读写操作。

1.实验原理

Xilinx在VIVADO里为我们已经提供了RAM的IP核, 我们只需通过IP核例化一个RAM,根据RAM的读写时序来写入和读取RAM中存储的数据。实验中会通过VIVADO集成的在线逻辑分析仪ila,我们可以观察RAM的读写时序和从RAM中读取的数据。

2.创建Vivado工程

在添加RAM IP之前先新建一个ram_test的工程, 然后在工程中添加RAM IP,方法如下:

2.1 点击下图中IP Catalog,在右侧弹出的界面中搜索ram,找到Block Memory Generator,双击打开。

o4YBAGAKLa-ABoycAACNMZ5WWzQ972.jpg

2.2 将Component Name改为ram_ip,在Basic栏目下,将Memory Type改为Simple Dual Prot RAM,也就是伪双口RAM。一般来讲"Simple Dual Port RAM"是最常用的,因为它是两个端口,输入和输出信号独立。

pIYBAGAKLbCAHxvRAABeRlJj_ko400.jpg

2.3 切换到Port A Options栏目下,将RAM位宽Port A Width改为16,也就是数据宽度。将RAM深度Port A Depth改为512,深度指的是RAM里可以存放多少个数据。使能管脚Enable Port Type改为Always Enable。

o4YBAGAKLbCAD2WqAABShyT6mNs322.jpg

2.4 切换到Port B Options栏目下,将RAM位宽Port B Width改为16,使能管脚Enable Port Type改为Always Enable,当然也可以Use ENB Pin,相当于读使能信号。而Primitives Output Register取消勾选,其功能是在输出数据加上寄存器,可以有效改善时序,但读出的数据会落后地址两个周期。很多情况下,不使能这项功能,保持数据落后地址一个周期。

pIYBAGAKLbGADAkvAACH6bmf4M8590.jpg

2.5 在Other Options栏目中,这里不像ROM那样需要初始化RAM的数据,我们可以在程序中写入,所以配置默认即可,直接点击OK。

pIYBAGAKLbKAEUzWAACUvlwFF6U203.jpg

2.6 点击“Generate”生成RAM IP。

o4YBAGAKLbOAf32xAABSIdRvtuI431.jpg

3. RAM的端口定义和时序

Simple Dual Port RAM 模块端口的说明如下:

信号名称 方向 说明
clka in 端口A时钟输入
wea in 端口A使能
addra in 端口A地址输入
dina in 端口A数据输入
clkb in 端口B时钟输入
addrb in 端口B地址输入
doutb out 端口B数据输输出

RAM的数据写入和读出都是按时钟的上升沿操作的,端口A数据写入的时候需要置高wea信号,同时提供地址和要写入的数据。下图为输入写入到RAM的时序图。

pIYBAGAKLbOAazRcAABZ8mCO9bE588.jpgRAM写时序

而端口B是不能写入数据的,只能从RAM中读出数据,只要提供地址就可以了,一般情况下可以在下一个周期采集到有效的数据。

o4YBAGAKLbSAb_86AABW88sIOaA091.jpgRAM读时序

4. 测试程序编写

下面进行RAM的测试程序的编写,由于测试RAM的功能,我们向RAM的端口A写入一串连续的数据,只写一次,并从端口B中读出,使用逻辑分析仪查看数据。代码如下

`timescale1ns/1ps//////////////////////////////////////////////////////////////////////////////////moduleram_test(
			inputclk,			//25MHz时钟			inputrst_n		//复位信号,低电平有效	
		);//-----------------------------------------------------------reg		[8:0]		w_addr;			//RAMPORTA写地址reg		[15:0]		w_data;			//RAMPORTA写数据reg			wea;		//RAMPORTA使能reg		[8:0]		r_addr;			//RAMPORTB读地址wire	[15:0]		r_data;			//RAMPORTB读数据//产生RAMPORTB读地址always@(posedgeclkornegedgerst_n)beginif(!rst_n)
	r_addr<=9'd0;elseif(|w_addr)			//w_addr位或,不等于0    r_addr <= r_addr+1'b1;else
	r_addr <=9'd0;	end//产生RAM PORTA写使能信号always@(posedge clk ornegedge rst_n)begin	if(!rst_n)
	  wea <=#11'b0;elsebeginif(&w_addr)//w_addr的bit位全为1,共写入512个数据,写入完成        wea <=#11'b0;else
        wea	<=#11'b1;//ram写使能endend//产生RAM PORTA写入的地址及数据always@(posedge clk ornegedge rst_n)begin	if(!rst_n)begin
	  w_addr <=9'd0;
	  w_data <=16'd1;endelsebeginif(wea)	//ram写使能有效	begin
		if(&w_addr)//w_addr的bit位全为1,共写入512个数据,写入完成		begin
			w_addr <= w_addr ;//将地址和数据的值保持住,只写一次RAM			w_data <= w_data ;
		end
		else
		begin
			w_addr <= w_addr +1'b1;
			w_data <= w_data +1'b1;
		end
	endendend//-----------------------------------------------------------//实例化RAM	
ram_ip ram_ip_inst (.clka      (clk          ),// input clka.wea       (wea          ),// input [0 : 0] wea.addra     (w_addr       ),// input [8 : 0] addra.dina      (w_data       ),// input [15 : 0] dina.clkb      (clk          ),// input clkb.addrb     (r_addr       ),// input [8 : 0] addrb.doutb     (r_data       )// output [15 : 0] doutb);//实例化ila逻辑分析仪ila_0 ila_0_inst (
	.clk	(clk	),
	.probe0	(r_data	),
	.probe1	(r_addr	));

	endmodule

为了能实时看到RAM中读取的数据值,我们这里添加了ila工具来观察RAM PORTB的数据信号和地址信号。关于如何生成ila大家请参考”PL的”Hello World”LED实验”。

pIYBAGAKLbWADcTfAAARCnDQRRw720.jpg

程序结构如下:

o4YBAGAKLbWAGIwkAAA-pCtbTBw591.jpg

绑定引脚

##################Compress Bitstream############################
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]set_property PACKAGE_PIN AB11 [get_ports clk]set_property IOSTANDARD LVCMOS33 [get_ports clk]create_clock -period 40.000 -name clk -waveform {0.000 20.000} [get_ports clk]set_property PACKAGE_PIN AA13 [get_ports rst_n]set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

5. 仿真

仿真方法参考”PL的”Hello World”LED实验”,仿真结果如下,从图中可以看出地址1写入的数据是0002,在下个周期,也就是时刻2,有效数据读出。

pIYBAGAKLbWAZFtOAACcKwiyrUE562.jpg

6. 板上验证

生成bitstream,并下载bit文件到FPGA。接下来我们通过ila来观察一下从RAM中读出的数据是否为我们初始化的数据。

在Waveform的窗口设置r_addr地址为0作为触发条件,我们可以看到r_addr在不断的从0累加到1ff, 随着r_addr的变化, r_data也在变化, r_data的数据正是我们写入到RAM中的512个数据,这里需要注意,r_addr出现新地址时,r_data对应的数据要延时两个时钟周期才会出现,数据比地址出现晚两个时钟周期,与仿真结果一致。

o4YBAGAKLbaAXm88AAB0M0szrlg978.jpg

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1624

    文章

    21597

    浏览量

    601009
  • ROM
    ROM
    +关注

    关注

    4

    文章

    549

    浏览量

    85608
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1353

    浏览量

    114413
  • Zynq
    +关注

    关注

    9

    文章

    607

    浏览量

    47091
  • MPSoC
    +关注

    关注

    0

    文章

    195

    浏览量

    24224
收藏 人收藏

    评论

    相关推荐

    数据采集光盘实例第一第六章

    数据采集光盘实例第一第六章
    发表于 06-28 21:02

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

      如何调试Zynq UltraScale+ MPSoC VCU DDR控制器  Zynq UltraScale+
    发表于 01-07 16:02

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

    如何调试 Zynq UltraScale+ MPSoC VCU DDR 控制器?
    发表于 01-22 06:29

    ZYNQ Ultrascale+ MPSOC FPGA教程

    ZYNQ Ultrascale+ MPSOC FPGA教程
    发表于 02-02 07:53

    高频电子线路第六章答案

    高频电子线路第六章答案.
    发表于 06-05 10:41 41次下载

    《测控电路》习题完整参考答案(第六章

    《测控电路》习题完整参考答案(第六章
    发表于 02-07 15:17 0次下载

    数字信号处理 第六章

    数字信号处理 第六章
    发表于 10-19 09:34 4次下载
    数字信号处理 <b class='flag-5'>第六章</b>

    STM8S BLDC电机第六章工程的stm8选项字节配置

    STM8S BLDC电机第六章工程的stm8选项字节配置
    发表于 03-05 15:07 8次下载

    Zynq UltraScale+ MPSoC的发售消息

    Zynq®UltraScale+MPSoC,现已开始发售。视频向您重点介绍了Xilinx UltraScale +产品组合的第一位成员
    的头像 发表于 11-27 06:47 3551次阅读

    ZYNQ Ultrascale+ MPSOC FPGA教程】第八FPGAFIFO读写测试实验

    FIFO是FPGA应用当中非常重要的模块,广泛用于数据的缓存,跨时钟域数据处理等。学好FIFO是FPGA的关键,灵活运用好FIFO是一个FPGA工程师必备的技能。本章主要介绍利用XILINX提供的FIFO IP进行
    发表于 02-02 06:24 11次下载
    【<b class='flag-5'>ZYNQ</b> <b class='flag-5'>Ultrascale+</b> <b class='flag-5'>MPSOC</b> <b class='flag-5'>FPGA</b>教程】第八<b class='flag-5'>章</b><b class='flag-5'>FPGA</b><b class='flag-5'>片</b><b class='flag-5'>内</b>FIFO<b class='flag-5'>读写</b><b class='flag-5'>测试</b><b class='flag-5'>实验</b>

    ZYNQ Ultrascale+ MPSOC FPGA教程】第七 FPGAROM测试实验

    FPGA本身是SRAM架构的,断电之后,程序就消失,那么如何利用FPGA实现一个ROM呢,我们可以利用FPGA内部的RAM资源实现ROM,但不是真正意义上的ROM,而是每次上电都会把初
    发表于 02-26 06:22 3次下载
    【<b class='flag-5'>ZYNQ</b> <b class='flag-5'>Ultrascale+</b> <b class='flag-5'>MPSOC</b> <b class='flag-5'>FPGA</b>教程】第七<b class='flag-5'>章</b> <b class='flag-5'>FPGA</b><b class='flag-5'>片</b><b class='flag-5'>内</b>ROM<b class='flag-5'>测试</b><b class='flag-5'>实验</b>

    ZYNQ Ultrascale+ MPSOC FPGA教程】第六章 FPGARAM读写测试实验

    RAMFPGA中常用的基础模块,可广泛用于缓存数据的情况,同样它也是ROM,FIFO的基础。本实验将为大家介绍如何使用FPGA内部的RAM
    发表于 03-15 06:09 14次下载
    【<b class='flag-5'>ZYNQ</b> <b class='flag-5'>Ultrascale+</b> <b class='flag-5'>MPSOC</b> <b class='flag-5'>FPGA</b>教程】<b class='flag-5'>第六章</b> <b class='flag-5'>FPGA</b><b class='flag-5'>片</b><b class='flag-5'>内</b><b class='flag-5'>RAM</b><b class='flag-5'>读写</b><b class='flag-5'>测试</b><b class='flag-5'>实验</b>

    计算机网络第六章应用层资源下载

    计算机网络第六章应用层资源下载
    发表于 05-17 10:25 0次下载

    ZYNQ Ultrascale+ MPSoC系列FPGA芯片设计

    基于 Xilinx 公司ZYNQ Ultrascale+ MPSoC系列 FPGA 芯片设计,应用于工厂自动化、机器视觉、工业质检等工业领域
    发表于 11-02 14:35 1537次阅读

    Zynq UltraScale+ MPSoC的隔离设计示例

    电子发烧友网站提供《Zynq UltraScale+ MPSoC的隔离设计示例.pdf》资料免费下载
    发表于 09-13 11:28 3次下载
    <b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>的隔离设计示例