EXMC(FSMC)转BRAM,实现单片机与FPGA的交互,FPGA端

article/2025/10/9 9:53:32

目录

    • 1. 前言
      • 1.1 需求
      • 1.2 平台
    • 2. 背景知识
    • 3. 实操
      • 3.1 工程介绍
      • 3.2 接口介绍
        • 3.2.1 EXMC信号介绍:
        • 3.2.2 BRAM接口介绍
        • 3.2.2 对比
      • 3.3 代码:
    • 5. 附录

1. 前言

在国产的GD32和复旦微FPGA之间实现较高带宽的数据通信,可以使用EXMC接口。EXMC接口通过部分逻辑与FPGA中例化的BRAM接口相连。使用双口RAM的形式就能实现GD32和FPGA内部逻辑的交互。

GD32是主,EXMC是用来接外设的。把FPGA的BRAM当做外部存储去进行访问即可

EXMC是类似于STM32中的FSMC接口,FSMC(Flexible Static Memory Controller),可变静态存储控制器)是STM32系列采用的一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。

1.1 需求

使用EXMC实现GD32与FPGA多块BRAM的数据通信。

能实现多块就能实现一块,差不多,加了一个地址解码的过程

你问我为何不直接使用ZYNQ呢,内嵌的ARM硬核与FPGA之间直接就有多组高速的数据通路,没办法,用户的奇怪需求。

1.2 平台

  1. Vivado2019.1
  2. Keil5
  3. 芯片型号

2. 背景知识

EXMC的介绍可以参考FSMC:

  1. FMC/FSMC/EXMC总线NORFlash/PSRAM接口(异步-复用-不突发/同步-复用-突发)
  2. GD32学习笔记(1)EXMC介绍
  3. 在STM32F429/GD32F450中用FMC/EXMC初始化SDRAM
  4. STM32的FSMC外设简介-微光倾城
  5. FSMC知识详解,以及驱动TFTLCD原理-嵌入式硬件

最好先了解清楚以上背景知识再看原文。

3. 实操

3.1 工程介绍

由于需求的原因实际上还加了很多其他的模块:比如CAN,UART,DDR,RGMII,MicroBlaze。这里就不赘述了。与本博客相关的就是红色框框内的内容:
工程结构

3.2 接口介绍

顶层接口主要是:EXMC的输入输出接口,双口RAM的输入输出接口。

3.2.1 EXMC信号介绍:

信号名宽度作用
EXMC_DATABUS32数据总线,支持8bit 16bit 32bit
EXMC_ADDERBUS26地址总线
EXMC_NE4片选
EXMC_NWAIT1等待信号
EXMC_NWE1写使能
EXMC_NOE1读使能
EXMC_NBL4字节有效信号
EXMC_NADV1地址有效信号
//EXMC是GD32过来的接口inout [31:0]  EXMC_DATABUS,input [25:0]  EXMC_ADDERBUS,input [3:0]   EXMC_NE,output        EXMC_NWAIT,input         EXMC_NWE,input         EXMC_NOE,input   [3:0] EXMC_NBL,input         EXMC_NADV,

3.2.2 BRAM接口介绍

BRAM接口都是从Block Design 中引出来的。
内容也很简单,可以稍微学习一下。

名称作用
BRAM_PORTA_0_0_addr地址
BRAM_PORTA_0_0_clk时钟
BRAM_PORTA_0_0_din数据输入
BRAM_PORTA_0_0_dout数据输出
BRAM_PORTA_0_0_en数据输入输出使能
BRAM_PORTA_0_0_rst复位
BRAM_PORTA_0_0_we字节选择

代码:定义在了top层

//BRAM定义在了Block Design中,位宽为32位,深度为4kwire [31:0]	BRAM_PORTA_0_0_addr;wire 			BRAM_PORTA_0_0_clk;wire [31:0]	BRAM_PORTA_0_0_din;wire [31:0]	BRAM_PORTA_0_0_dout;wire 			BRAM_PORTA_0_0_en;wire 			BRAM_PORTA_0_0_rst;wire [3:0]	BRAM_PORTA_0_0_we;//双口RAM才能实现GD32和FPGA的交互wire [31:0]	BRAM_PORTB_0_0_addr;wire 			BRAM_PORTB_0_0_clk;wire [31:0]	BRAM_PORTB_0_0_din;wire [31:0]	BRAM_PORTB_0_0_dout;wire 			BRAM_PORTB_0_0_en;wire 			BRAM_PORTB_0_0_rst;wire [3:0]	BRAM_PORTB_0_0_we;

BRAM接口在Block Design中。当然也能不在Block Design中使用。
BRAM

BRAM在BD中的样子,由于BRAM用的多,做了封装,方便查看整理修改。

BD
如何封装Block Design中的模块

3.2.2 对比

我们对比两个接口的类型,发现:

  1. EXMC属于异步半双工主从数据总线,读写有单独的使能信号,数据通道是双向的,还存在片选信号。GD32为主,FPGA为从。
  2. BRAM属于同步半双工主从数据总线,FPGA逻辑是主,BRAM是从。

3.3 代码:

特别注意EXMC_DATABUS是inout类型!!!

整体关系如下:

(GD32) <--> (EXMC控制器) ===EXMC接口=== (FPGA逻辑)  ===BRAM接口 === (BRAM) === BRAM接口 === (FPGA逻辑)

核心代码:

实测能够稳定运行。

有几个注意的点:

  1. EXMC_DATABUS 是inout信号,需要进行转换,我在decode模块中做了处理,所以在exmc2bram中就变成了EXMC_DATABUS_rd,EXMC_DATABUS_wr;
  2. EXMC_XXX的控制信号都是异步的,为了能够准确采样需要打几拍才能保证在数据传递时不出错;
  3. GD32写过数据是单字节的,所以需要根据地址的低2位确定写的是32位中的那个字节。如果是16位,那就根据第1位就好了;
  4. 读写的enable信号是我对照波形采样修改出来的,可以稳定运行,可做修改。
module exmc2bram(input sys_rst, input sys_clk,// inout [15:0]  EXMC_DATABUS  ,output[31:0]  EXMC_DATABUS_rd     ,input [31:0]  EXMC_DATABUS_wr     ,input         EXMC2BRAM_EN        ,input [25:0]  EXMC_ADDERBUS ,input         EXMC_NADV,input [3:0]   EXMC_NE,output        EXMC_NWAIT,input         EXMC_NWE,   //input         EXMC_NOE,   // input [3:0]   EXMC_NBL,   //output [31:0]   BRAM_R_0_addr,output          BRAM_R_0_clk,output [31:0]   BRAM_R_0_din,input [31:0]    BRAM_R_0_dout,output          BRAM_R_0_en,output          BRAM_R_0_rst,output [3:0]    BRAM_R_0_we,output [31:0]   BRAM_W_0_addr,output          BRAM_W_0_clk,output [31:0]   BRAM_W_0_din,input  [31:0]   BRAM_W_0_dout,output          BRAM_W_0_en,output          BRAM_W_0_rst,output [3:0]    BRAM_W_0_we,output          done);wire read_en;wire write_en;reg   write_en_delay;reg   write_en_delay2;reg   write_en_delay3;wire  write_en_in;reg  read_en_delay;wire addr_en;reg  addr_en_delay;wire data_en;assign  EXMC_NWAIT=1'b0;//提取输入输出有效的值//当写使能有效,片选有效,读无效,地址有效,且使能BRAM(自创的,因为有多块RAM)时,写使能assign write_en= (~EXMC_NWE)& (~EXMC_NE[0]) & EXMC_NOE & EXMC_NADV & EXMC2BRAM_EN;//当读有效,片选有效,地址有效,且使能BRAM,读使能assign read_en = (~EXMC_NOE)& (~EXMC_NE[0]) & EXMC_NADV & EXMC2BRAM_EN;assign write_en_in = (!write_en_delay3) && write_en_delay;always @ (posedge sys_clk ) beginwrite_en_delay  <=write_en;write_en_delay2 <=write_en_delay;write_en_delay3 <=write_en_delay2;endassign addr_en	   = read_en_delay  & read_en;assign data_en	   = addr_en_delay  & addr_en;always @(posedge sys_clk) beginread_en_delay        <=read_en;addr_en_delay        <=addr_en;endassign BRAM_W_0_addr =   write_en_in  ?  {16'd0,EXMC_ADDERBUS[15:0] }   : 32'hZZZZ_ZZZZ;assign BRAM_W_0_din  =   write_en_in  ?  (EXMC_ADDERBUS[1:0]==2'b00  ?  {24'd0,  EXMC_DATABUS_wr[7:0]        } : (EXMC_ADDERBUS[1:0]==2'b01  ?  {16'd0,  EXMC_DATABUS_wr[7:0], 8'd0  } :(EXMC_ADDERBUS[1:0]==2'b10  ?  {8'd0,   EXMC_DATABUS_wr[7:0], 16'd0 } :(EXMC_ADDERBUS[1:0]==2'b11  ?  {        EXMC_DATABUS_wr[7:0], 24'd0 } : 32'hZZZZ_ZZZZ)))): 32'hZZZZ_ZZZZ; assign  BRAM_W_0_clk  =   sys_clk;assign  BRAM_W_0_en   =   write_en_in ;assign  BRAM_W_0_we   =   write_en_in ? (EXMC_ADDERBUS[1:0]==2'b00  ?  4'b0001 : (EXMC_ADDERBUS[1:0]==2'b01  ?  4'b0010 :(EXMC_ADDERBUS[1:0]==2'b10  ?  4'b0100 :(EXMC_ADDERBUS[1:0]==2'b11  ?  4'b1000 : 4'bZZZZ)))): 4'bZZZZ;assign  BRAM_W_0_rst  =   1'b0;assign  BRAM_R_0_addr =   addr_en  ?   {16'd0,EXMC_ADDERBUS[15:0] } : 32'hZZZZ_ZZZZ;assign  EXMC_DATABUS_rd = data_en  ?    (EXMC_ADDERBUS[1:0]==2'b00  ?  {24'd0,  BRAM_R_0_dout[7 :0 ]  } : (EXMC_ADDERBUS[1:0]==2'b01  ?  {24'd0,  BRAM_R_0_dout[15:8 ]  } :(EXMC_ADDERBUS[1:0]==2'b10  ?  {24'd0,  BRAM_R_0_dout[23:16]  } :(EXMC_ADDERBUS[1:0]==2'b11  ?  {24'd0,  BRAM_R_0_dout[31:24]  } : 32'hZZZZ_ZZZZ)))): 32'hZZZZ_ZZZZ; assign  BRAM_R_0_clk  =   sys_clk;assign  BRAM_R_0_en   =   addr_en;assign  BRAM_R_0_we   =   4'b0000;assign  BRAM_R_0_rst  =   1'b0;
endmodule

5. 附录

对于多个BRAM的时候我是怎么做的呢?

首先对不同的BRAM进行地址的分配,由于26位的地址,高位很多时候用不到,与嵌入式工程师商量,将高位地址进行分块,不同的BRAM高位不一样,就能通过提取高位判断的方式明确要写到那个BRAM中,就是一个简单的译码器的原理。

下面的代码还实现了inout信号输入输出的问题。

decode

代码如下:

module decode_module(input         clk           ,inout [31:0]EXMC_DATABUS  ,input [25:0]EXMC_ADDERBUS ,input       EXMC_NADV,input [3:0] EXMC_NE,input [31:0]EXMC_DATABUS_rd_0  ,input [31:0]EXMC_DATABUS_rd_1  ,input [31:0]EXMC_DATABUS_rd_2  ,input [31:0]EXMC_DATABUS_rd_3  ,input [31:0]EXMC_DATABUS_rd_4  ,input [31:0]EXMC_DATABUS_rd_5  ,input [31:0]EXMC_DATABUS_rd_6  ,input [31:0]EXMC_DATABUS_rd_7  ,input [31:0]EXMC_DATABUS_rd_8  ,input [31:0]EXMC_DATABUS_rd_9  ,input [31:0]EXMC_DATABUS_rd_10 ,input [31:0]EXMC_DATABUS_rd_11 ,input [31:0]EXMC_DATABUS_rd_12 ,input [31:0]EXMC_DATABUS_rd_13 ,output [31:0]EXMC_DATABUS_wr_0  ,output [31:0]EXMC_DATABUS_wr_1  ,output [31:0]EXMC_DATABUS_wr_2  ,output [31:0]EXMC_DATABUS_wr_3  ,output [31:0]EXMC_DATABUS_wr_4  ,output [31:0]EXMC_DATABUS_wr_5  ,output [31:0]EXMC_DATABUS_wr_6  ,output [31:0]EXMC_DATABUS_wr_7  ,output [31:0]EXMC_DATABUS_wr_8  ,output [31:0]EXMC_DATABUS_wr_9  ,output [31:0]EXMC_DATABUS_wr_10 ,output [31:0]EXMC_DATABUS_wr_11 ,output [31:0]EXMC_DATABUS_wr_12 ,output [31:0]EXMC_DATABUS_wr_13 ,output [13:0]EXMC2BRAM_EN       ,output done);wire      is_rs232_0  = EXMC_ADDERBUS[25:20]== 6'h00 ? 1'b1 : 1'b0 ;wire      is_rs232_1  = EXMC_ADDERBUS[25:20]== 6'h02 ? 1'b1 : 1'b0 ;wire      is_rs232_2  = EXMC_ADDERBUS[25:20]== 6'h04 ? 1'b1 : 1'b0 ;wire      is_rs422_0  = EXMC_ADDERBUS[25:20]== 6'h06 ? 1'b1 : 1'b0 ;wire      is_rs485_0  = EXMC_ADDERBUS[25:20]== 6'h08 ? 1'b1 : 1'b0 ;wire      is_rs485_1  = EXMC_ADDERBUS[25:20]== 6'h0A ? 1'b1 : 1'b0 ;wire      is_can_0    = EXMC_ADDERBUS[25:20]== 6'h0C ? 1'b1 : 1'b0 ;wire      is_can_1    = EXMC_ADDERBUS[25:20]== 6'h0E ? 1'b1 : 1'b0 ;wire      is_rgmii_0  = EXMC_ADDERBUS[25:20]== 6'h10 ? 1'b1 : 1'b0 ;wire      is_rgmii_1  = EXMC_ADDERBUS[25:20]== 6'h12 ? 1'b1 : 1'b0 ;wire      is_rgmii_2  = EXMC_ADDERBUS[25:20]== 6'h14 ? 1'b1 : 1'b0 ;wire      is_rgmii_3  = EXMC_ADDERBUS[25:20]== 6'h16 ? 1'b1 : 1'b0 ;wire      is_rgmii_4  = EXMC_ADDERBUS[25:20]== 6'h18 ? 1'b1 : 1'b0 ;wire      is_rgmii_5  = EXMC_ADDERBUS[25:20]== 6'h1A ? 1'b1 : 1'b0 ;wire      is_read     = EXMC_ADDERBUS[19:16]== 4'h0 ? 1'b1 : 1'b0 ;wire      is_write    = EXMC_ADDERBUS[19:16]== 4'h1 ? 1'b1 : 1'b0 ;wire      [13:0] read_case_w;assign    read_case_w={   is_rgmii_5, is_rgmii_4, is_rgmii_3, is_rgmii_2, is_rgmii_1, is_rgmii_0,is_can_1,   is_can_0,   is_rs485_1, is_rs485_0, is_rs422_0, is_rs232_2, is_rs232_1, is_rs232_0};assign    EXMC2BRAM_EN=read_case_w;   //enable exmc to bram moduleassign    EXMC_DATABUS_wr_0  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_1  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_2  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_3  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_4  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_5  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_6  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_7  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_8  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_9  =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_10 =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_11 =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_12 =   EXMC_DATABUS ;assign    EXMC_DATABUS_wr_13 =   EXMC_DATABUS ;reg [31:0]EXMC_DATABUS_r =32'h0000_0000;always @(posedge clk ) begincase (read_case_w)14'b0000_0000_0000_01:  EXMC_DATABUS_r = EXMC_DATABUS_rd_0;14'b0000_0000_0000_10:  EXMC_DATABUS_r = EXMC_DATABUS_rd_1;14'b0000_0000_0001_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_2;14'b0000_0000_0010_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_3;14'b0000_0000_0100_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_4;14'b0000_0000_1000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_5;14'b0000_0001_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_6;14'b0000_0010_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_7;14'b0000_0100_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_8;14'b0000_1000_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_9;14'b0001_0000_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_10;14'b0010_0000_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_11;14'b0100_0000_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_12;14'b1000_0000_0000_00:  EXMC_DATABUS_r = EXMC_DATABUS_rd_13;default:                EXMC_DATABUS_r = EXMC_DATABUS_rd_0;endcaseendassign  EXMC_DATABUS =is_read?EXMC_DATABUS_r:32'hZZZZ_ZZZZ;

http://chatgpt.dhexx.cn/article/rrBmYtMs.shtml

相关文章

FPGA逻辑资源评估之BRAM(以Xilinx为例)

在FPGA逻辑设计时&#xff0c;需要参考所需逻辑资源对FPGA进行选型&#xff0c;其中一项就是对BRAM的评估&#xff0c;在这里以xilinx UltraSCALE系列FPGA为例&#xff0c;对BRAM进行简单介绍。 FPGA中RAM资源一般分为DRAM和BRAM两种&#xff0c;而Xilinx UltraSCALE系列FPGA除…

xilinx BRAM实现FIFO

许多FPGA设计使用BRAM来实现FIFO。在Xilinx 7系列体系结构中&#xff0c;块RAM中的专用逻辑能够实现同步或双时钟&#xff08;异步&#xff09;FIFO。这消除了计数器、比较器或状态标志生成所需的额外CLB逻辑&#xff0c;并且每个FIFO仅使用一个块RAM资源。支持标准和首字跳转&…

【正点原子FPGA连载】 第十八章基于BRAM的PS和PL的数据交互 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十八章基于BRA…

Xilinx 7系列 BRAM概述

Xilinx7系列FPGA中的块RAM可存储36 Kb的数据&#xff0c;可以配置为两个独立的18 Kb RAM或一个36 Kb RAM。在简单双端口模式下&#xff0c;每个36 Kb块RAM可以配置为64K x 1&#xff08;与相邻的36 Kb块内存级联时&#xff09;、32K x 1、16K x 2、8K x 4、4K x 9、2K x 18、1K…

ZYNQ—BRAM全双工PS_PL数据交互(开源)

本资源实现了&#xff1a;采用ZYNQ7010&#xff1b;vivado 2018.3&#xff1b;xilinx sdk&#xff1b;正点原子XCOM串口助手&#xff0c;PS与PL均读写操作。 1、PS写0-9地址 0-9数据&#xff0c;触发start给PL。 2、PL接收到触发后&#xff0c;做两次的打拍&#xff0c;再遍历一…

FPGA — BRAM 队列实践

使用软件&#xff1a; Vivado 开发板&#xff1a; EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA BRAM 队列实践 功能描述功能实现1. 添加BRAM的IP2. 数码管显示3. 时钟分频4. 按键消抖5. 顶层设计 结果遇到问题及解决仿真测试 功能描述 数码管3位显示数字&#xff0c;可以…

Vivado综合生成BRAM及与LUTRAM的区别

使用vivado中的BRAM可以通过例化Block Memory Generator这一ip并进行相关的设定。 另外可以通过直接编写符合BRAM规范的代码&#xff0c;借助综合工具直接将其综合为BRAM。这时需要通过(*ram_style"block"*)对array进行修饰。 下面给出一种看似可以综合为BRAM的示例…

Xilinx BRAM IP介绍

BRAM IP核介绍 BRAM简介BRAM类型三种读写模式写优先读优先No change 总线支持输出寄存 BRAM简介 BRAM&#xff0c;即Block RAM&#xff0c;是FPGA中一种重要的存储资源&#xff0c;另一种常见的存储资源是DRAM(Distributed RAM)&#xff0c;Distributed RAM 经过综合工具综合&…

vivado中bram简单使用

bram设置为简单双口 建议取消勾选这个&#xff0c;这样读出来的数据是差一个时钟周期的 vivado中的bram&#xff0c;写的时候&#xff0c;写使能&#xff0c;写地址&#xff0c;写数据一起赋值 读的时候&#xff0c;读使能&#xff0c;读地址可以一起赋值&#xff0c;数据为…

使用VIVADO中的MIG控制DDR3(AXI接口)二——用AXI4读写BRAM测试

上篇文章主要讲了一些关于AXI的知识&#xff0c;有了这些理论&#xff0c;让我们进行一些简单的实验测试&#xff0c;加深对AXI协议的理解。本次实验使用的平台是VIVADO2019.1。 1. 首先创建一个工程&#xff0c;名称和路径自己决定。 2.然后按照图中所示&#xff0c;点击新建和…

URAM和BRAM有什么区别

无论是7系列FPGA、UltraScale还是UltraScale Plus系列FPGA&#xff0c;都包含Block RAM&#xff08;BRAM&#xff09;&#xff0c;但只有UltraScale Plus芯片有UltraRAM也就是我们所说的URAM。BRAM和URAM都是重要的片上存储资源&#xff0c;但两者还是有些显著的区别。 容量 B…

【FPGA】AXI4-Lite总线读写BRAM

博主参考和学习的博客 AXI协议基础知识 。这篇博客比较详细地介绍了AXI总线&#xff0c;并且罗列了所有的通道和端口&#xff0c;写代码的时候可以方便地进行查表。AXI总线&#xff0c;AXI_BRAM读写仿真测试 。 这篇文章为代码的书写提供大致的思路&#xff0c;比如状态机和时…

如何对bram/ram进行初始化赋值呢?

1、首先对于常规的情况&#xff0c;即加载.coe文件的方式实现初始化&#xff08;与rom相同&#xff09; 点击load initial file, 在右侧可以直接添加.coe文件&#xff0c;或者选择edit进行手动编辑&#xff08;数据量不大的情况下可选&#xff0c;但是不推荐&#xff09;&#…

vivado中bram的种类与使用

vivado中bram的种类与使用 vivado中bram的分类单端口ram初始化工作时序仿真验证 简化的双端口RAM初始化端口定义仿真结果 双端口RAM初始化端口定义功能仿真单端口读数双端口读数双端口一读一写双端口写数据 vivado中bram的分类 在vivado中打开IP catalog&#xff0c;在其中搜索…

BRAM的使用

使用Block Memory Generator IP核&#xff0c;PL读取BRAM数据 软件环境&#xff1a;Vivado 2018.3 IP核&#xff1a;Block Memory Generator 8.4(Rev.2) 1、点击IP Catalog 2、搜索”Block Memory Generator“双击选择RAMs & ROMs & BRAM下的IP核 3、配置IP核为Si…

FPGA — BRAM学习笔记—读写操作

使用软件&#xff1a; Vivado 开发板&#xff1a; EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA BRAM笔记 BRAM介绍同步双端口BRAMBRAM读写操作(1)读操作(2)写操作(3)写模式写优先模式读优先模式不变模式 双端口块内存接口BRAM IP的使用及仿真验证IP核使用coe文件将IP核添…

FPGA从入门到精通(8)-BRAM

所使用EDA软件&#xff1a;VIVADO2018.3 FPGA型号&#xff1a;xc7a35tcsg325-2 很久没写了&#xff0c;随便写一篇BRAM的吧。说到BRAM &#xff0c;很多人都喜欢拿它来DRAM比较 &#xff0c;两者都有啥优缺点&#xff0c;其实我也拿不准。不过一般来说&#xff0c;存储较大的数…

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据 一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zyn…

FPGA设计中BRAM(Block RAMs)资源的使用(综合为BRAM)

FPGA设计中BRAM&#xff08;Block RAMs&#xff09;资源的使用 RAM分为BRAM&#xff08;Block RAMs&#xff09;和DRAM&#xff08;Distributed RAM&#xff09;&#xff0c;即块RAM与分布式RAM&#xff0c;这两个差别在于BRAM是FPGA上固有的一些存储资源&#xff08;针对不同型…

web测试与app测试的区别

目录 前言 首先从系统架构来看 专项测试 安装、卸载、更新&#xff1a; 界面操作&#xff1a; 前言 仅仅从功能测试的层面上来讲的话&#xff0c;在流程和功能测试上是没有区别的。那么区别在哪里呢&#xff1f; 我个人觉得就是由于载体不一样&#xff0c;所以系统测试和…