SDK (소프트웨어 개발 키트)와 함께 Vivado 2014.3과 함께 XILINX ZC702 FPGA를 사용하고 있습니다.연속 FIFO 데이터 스트림을 만들려고합니다
FIFO 데이터 스트림을 생성하고 싶습니다.이 스트림은 20 미만, 즉 플로우 미만, 500 이하입니다. 즉 오버 플로우입니다. 나는이 목적을 위해 AXI4 Stream FIFO IP를 사용했다. 코드를 작동시키기 위해 아래에 붙여 넣은 axi 스트림 fifo에 대한 데이터 시트에서 찾을 수있는 레지스터를 사용해야한다.
FIFO 데이터가 500에 도달하면 새 데이터로드가 중지되어야합니다. FIFO 데이터가 20에 도달하면 500에 도달 할 때까지 새 데이터를 채워야합니다.이 프로세스는 항상 반복되어야합니다.
하드웨어를 통해 시뮬레이션 된 파형 결과를 보려면 fifo 용 소프트웨어 개발 키트에서 절차를 테스트했습니다. 내가 관찰 한 것은 FIFO 데이터가 연속적이지 않다는 것입니다. 나는 그것을 연속 모드로 가질 필요가있다. 결코 멈추지 않아야한다. 그것은 루프와 같아야한다.
다음은 AXI의 스트 렘 선입 선출법 IP의 데이터 시트에 대한 링크가, C 코드 아래
#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;
}
}
}
을 찾아주십시오. 페이지 # 7, 패킷을 전송하고 # 23 페이지의 레지스터 공간은 위의 코드에서 사용한 레지스터의 baseaddress와 오프셋 주소를 보여줍니다.
은 정말 당신의 도움을 주셔서 감사합니다.내가 작성한 코드에서 코드에 입력 한 순차적 인 임의의 데이터를 전송하고 전송하는 것을 볼 수 있지만 프로세스가 연속적이지 않고 데이터를 전송 한 후 중지되며 프로세스를 반복하고 계속 진행해야합니다 그것을 계속하면 결코 멈추지 않아야한다.
시뮬레이션 된 파형 결과를 보려면 아래 링크를 연다. 당신은 FIFO가 작동한다는 것을 알게 될 것입니다, 그것은 완전한 랜덤 requence를 전송하고 멈춘 후에 나는 랜덤 시퀀스를 반복적으로 전송할 것으로 예상됩니다. 어떤 라인에
https://www.dropbox.com/sh/nydws0v5yjyphj3/AAAg_l7aEvUG3gEzhYedwgWra?dl=0
은/루프는 '시간을 보내고 코드입니다? – user3629249