Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 5.

Сегодня пример посветим BRAM, немного про BRAM было рассказано в предыдущей статье, сегодня будем расширять знания по этой теме.

Block Memory Generator – используется как элемент оперативного и постоянного хранения информации, данный элемент реализуется на основе блочной памяти FPGA. Запоминающее устройство, генерируемое с помощью настраиваемого модуля Block Memory Generator. Во всех элементах памяти, создаваемых с помощью генератора Block Memory Generator, для каждого порта запоминающего устройства можно задействовать входы управления режимами разрешения/запрета выполнения операций. Ядро Block Memory Generator использует встроенные примитивы Block Memory в FPGA Xilinx, чтобы расширить функциональность и возможности одного примитива для памяти произвольной ширины и глубины. Для сложных алгоритмов, в генераторе блочной памяти, ядро производит оптимизированные решения для обеспечения удобного доступа к памяти для широкого спектра конфигураций. Ядро ​​имеет два полностью независимых порта для доступа к общей памяти. И А, и Порты B имеют интерфейс записи и чтения. В архитектурах UltraScale, Zynq-7000 и 7 серий FPGA каждый из четырех интерфейсов может быть уникально сконфигурирован с различной шириной данных. Для Block Memory Generator вы можете выбрать упрощенную конфигурацию памяти (например, однопортовая память или простая двухпортовая память), чтобы уменьшить использование ресурсов FPGA.

  1. Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 1.
  2. Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 2.
  3. Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 3. Cortex M1.
  4. Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 4. MicroBlaze.

Перед тем как преступить к созданию данного проекта, рекомендую прочитать следующие статьи из данного цикла статей, т.к. в данной статье будут упущения о создания пустого проекта, выбора FPGA, добавления Zynq IP, генерации и создания SDK проекта.

1. Настраиваем IP Zynq, как на скриншоте ниже. Включаем M_AXI GP интерфейс.


2. Добавляем Block Memory Generator.

3. Настраиваем Block Memory Generator, как на скриншоте ниже.

4. Добавляем AXI BRAM Controller. Контроллер доступа к BRAM.

5. Настраиваем AXI BRAM Controller, как на скриншоте ниже.

6. Настраиваем адресное пространство для проекта.

7. Общая блок диаграмма проекта BRAM.

Исходный код проекта.

#include <stdio.h>
#include "xil_io.h"
#include "xparameters.h"
#include "platform.h"

int main() {
    int num;
    int rev;
    init_platform();

    xil_printf("The test is start\n\r");

    for (num = 0; num < 15; num++) {
        Xil_Out32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + num * 4, 0x10000000 + num);
    }

    for (num = 0; num < 15; num++) {
        rev = Xil_In32(XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num * 4);
        xil_printf("The data at %x is %x \n\r", XPAR_AXI_BRAM_CTRL_1_S_AXI_BASEADDR + num * 4, rev);
    }

    xil_printf("The test is end!\n\r");

    cleanup_platform();

    return 0;
}

8. Загружаем bitstream собранного проекта.

9. Результат работы нашей программы.