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

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

3天内不再提示

关于AXI BRAM控制器的相关内容

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-11-16 11:33 次阅读

学习内容

本文介绍关于AXI BRAM控制器的相关内容,针对数据量较少、地址不连续、长度不规则的情况,通过 BRAM 来进行数据的交互。

开发环境

vivado 18.3&SDK,PYNQ-Z2开发板。

AXI BRAM控制器

简介

BRAM控制器可以用于与 AXI 互连和系统主设备的集成,以与本地块 RAM 进行通信。内核支持到块 RAM 的单次和突发传输,并针对性能进行了优化。AX14或AX14- lite控制器配置中,可以配置到BRAM块的单个端口或到BRAM块的两个端口。通过第二个AX14-Lite控制端口连接,AXI BRAM控制器IP可以在数据路径上配置ECC功能,并通过可用的外部ECC寄存器设置。AXI BRAM Controller IP核的顶级端口连接和主模块如下图所示。展示了AX14-Lite模式下,AXI BRAM核心与BRAM块的连接。可以利用BRAM块的单端口利用率或BRAM块的双端口模式(通过参数设置)。

f7d009e8-6541-11ed-8abf-dac502259ad0.png



下图展示了为支持AX14接口而生成的HDL核心。对BRAM块的单端口使用可以配置在双端口配置中增强的性能设置。,详细结构框图如下:

f7dfac90-6541-11ed-8abf-dac502259ad0.png




所有与axis主设备的通信都是通过一个5通道的axis接口进行的。所有写操作都在AXI总线的写地址通道(AW)上启动,该通道指定了写事务的类型和相应的地址信息。写数据通道(W)为单个或突发写操作通信所有写数据。写响应通道(B)用作写操作的握手或响应。

在读操作上,当AXI主程序请求读传输时,读地址通道(AR)通信所有地址和控制信息。当可以处理读操作时,AXI从AXI BRAM控制器IP响应读地址通道(AR)。当读取数据可用时,读数据通道(R)将转换操作的数据和状态。

支持内存大小

AXI BRAM Controller支持的内存最大为2mbytes(字节大小为8或9),支持的内存宽度和深度如表1-1所示。

f7f3d1de-6541-11ed-8abf-dac502259ad0.png




AXI BRAM Controller IP支持的最小深度为512字节。任何小于512的深度都被调整为512字节。

系统框图与工程设计

工程功能设计为PS 将串口接收到的数据写入 BRAM,然后从 BRAM 中读出数据,并通过串口打印出来;与此同时, PL 从 BRAM 中同样读出数据,并通过 ILA 来观察读出的数据与串口打印的数据是否一致。系统框图如下:

f8115f7e-6541-11ed-8abf-dac502259ad0.png

硬件平台搭建

新建工程,创建 block design。

配置ZYNQ7

添加ZYNQ7 IP,对zynq进行初始化配置,勾选配置uart资源,

f81fc60e-6541-11ed-8abf-dac502259ad0.png

使能clock复位和 M_GP0接口,

f83c9874-6541-11ed-8abf-dac502259ad0.png

配置时钟

f84859b6-6541-11ed-8abf-dac502259ad0.png

配置BRAM控制器和BRAM

接着配置BRAM控制器,基本是默认配置。

f876b220-6541-11ed-8abf-dac502259ad0.png

配置BRAM

f8db58b0-6541-11ed-8abf-dac502259ad0.png

连接连线后系统如下,

f8fc8b7a-6541-11ed-8abf-dac502259ad0.png

设计读取控制模块

首先点击tools创建一个新的IP,

f906ef52-6541-11ed-8abf-dac502259ad0.png

选择创建一个AXI4接口的IP。

f9168958-6541-11ed-8abf-dac502259ad0.png

编辑IP名称等信息,设计IP的接口信息,

f92241d0-6541-11ed-8abf-dac502259ad0.png

点击finish,完成IP创建。

f9593fa0-6541-11ed-8abf-dac502259ad0.png

在IP目录下找到自己创建好的IP,右键进行IP的编辑。

f96b0c1c-6541-11ed-8abf-dac502259ad0.png

在顶层进行例化ram接口。

f97c0a26-6541-11ed-8abf-dac502259ad0.png

在AXI总线协议实现的文件中添加IP的例化,实现AXI-Lite接口的功能进行参数的传递。

f98d11ae-6541-11ed-8abf-dac502259ad0.png

这里引用正点原子的BRAM的读取模块,bram_rd.v


		
module bram_rd(
    input                clk        , //时钟信号
    input                rst_n      , //复位信号
    input                start_rd   , //读开始信号
    input        [31:0]  start_addr , //读开始地址  
    input        [31:0]  rd_len     , //读数据的长度
    //RAM端口
    output               ram_clk    , //RAM时钟
    input        [31:0]  ram_rd_data, //RAM中读出的数据
    output  reg          ram_en     , //RAM使能信号
    output  reg  [31:0]  ram_addr   , //RAM地址
    output  reg  [3:0]   ram_we     , //RAM读写控制信号
    output  reg  [31:0]  ram_wr_data, //RAM写数据
    output               ram_rst      //RAM复位信号,高电平有效
);


//reg define
reg  [1:0]   flow_cnt;
reg          start_rd_d0;
reg          start_rd_d1;


//wire define
wire         pos_start_rd;


//*****************************************************
//**                  main code
//*****************************************************


assign  ram_rst = 1'b0;
assign  ram_clk = clk ;
assign pos_start_rd = ~start_rd_d1 & start_rd_d0;


//延时两拍,采start_rd信号的上升沿
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        start_rd_d0 <= 1'b0;   
        start_rd_d1 <= 1'b0; 
    end
    else begin
        start_rd_d0 <= start_rd;   
        start_rd_d1 <= start_rd_d0;     
    end
end


//根据读开始信号,从RAM中读出数据
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        flow_cnt <= 2'd0;
        ram_en <= 1'b0;
        ram_addr <= 32'd0;
        ram_we <= 4'd0;
    end
    else begin
        case(flow_cnt)
            2'd0 : begin
                if(pos_start_rd) begin
                    ram_en <= 1'b1;
                    ram_addr <= start_addr;
                    flow_cnt <= flow_cnt + 2'd1;
                end
            end
            2'd1 : begin
                if(ram_addr - start_addr == rd_len - 4) begin  //数据读完
                    ram_en <= 1'b0;
                    flow_cnt <= flow_cnt + 2'd1;
                end
                else
                    ram_addr <= ram_addr + 32'd4;              //地址累加4
            end
            2'd2 : begin
                ram_addr <= 32'd0; 
                flow_cnt <= 2'd0;
            end
        endcase    
    end
end


endmodule

创建引脚接口,选择任意一个BRAM引脚,创建封装

f9a00d54-6541-11ed-8abf-dac502259ad0.png

设置接口和名称,

f9d1e1f8-6541-11ed-8abf-dac502259ad0.png

完成接口映射。

f9eb52be-6541-11ed-8abf-dac502259ad0.png

然后点击完成IP封装。

f9fc7f30-6541-11ed-8abf-dac502259ad0.png

完成系统设计

完成IP的创建后,添加IP,完成连线,整体设计如下图所示:

fa0a4886-6541-11ed-8abf-dac502259ad0.png

然后在完成综合后进行setup debug ,抓取b端口有关的信号。

fa15ba54-6541-11ed-8abf-dac502259ad0.png

完成添加DEDUG信号后,进行综合生成bit流,然后导出硬件,launch SDK。

SDK软件部分

新建应用工程,main.c中输入以下代码:


		
#include "xil_printf.h"
#include "stdio.h"
#include "xbram_hw.h"
#include "ps_pl_rd_ip.h"
#include "xparameters.h"


#define PL_BRAM_START  PS_PL_RD_IP_S00_AXI_SLV_REG0_OFFSET
#define PL_BRAM_START_ADDR PS_PL_RD_IP_S00_AXI_SLV_REG1_OFFSET
#define PL_BRAM_LEN PS_PL_RD_IP_S00_AXI_SLV_REG2_OFFSET
#define PS_PL_BASEADDR XPAR_PS_PL_RD_IP_0_S00_AXI_BASEADDR


#define START_ADDR  0
#define BRAM_DATA_BYTE 4
char input_data[1024];
int len_input_data;
int main(){
  while(1){
    int i=0;
    int wr_cnt=0;
    printf("ps_pl_bram test
");
    scanf("%s",input_data);
    len_input_data= strlen(input_data);
    for(i = START_ADDR*BRAM_DATA_BYTE;i<(START_ADDR + len_input_data)*BRAM_DATA_BYTE;i+=BRAM_DATA_BYTE)
    {
      PS_PL_RD_IP_mWriteReg(XPAR_BRAM_0_BASEADDR,i,input_data[wr_cnt]);
      wr_cnt++;
    }
    //配置起始地址
    PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_START_ADDR,START_ADDR*BRAM_DATA_BYTE);
    //配置读取长度
    PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_LEN,len_input_data*BRAM_DATA_BYTE);
    //使能脉冲
    PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_START,1);
    PS_PL_RD_IP_mWriteReg(PS_PL_BASEADDR,PL_BRAM_START,0);
    for(i = START_ADDR*BRAM_DATA_BYTE;i<(START_ADDR + len_input_data)*BRAM_DATA_BYTE;i+=BRAM_DATA_BYTE)
    {
      printf("bram address : %d ,read data : %c
",i/BRAM_DATA_BYTE,PS_PL_RD_IP_mReadReg(XPAR_BRAM_0_BASEADDR,i));
    }
  }
}

部分代码讲解

本次工程比较简单,在while循环中实现了对串口输入的存储和显示打印。

运行效果

fa348cd6-6541-11ed-8abf-dac502259ad0.png

在这里插入图片描述

ila抓取数据

通过ILA抓取的读取数据和发送写入的数据一致。

fa46e156-6541-11ed-8abf-dac502259ad0.png



审核编辑 :李倩


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

    关注

    112

    文章

    16332

    浏览量

    177811
  • BRAM
    +关注

    关注

    0

    文章

    41

    浏览量

    10956

原文标题:SDK软件部分

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    EMC电机控制器测试整改:性能提升的完整路径

    在当今电子设备高度集成和复杂化的背景下,电磁兼容性(EMC)问题日益凸显。作为电动机控制系统的核心部件,电机控制器的EMC性能直接关系到整个系统的稳定运行和电磁环境的和谐共存。本文深圳南柯电子小编将探讨EMC电机控制器测试整改的
    的头像 发表于 12-17 17:22 180次阅读

    电机控制器原理是什么?类型有哪些?

    电机控制器是用于控制电机运行的设备,其主要功能是将电能转换为机械能,同时根据需要调节电机的速度、转矩和方向。电机控制器的原理主要基于电力电子技术、自动控制理论和电机理论。以下是
    的头像 发表于 10-21 13:48 367次阅读

    TAS6424(L)-Q1 Fault脚如何控制拉低?

    请问是否有TAS6424(L)-Q1的相关应用文档,介绍以下相关内容: Fault脚如何控制拉低?当过压多少伏之后产生Fault信号,恢复后没有声音输出,如何控制其恢复正常?
    发表于 10-11 06:13

    求助,关于LM331 F/V转换电路输入电容选择的问题求解

    数据手册中F/V转换电路的输入电容都是470pF,请问下这个电容的选择依据或者改变这个值的影响都有什么,在手册中没有找到相关内容,请大神帮忙解答一下
    发表于 07-31 06:14

    Xilinx NVMe AXI4主机控制器AXI4接口高性能版本介绍

    NVMe AXI4 Host Controller IP可以连接高速存储PCIe SSD,无需CPU,自动加速处理所有的NVMe协议命令,具备独立的数据写入和读取AXI4接口,不但适用高性能、顺序
    的头像 发表于 07-18 09:17 533次阅读
    Xilinx NVMe <b class='flag-5'>AXI</b>4主机<b class='flag-5'>控制器</b>,<b class='flag-5'>AXI</b>4接口高性能版本介绍

    如何在psoc 4控制器 (CY8C4245AXI-483) 中实现RC5协议?

    如何在 psoc 4 控制器 (CY8C4245AXI-483) 中实现 RC5 协议
    发表于 07-04 07:38

    移动机械控制器 车载智能控制器 CAN总线控制器

    控制器机械
    长沙硕博电子科技股份有限公司
    发布于 :2024年06月13日 17:02:51

    基于FPGA设计的BRAM内部结构

    再看末级触发BRAM时序性能的影响,下图依次展示了7系列FPGA、UltraScale+和Versal芯片在未使用和使用末级触发两种情形下时钟到输出的延迟。
    发表于 04-25 10:42 415次阅读
    基于FPGA设计的<b class='flag-5'>BRAM</b>内部结构

    FPGA通过AXI总线读写DDR3实现方式

    AXI总线由一些核心组成,包括AXI主处理接口(AXI4)、AXI处理到协处理
    发表于 04-18 11:41 1258次阅读

    STM32F407+CUBEMX+DP83848K,LED_speed黄灯上电常亮,LED_Link绿灯一直不亮为什么?

    如题,用CUBEMX配置好RCC,ETH,LWIP相关内容后,直接生成代码编译下载,LED_Link绿灯一直不亮,MAC端网口也显示未连接
    发表于 03-19 07:02

    PCIe-AXI-Cont用户手册

    Transaction layer的所有功能特性,不仅内置DMA控制器,而且具备AXI4用户接口,提供一个高性能,易于使用,可定制化的PCIe-AXI互连解决方案,同时适用于ASIC和FPGA。
    发表于 02-22 09:15 3次下载

    PCIe控制器(FPGA或ASIC),PCIe-AXI-Controller

    Transaction Layer的所有功能特性,不仅内置DMA控制器,而且具备AXI4用户接口,提供一个高性能,易于使用,可定制化的PCIe-AXI互连解决方案,同时适用于ASIC和FPGA。
    的头像 发表于 02-21 15:15 899次阅读
    PCIe<b class='flag-5'>控制器</b>(FPGA或ASIC),PCIe-<b class='flag-5'>AXI</b>-Controller

     海外云服务搭建pi节点详细步骤

     海外云服务搭建pi节点简单吗?海外云服务搭建pi节点步骤有哪些?小编为您整理发布海外云服务搭建pi节点相关内容
    的头像 发表于 02-21 10:16 1110次阅读

    苹果获取头显专利:可精准控制地理位置相关内容展示

     这项名为《限制指定私人内容的方法及设备》的专利旨在让用户只在特定环境下才可通过 Vision Pro 头显获取相应数据。以 IT之家提供的专利实例来看,用户可以设定 Vision Pro 的权限,令家中或者办公室特定区域的用户方能看见所需的数据。
    的头像 发表于 01-31 10:23 530次阅读
    苹果获取头显专利:可精准<b class='flag-5'>控制</b>地理位置<b class='flag-5'>相关内容</b>展示

    关于控制器的基础知识分享

    控制器存储和管理用户账号、密码策略、组策略以及其他安全相关的信息。它允许用户通过认证获得对域内资源的访问权限。用户登录到域中的计算机时,域控制器会验证用户的身份,并授予相应的权限。
    的头像 发表于 01-24 16:31 955次阅读