首页 > 其他分享 >《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章 IP核之RAM实验

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章 IP核之RAM实验

时间:2022-12-08 10:01:50浏览次数:46  
标签:MPSoc RAM FPGA 核之 clk ram 端口 sys IP

IP核之RAM实验

RAM的英文全称是Random Access Memory,即随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的。RAM主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。本章我们将对Vivado软件生成的RAM IP核进行读写测试,并向大家介绍Xilinx RAM IP核的使用方法。​

本章包括以下几个部分:​

  1. RAM IP核简介​
  2. 实验任务​
  3. 硬件设计​
  4. 程序设计​
  5. 下载验证​


RAM IP核简介​

Zynq UltraScale+ MPSoC的存储器由三部分构成,分别是Distributed RAM(分布式RAM)、BRAM(块RAM)与UltraRAM(超级RAM)。EG与EV器件都有分布式RAM 与块RAM,但是EG器件没有超级RAM模块,EV器件含有超级RAM模块。​

Zynq UltraScale+ MPSoC架构器件具有嵌入式存储器结构,满足了设计对片上存储器的需求。嵌入式存储器结构由一列列BRAM(块RAM)存储器模块组成,通过对这些BRAM存储器模块进行配置,可以实现各种存储器的功能,例如:RAM、移位寄存器、ROM以及FIFO缓冲器。​

Vivado软件自带了BMG IP核(Block Memory Generator,块RAM生成器),可以配置成RAM或者ROM。这两者的区别是RAM是一种随机存取存储器,不仅仅可以存储数据,同时支持对存储的数据进行修改;而ROM是一种只读存储器,也就是说,在正常工作时只能读出数据,而不能写入数据。需要注意的是,配置成RAM或者ROM使用的资源都是FPGA内部的BRAM,只不过配置成ROM时只用到了嵌入式BRAM的读数据端口。本章我们主要介绍通过BRAM IP核配置成RAM的使用方法。​

Zynq UltraScale+ MPSoC架构器件内部的BRAM全部是真双端口RAM(True Dual-Port ram,TDP),这两个端口都可以独立地对BRAM进行读/写。但也可以被配置成伪双端口RAM(Simple Dual-Port,SDP)(有两个端口,但是其中一个只能读,另一个只能写)或单端口RAM(只有一个端口,读/写只能通过这一个端口来进行)。单端口RAM只有一组数据总线、地址总线、时钟信号以及其他控制信号,而双端口RAM具有两组数据总线、地址总线、时钟信号以及其他控制信号。有关BRAM的更详细的介绍,请读者参阅Xilinx官方的手册文档“UG573,UltraScale Architecture Memory Resources User Guide”。​

单端口RAM类型和双端口RAM类型在操作上都是一样的,我们只要学会了单端口RAM的使用,那么学习双端口RAM的读写操作也是非常容易的。本章我们以配置成单端口RAM为例进行讲解。​

BMG IP核配置成单端口RAM的框图如下图所示。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_IP


图12.1.1 单端口RAM框图​

各个端口的功能描述如下:​

DINA:RAM端口A写数据信号。​

ADDRA:RAM端口A读写地址信号,对于单端口RAM来说,读地址和写地址共用同该地址线。​

WEA:RAM端口A写使能信号,高电平表示向RAM中写入数据,低电平表示从RAM中读出数据。​

ENA:端口A的使能信号,高电平表示使能端口A,低电平表示端口A被禁止,禁止后端口A上的读写操作都会变成无效。另外ENA信号是可选的,当取消该使能信号后,RAM会一直处于有效状态。​

RSTA:RAM端口A复位信号,可配置成高电平或者低电平复位,该复位信号是一个可选信号。​

REGCEA:RAM端口A输出寄存器使能信号,当REGCEA为高电平时,DOUTA保持最后一次输出的数据,REGCEA同样是一个可选信号。​

CLKA:RAM端口A的时钟信号。​

DOUTA:RAM端口A读出的数据。​

实验任务​

本节实验任务是使用Xilinx BMG IP核,配置成一个单端口的RAM,然后对RAM进行读写操作,通过在Vivado自带的仿真器中观察波形是否正确,最后将设计下载到DFZU2EG/4EV MPSoC开发板中,并使用ILA对其进行在线调试观察。​

硬件设计​

本章实验只用到了输入的时钟信号和按键复位信号,没有用到其它硬件外设,各端口信号的管脚分配如下表所示:​

表12.3.1核之RAM实验管脚分配​

信号名​

方向​

管脚​

端口说明​

电平标准​

sys_clk_p​

input​

AE5​

系统差分输入时钟​

DIFF_HSTL_I_12​

sys_clk_n​

input​

AF5​

系统差分输入时钟​

DIFF_HSTL_I_12​

sys_rst_n​

input​

AH11​

系统复位,低电平有效​

LVCMOS33​

对应的XDC约束语句如下所示:​

#IO管脚约束
#时钟周期约束
create_clock -name sys_clk_p -period 10.000 [get_ports sys_clk_p]
#时钟
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_p]
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_n]
set_property PACKAGE_PIN AE5 [get_ports sys_clk_p]
set_property PACKAGE_PIN AF5 [get_ports sys_clk_n]
#复位
set_property -dict {PACKAGE_PIN AH11 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]

程序设计​

首先在Vivado软件中创建一个名为ip_ram的工程,工程创建完成后,在Vivado软件的左侧“Flow Navigator”栏中单击“IP Catalog”,如下图所示。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_IP_02


图12.4.1 点击“IP Catalog”​

在“IP Catalog”窗口的搜索框中输入“Block Memory”,出现唯一匹配的“Block Memory Generator”,如下图所示(图中出现的两个IP核为同一个BMG IP核)。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_IP_03


图12.4.2 搜索框中输入“Block Memory”​

双击“Block Memory Generator”后弹出IP核的配置界面,接下来对BMG IP核进行配置,“Basic”选项页配置界面如下图所示。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_Memory_04


图12.4.3 “Basic”选项页配置​

Component Name:设置该IP核的名称,这里保持默认即可。​

Interface Type:RAM接口总线。这里保持默认,选择Native接口类型(标准RAM接口总线);​

Memory Type:存储器类型。可配置成Single Port RAM(单端口RAM)、Simple Dual Port RAM(伪双端口RAM)、True Dual Port RAM(真双端口RAM)、Single Port ROM(单端口ROM)和Dual Port ROM(双端口ROM),这里选择Single Port RAM,即配置成单端口RAM。​

ECC Options:Error Correction Capability,纠错能力选项,单端口RAM不支持ECC。​

Write Enable:字节写使能选项,勾中后可以单独将数据的某个字节写入RAM中,这里不使能。​

Algorithm Options:算法选项。可选择Minimum Area(最小面积)、Low Power(低功耗)和Fixed Primitives(固定的原语),这里选择默认的Minimum Area。​

接下来切换至“Port A”选项页,设置端口A的参数,该页面配置如下:​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_数据_05


图12.4.4 “Port A Options”选项页配置​

Write Width:端口A写数据位宽,单位Bit,这里设置成8。​

Read Width:端口A读数据位宽,一般和写数据位宽保持一致,设置成8。​

Write Depth:写深度,这里设置成32,即RAM所能访问的地址范围为0-31。​

Read Depth:读深度,默认和写深度保持一致。​

Operating Mode:RAM读写操作模式。共分为三种模式,分别是Write First(写优先模式)、Read First(读优先模式)和No Change(不变模式)。写优先模式指数据先写入RAM中,然后在下一个时钟输出该数据;读优先模式指数据先写入RAM中,同时输出RAM中同地址的上一次数据;不变模式指读写分开操作,不能同时进行读写,这里选择No Change模式。​

Enable Port Type:使能端口类型。Use ENA pin(添加使能端口A信号);Always Enabled(取消使能信号,端口A一直处于使能状态),这里选择默认的Use ENA pin。​

Port A Optional Output Register:端口A输出寄存器选项。其中“Primitives Output Register”默认是选中状态,作用是打开BRAM内部位于输出数据总线之后的输出流水线寄存器,虽然在一般设计中为了改善时序性能会保持此选项的默认勾选状态,但是这会使得BRAM输出的数据延迟一拍,这不利于我们在Vivado的ILA调试窗口中直观清晰地观察信号;而且在本实验中我们仅仅是把BRAM的数据输出总线连接到了ILA的探针端口上来进行观察,除此之外数据输出总线没有别的负载,不会带来难以满足的时序路径,因此这里取消勾选。​

Port A Output Reset Options:RAM复位信号选项,这里不添加复位信号,保持默认即可。​

另外,需要注意的是,下面的“Primitives Output Register”默认是选中状态的,此选项的作用是打开块RAM内部的位于输出数据总线之后的输出流水线寄存器,虽然在一般设计中为了改善时序性能会保持此选项的默认勾选状态,但是这会使得块RAM输出的数据延迟一拍,这不利于我们在Vivado的ILA调试窗口中直观清晰地观察信号;而且在本实验中我们仅仅是把块RAM的数据输出总线连接到了ILA的探针端口上来进行观察,除此之外数据输出总线没有别的负载,不会带来难以满足的时序路径。​

接下来的“Other Options”选项页用于设置RAM的初始值等,本次实验不需要设置,直接保持默认即可。​

最后一个是“Summary”选项页,该页面显示了存储器的类型,消耗的BRAM资源等,我们直接点击“OK”按钮完成BMG IP核的配置,如下图所示:​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_IP_06


图12.4.5 “Summary”选项页​

接下来会弹出询问是否在工程目录下创建存放IP核的文件,我们点击“OK”按钮即可。​

紧接着会弹出“Genarate Output Products”窗口,我们直接点击“Generate”,如下图所示。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_Memory_07


图12.4.6 “Genarate Output Products”窗口​

之后我们就可以在“Design Run”窗口的“Out-of-Context Module Runs”一栏中出现了该IP核对应的run“blk_mem_gen_0_synth_1”,其综合过程独立于顶层设计的综合,所以在我们可以看到其正在综合,如下图所示。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_Memory_08


图12.4.7 “blk_mem_gen_0_synth_1”run​

在其Out-of-Context综合的过程中,我们就可以进行RTL编码了。首先打开IP核的例化模板,在“Source”窗口中的“IP Sources”选项卡中,依次用鼠标单击展开“IP”-“blk_mem_gen_0”-“Instantitation Template”,我们可以看到“blk_mem_gen_0.veo”文件,它是由IP核自动生成的只读的verilog例化模板文件,双击就可以打开它,如下图所示。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_Memory_09


图12.4.8 “blk_mem_gen_0.veo”文件​

接下来我们创建一个新的设计文件,命名为ram_rw.v,代码如下:​

1 module ram_rw(​
2 input clk , //时钟信号​
3 input rst_n , //复位信号,低电平有效​
4 ​
5 output ram_en , //ram使能信号​
6 output ram_wea , //ram读写选择​
7 output reg [4:0] ram_addr , //ram读写地址​
8 output reg [7:0] ram_wr_data, //ram写数据​
9 input [7:0] ram_rd_data //ram读数据 ​
10 );​
11 ​
12 //reg define​
13 reg [5:0] rw_cnt ; //读写控制计数器​
14 ​
15 //*****************************************************​
16 //** main code​
17 //*****************************************************​
18 ​
19 //控制RAM使能信号​
20 assign ram_en = rst_n;​
21 //rw_cnt计数范围在0~31,写入数据;32~63时,读出数据​
22 assign ram_wea = (rw_cnt <= 6'd31 && ram_en == 1'b1) ? 1'b1 : 1'b0;​
23 ​
24 //读写控制计数器,计数器范围0~63​
25 always @(posedge clk or negedge rst_n) begin​
26 if(rst_n == 1'b0)​
27 rw_cnt <= 1'b0; ​
28 else if(rw_cnt == 6'd63)​
29 rw_cnt <= 1'b0;​
30 else​
31 rw_cnt <= rw_cnt + 1'b1; ​
32 end ​
33 ​
34 //产生RAM写数据​
35 always @(posedge clk or negedge rst_n) begin​
36 if(rst_n == 1'b0)​
37 ram_wr_data <= 1'b0; ​
38 else if(rw_cnt <= 6'd31) //在计数器的0-31范围内,RAM写地址累加​
39 ram_wr_data <= ram_wr_data + 1'b1;​
40 else​
41 ram_wr_data <= 1'b0 ; ​
42 end ​
43 ​
44 //读写地址信号 范围:0~31​
45 always @(posedge clk or negedge rst_n) begin​
46 if(rst_n == 1'b0)​
47 ram_addr <= 1'b0;​
48 else if(ram_addr == 5'd31)​
49 ram_addr <= 1'b0;​
50 else ​
51 ram_addr <= ram_addr + 1'b1;​
52 end​
53 ​
63 endmodule

模块中定义了一个读写控制计数器(rw_cnt),当计数范围在0~31之间时,向ram中写入数据;当计数范围在32~63之间时,从ram中读出数据。​

接下来我们设计一个verilog文件来实例化创建的RAM核以及ram_rw模块,文件名为ip_ram.v, 编写的verilog代码如下。​

1 module ip_ram(​
2 input sys_clk_p , //系统差分输入时钟​
3 input sys_clk_n , //系统差分输入时钟​
4 input sys_rst_n //系统复位,低电平有效​
5 );​
6 ​
7 //wire define​
8 wire ram_en ; //RAM使能 ​
9 wire ram_wea ; //ram读写使能信号,高电平写入,低电平读出 ​
10 wire [4:0] ram_addr ; //ram读写地址 ​
11 wire [7:0] ram_wr_data ; //ram写数据 ​
12 wire [7:0] ram_rd_data ; //ram读数据 ​
13 ​
14 //*****************************************************​
15 //** main code​
16 //*****************************************************​
17 ​
18 //转换差分信号​
19 IBUFDS diff_clock​
20 (​
21 .I (sys_clk_p), //系统差分输入时钟​
22 .IB(sys_clk_n), //系统差分输入时钟​
23 .O (sys_clk) //输出系统时钟​
24 ); ​
25 ​
26 //ram读写模块​
27 ram_rw u_ram_rw(​
28 .clk (sys_clk ),​
29 .rst_n (sys_rst_n ),​
30 //RAM​
31 .ram_en (ram_en ),​
32 .ram_wea (ram_wea ),​
33 .ram_addr (ram_addr ),​
34 .ram_wr_data (ram_wr_data ),​
35 .ram_rd_data (ram_rd_data )​
36 );​
37 ​
38 //ram ip核​
39 blk_mem_gen_0 u_blk_mem_gen_0(​
40 .clka (sys_clk), // input wire clka​
41 .ena (ram_en), // input wire ena​
42 .wea (ram_wea), // input wire [0 : 0] wea​
43 .addra (ram_addr), // input wire [4 : 0] addra​
44 .dina (ram_wr_data), // input wire [7 : 0] dina​
45 .douta (ram_rd_data) // output wire [7 : 0] douta​
46 );​
47 ​
48 endmodule

程序中例化了ram_rw模块和ram IP核blk_mem_gen_0,其中ram_rw模块负责产生对ram IP核读/写所需的所有数据、地址以和读写使能信号,同时从ram IP读出的数据也连接至ram_rw模块。​

接下来对RAM IP核进行仿真,来验证对RAM的读写操作是否正确。tb_ip_ram仿真文件源代码如下:​

1 module tb_ip_ram();​
2 ​
3 reg sys_clk_p;​
4 reg sys_clk_n;​
5 reg sys_rst_n; ​
6 ​
7 always #5 sys_clk_p = ~sys_clk_p;​
8 always #5 sys_clk_n = ~sys_clk_n;​
9 ​
10 initial begin​
11 sys_clk_p = 1'b0;​
12 sys_clk_n = 1'b1;​
13 sys_rst_n = 1'b0;​
14 #200​
15 sys_rst_n = 1'b1;​
16 end​
17 ​
18 ip_ram u_ip_ram(​
19 .sys_clk_p (sys_clk_p ),​
20 .sys_clk_n (sys_clk_n ),​
21 .sys_rst_n (sys_rst_n )​
22 );​
23 ​
24 endmodule

接下来就可以开始仿真了,仿真过程这里不再赘述,仿真波形图如下图所示。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_数据_10


图12.4.9 RAM写操作波形图​

图12.4.9为RAM的写操作仿真波形图,由上图可知,ram_wea信号拉高,说明此时是对ram进行写操作。ram_wea信号拉高之后,地址和数据都是从0开始累加,也就说当ram地址为0时,写入的数据也是0;当ram地址为1时,写入的数据也是1,我们总共向ram中写入32个数据。​

RAM读操作仿真波形图如下图所示:​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_IP_11


图12.4.10 RAM读操作波形图​

由上图可知,ram_wea信号拉低,说明此时是对ram进行读操作。ram_wea信号拉低之后,ram_addr从0开始增加,也就是说从ram的地址0开始读数据;ram中读出的数据ram_rd_data在延时一个时钟周期之后,开始输出数据,输出的数据为0,1,2……,和我们写入的值是相等的,也就是说,我们创建的RAM IP核从仿真结果上来看是正确的。​

接下来添加ILA IP核,将ram_en、ram_wea、ram_addr、ram_wr_data和ram_rd_data信号添加至观察列表中,添加ILA IP核的方法这里不再赘述。​

最后为工程添加IO管脚约束,对应的XDC约束语句如下所示:​

#IO管脚约束​
#时钟周期约束​
create_clock -name sys_clk_p -period 10.000 [get_ports sys_clk_p]​
#时钟​
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_p]​
set_property IOSTANDARD DIFF_HSTL_I_12 [get_ports sys_clk_n]​
set_property PACKAGE_PIN AE5 [get_ports sys_clk_p]​
set_property PACKAGE_PIN AF5 [get_ports sys_clk_n]​
#复位​
set_property -dict {PACKAGE_PIN AH11 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]

下载验证 ​

编译工程并生成比特流.bit文件。将下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,然后连接电源线,最后将开发板的电源拨码开关按键往电源指示灯的方向拨动对开发板进行上电,上电成功后开发板的电源指示灯会亮蓝灯。​

点击Vivado左侧“Flow Navigator”窗口最下面的“Open Hardware Manager”,此时Vivado软件识别到下载器,点击“Hardware”窗口中“Progam Device”下载程序,在弹出的界面中选择“Program”下载程序。​

RAM写操作在ILA中观察的波形如下图所示:​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_Memory_12


图12.5.1 RAM写操作ILA波形图​

ram_wea信号拉高之后,地址和数据都是从0开始累加,也就说当ram地址为0时,写入的数据也是0;当ram地址为1时,写入的数据也是1。我们可以发现,上图中的数据变化和在Vivado仿真的波形是一致的。​

RAM读操作在ILA中观察的波形如下图所示:​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章  IP核之RAM实验_Memory_13


图12.5.2 RAM读操作ILA波形图​

ram_wea(读使能)信号拉低之后,ram_addr从0开始增加,也就是说从ram的地址0开始读数据;ram中读出的数据ram_rd_data在延时一个时钟周期之后,开始输出数据,输出的数据为0,1,2……,和我们写入的值是相等的。我们可以发现,上图中的数据变化同样和Vivado仿真的波形是一致的。本次实验的IP核之RAM读写实验验证成功。​


标签:MPSoc,RAM,FPGA,核之,clk,ram,端口,sys,IP
From: https://blog.51cto.com/u_15046463/5920451

相关文章

  • FPGA时序入门(新手必看)
    1.FPGA时序的基本概念FPGA器件的需求取决于系统和上下游(upstreamanddownstrem)设备。我们的设计需要和其他的devices进行数据的交互,其他的devices可能是FPGA外部的芯片,可......
  • 明德扬专业定制FPGA开发板
    *产品定制提供软硬件定制服务:FPGA板卡定制;核心板模块定制;FMC等子板模块定制;FPGA全栈设计服务:FPGA系统设计从高速硬件或HDL固件,从技术参数和实现到原型和量产;信号测量......
  • Xilinx FPGA的4G通信网数据分析系统的设计
    XilinxFPGA的4G通信网数据分析系统的设计https://wenku.baidu.com/view/8200e4106bd97f192279e910.html?_wkts_=1670372707464&bdQuery=Xilinx4g+lte......
  • 【杂记】04:FPGA
    【如何才算学会了FPGA?】https://www.bilibili.com/video/BV1KP411M7CU如何才算是学会了?独立、不参考书本代码的情况下,完成所有实例,才算是入门FPGA。学FPGA需要有电路基础,模......
  • 基于Xilinx FPGA的以太网接口的链接状态获取方法
    链接状态:pg138-axi-ethernet.pdf  《AXI1G/2.5GEthernetSubsystemv7.2》Figure2-38:PCSPMATEMACStatusRegister(0x0000_0030)比特位:PhyLinkStatuspg051-tri-......
  • 学习FPGA,就业范围有哪些方面?
    部分FPGA学习爱好者在转入这一行业之前,都会发出这么一个疑问,学习FPGA,就业如何,就业的范围和前景如何?有没更具体一点的分享和讲述?其实,想要一个更具体的岗位描述,有个简单快捷的......
  • 2_ZYBO FPGA 按键控制蜂鸣器 key_beep=>key_led
    问题与思路使用按键控制蜂鸣器发声。初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫按键抖动:按键消抖:系统框图:消抖方式输入key的按......
  • 《DFZU2EG_4EV MPSoc之FPGA开发指南》第七章 Verilog HDL语法
    VerilogHDL语法​VerilogHDL(HardwareDescriptionLanguage)是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,具有灵活性高、易学易用等特点。VerilogHDL可以在......
  • 基于FPGA的图像拼接处理卡
    板卡介绍主要功能是实现对6路输入视频信号经过FPGA缩放后,叠加到一路视频中,并通过VGA接口和DVI接口同时显示叠加后的视频。输出可以是任意输入视频的四画面拼接,也可以是任意......
  • 米尔MYC-JX8MMA7核心板丨基于ARM+FPGA异核架构的工业数据与数据采集应用板卡
    随着通信与网络技术、互联网的发展,工业管理数据化、网络化、智能化已成大势所趋,利用工业物联网完成工业控制是智慧工厂中必不可少的一部分。传统的控制与数据采集系统,主机......