Я использую XILINX ZC702 FPGA с Vivado 2014.3 вместе с SDK (комплект для разработки программного обеспечения).пытается сделать непрерывный поток данных FIFO
Я хочу создать поток данных FIFO, который составляет не менее 20 т. Е. Под потоком и не выше 500, т.е. Для этой цели я использовал AXI4 Stream FIFO IP, чтобы заставить код работать, я должен использовать регистры, которые можно найти в таблице данных для потока axi fifo, вставленного ниже.
Если данные FIFO достигают 500, то он должен прекратить загрузку новых данных. Если данные FIFO достигают 20, тогда он должен заполнять новые данные, пока не достигнет 500. Этот процесс должен повторяться все время.
Я сделал тестовый процесс в комплекте для разработки программного обеспечения для fifo, чтобы увидеть результаты моделирования сигналов через аппаратное обеспечение. Я наблюдаю, что данные FIFO не являются непрерывными. Мне нужно иметь его в непрерывном режиме, он никогда не должен останавливаться, он должен быть похож на петлю.
Ниже представлен код С
#include <stdio.h>
#include <xil_types.h>
#include <xil_cache.h>
#include "platform.h"
#include "xil_io.h"
//#include "usb20_per.h"
int main()
{
#define SLCR_UNLOCK 0xF8000008
#define SLCR_UNLOCK_VAL 0xDF0D
#define SLCR_LOCK 0xF8000004
#define SLCR_LOCK_VAL 0x767B
#define XSLCR_FPGA_RST_CTRL 0xF8000240
uint32_t baseaddr_ber=0x43c00000;
uint32_t baseaddr_fifo=0x43c10000;
Xil_Out32(SLCR_UNLOCK, SLCR_UNLOCK_VAL); //
Xil_Out32(XSLCR_FPGA_RST_CTRL, 0x0000000F); //Reset FPGAx_OUT_RST
Xil_Out32(XSLCR_FPGA_RST_CTRL, 0x00000000); //Deassert the FPGAx_OUT_RST
Xil_Out32(SLCR_LOCK, SLCR_LOCK_VAL); //
Xil_ICacheEnable();
Xil_DCacheEnable();
print("---Entering main---\n\r");
init_platform();
// Xil_Out32 & Xil_In32
Xil_Out32(baseaddr_fifo+0x4, 0x0C0001FC); //IER //interrupt enable register
Xil_Out32(baseaddr_fifo+0x2C,0x00000002); //TDR //transmit data register
uint32_t word_cnt;
uint32_t idx;
uint32_t state;
uint32_t i,val;
#define ARRAY_LENGTH 16
uint32_t array_fifo_data[ARRAY_LENGTH] = { 0x0100, 0x0302, 0x0504, 0x0706, 0x0908, 0x0B0A, 0x0D0C, 0x0F0E, 0x0100, 0x0302, 0x0504, 0x0706, 0x0908, 0x0B0A, 0x0D0C, 0x0F0E }; //random sequence
state=0;
word_cnt=0;
idx=0;
while(1)
{
switch (state)
{
case 0:
val = Xil_In32(baseaddr_fifo + 0x0c);
if(val > 0x1A0) //check TDFV register value //transmit data fifo vacancy
{
state++;
}
else
{
val=0;
}
break;
case 1:
word_cnt=0;
for(i=0;i<16;i++)
{
Xil_Out32(baseaddr_fifo + 0x10, array_fifo_data[idx]); //Fill TXFIFO_DATA if TDFV falls below 20 and above 500
word_cnt++;
idx++;
if (idx>(ARRAY_LENGTH-1))
idx=0;
}
Xil_Out32(baseaddr_fifo+0x14,word_cnt*4); //TLR (transmit length register)
state=0;
break;
}
}
}
Ниже есть ссылка на таблицу из Акси Strem ФИФО IP. Страница # 7, trasnmit a packet и Page # 23, пространство регистров показывает адрес базового адреса и смещения регистров, которые я использовал в приведенном выше коде.
Я очень ценю вашу помощь.
Из кода, который я сделал, я вижу, что FIFO работает и передает последовательные случайные данные, которые я вводил в код, но процесс не является непрерывным, он останавливается после передачи данных, он должен повторять процесс и продолжать продолжая его, он никогда не должен останавливаться, как петля.
Kinly открыть ссылку ниже, чтобы увидеть результаты моделирования. Вы увидите, что функция fifo работает, она передает полную случайную заявку, и после этого она останавливается, я ожидаю многократно передавать случайную последовательность.
https://www.dropbox.com/sh/nydws0v5yjyphj3/AAAg_l7aEvUG3gEzhYedwgWra?dl=0
на какой линии/цикл код тратить свое время? – user3629249