Сегодня пример посветим 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.
- Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 1.
- Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 2.
- Zynq-7000 SoC — Xilinx. Z-turn Lite. Bare metal. Часть 3. Cortex M1.
- 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. Результат работы нашей программы.