?? rio.c
字號(hào):
/********************************************************************************/
/* 本程序用來測(cè)試Xilinx Virtex II Pro系列FPGA MGT通信的性能 */
/* 本程序在c6416的環(huán)境下運(yùn)行通過,CCS版本2.20.03 */
/* 版權(quán)所有(c)2004 北京郵電大學(xué) 電信工程學(xué)院 馬健 045498 */
/********************************************************************************/
#include <std.h>
#include <csl_irq.h>
#include <stdio.h>
#include <csl_irq.h>
#include "reg1.h"
#define INTERVAL 0x7fffff /* FPGA兩次發(fā)送數(shù)據(jù)的時(shí)間間隔 */
#define TOTAL_TIME 0x10000000 /* */
#define TX_RAM 0x80000000 /* 發(fā)送RAM的首地址(位于DSP EMIFA的ce0空間) */
#define TX_Ctrl_Reg 0x80040000 /* FPGA的發(fā)送控制寄存器(位于EMIFA的ce0空間)*/
#define RX_RAM 0x60000000 /* 接收RAM的首地址(位于DSP EMIFB的ce0空間) */
#define RX_Ctrl_Reg 0x60040000 /* FPGA的接收控制寄存器(位于EMIFB的ce0空間)*/
#define BUF_SZ 0x100 /* 進(jìn)行數(shù)據(jù)校驗(yàn)的長(zhǎng)度 */
#define true 1
#define false 0
#define Inc 1
#define Dec 0
/********************************************************************************/
/* 子函數(shù),中斷函數(shù)聲明 */
/********************************************************************************/
void MGT_Reset(); /* MGT復(fù)位子函數(shù) */
void MGT_Start(); /* MGT開始自程序 */
void FillData(); /* 向緩沖區(qū)寫入校驗(yàn)圖樣數(shù)據(jù)子函數(shù) */
void CompareData(); /* 校驗(yàn)數(shù)據(jù)子函數(shù) */
void PrintResult(); /* 打印結(jié)果子函數(shù) */
void timer0_start(); /* 定時(shí)器開啟子函數(shù) */
interrupt void EX5_ISR(); /* 外部中斷5服務(wù)子程序 */
interrupt void Timer0_ISR(); /* 定時(shí)器中斷服務(wù)子程序 */
/********************************************************************************/
/* 全局變量定義 */
/********************************************************************************/
int Err_Flag = false, PingPong = Inc, Finish_Flag = true, Start_Flag = true;
int Total_times = 0, Err_times = 0, Errors = 0, int_times = 0;
short Pre_Data[256], Current_Data[256];
void main(void)
{
int i; /* main函數(shù)局部變量定義 */
IER |= 0x4023; /* 中斷使能寄存器配置,打開EXT_INT5以及定時(shí)器中斷 */
CSR |= 0x1; /* 打開全局中斷使能 */
T0CTL = 0x200;
T0PRD = 0x0FFF;
for (i = 0; i <= 0x10000000; i++){ /* 對(duì)FPGA的MGT通信進(jìn)行i次的校驗(yàn) */
Total_times++; /* 總的校驗(yàn)次數(shù),用來計(jì)算錯(cuò)誤概率 */
timer0_start(); /* 插入一段等待時(shí)間,使MGT更好同步 */
while(true){ /* 阻塞,等待MGT通信開始 */
if (Start_Flag == false)
break;
}
Start_Flag = true; /* 建立MGT通信開始阻塞標(biāo)志 */
MGT_Reset(); /* MGT復(fù)位 */
FillData(); /* 填充新的數(shù)據(jù) */
MGT_Start(); /* 開啟MGT的通信傳輸 */
while(true){ /* 阻塞,等待MGT通信以及數(shù)據(jù)校驗(yàn)完成 */
if (Finish_Flag == false)
break;
}
Finish_Flag = true; /* 建立MGT通信完成阻塞標(biāo)志 */
if( Err_Flag ){ /* 接收到的數(shù)據(jù)是否存在錯(cuò)誤 */
Err_Flag = false;
Err_times++; /* 記錄總的錯(cuò)誤次數(shù) */
PrintResult(); /* 打印錯(cuò)誤情況,以幫助判斷FPGA問題 */
}
}
}
/********************************************************************************/
/* FPGA的MGT 復(fù)位子函數(shù) */
/* 通過DSP的EMIFA/B分別控制FPGA MGT的收發(fā)狀態(tài) */
/********************************************************************************/
void MGT_Reset()
{
//reset MGT_tx
*(unsigned volatile int *)TX_Ctrl_Reg = 0;
*(unsigned volatile int *)TX_Ctrl_Reg = 1;
*(unsigned volatile int *)TX_Ctrl_Reg = 0;
//reset MGT_rx
*(unsigned volatile int *)RX_Ctrl_Reg = 0;
*(unsigned volatile int *)RX_Ctrl_Reg = 1;
*(unsigned volatile int *)RX_Ctrl_Reg = 0;
}
/********************************************************************************/
/* 填充發(fā)送數(shù)據(jù)子函數(shù) */
/* 通過DSP的EMIFA給FPGA的發(fā)送緩沖區(qū)交替寫入正序和倒序的數(shù)據(jù) */
/* 這樣可以更方便的鑒別是否MGT通信是否存在邊界問題 */
/********************************************************************************/
void FillData()
{
int i, j;
if ( PingPong ){ /* 給發(fā)送緩充區(qū)填入正序的數(shù)據(jù) */
i = 0;
for (j = 0; j < BUF_SZ; j++){
*((unsigned volatile short *)TX_RAM + j) = i++;
}
PingPong = Dec; /* 修改乒乓開關(guān),下次寫入倒序數(shù)據(jù) */
}
else{
i = 0xff; /* 給發(fā)送緩充區(qū)填入倒序的數(shù)據(jù) */
for (j = 0; j < BUF_SZ; j++){
*((unsigned volatile short *)TX_RAM + j) = i--;
}
PingPong = Inc; /* 修改乒乓開關(guān),下次寫入正序數(shù)據(jù) */
}
}
/********************************************************************************/
/* MGT發(fā)送子函數(shù) */
/* 通過FPGA的MGT控制寄存器開啟,MGT的發(fā)送 */
/********************************************************************************/
void MGT_Start()
{
//start MGT TX
*(unsigned volatile int *)TX_Ctrl_Reg = 0x0;
*(unsigned volatile int *)TX_Ctrl_Reg = 0x2;
*(unsigned volatile int *)TX_Ctrl_Reg = 0x0;
}
/********************************************************************************/
/* 進(jìn)行數(shù)據(jù)比較的子函數(shù) */
/* 可以得出發(fā)送錯(cuò)誤數(shù)據(jù)的位置以及錯(cuò)誤圖樣 */
/********************************************************************************/
void CompareData()
{
int j;
short Data_Receive;
Errors = 0; /* 子函數(shù)局部錯(cuò)誤個(gè)數(shù)變量清零 */
if (PingPong == Dec ){ /* 比較倒序數(shù)據(jù) */
for ( j = 0; j < BUF_SZ; j++){
Data_Receive = *((unsigned volatile short *)RX_RAM + j);
if ( Data_Receive != j ){ /* 發(fā)現(xiàn)錯(cuò)誤 */
Current_Data[Errors] = Data_Receive;
Pre_Data[Errors] = j; /* 記錄錯(cuò)誤的數(shù)據(jù),即發(fā)生錯(cuò)誤的位置 */
Err_Flag = true; /* 建立錯(cuò)誤標(biāo)志,后面打印錯(cuò)誤結(jié)果 */
Errors++; /* 記錄本次錯(cuò)誤個(gè)數(shù) */
}
}
}
else{ /* 比較正序數(shù)據(jù) */
for ( j = 0; j < BUF_SZ; j++){
Data_Receive = *((unsigned volatile short *)RX_RAM + j);
if ( Data_Receive != (0xff - j) ){
Current_Data[Errors] = Data_Receive;
Pre_Data[Errors] = 0xff - j;/* 發(fā)現(xiàn)錯(cuò)誤 */
Err_Flag = true; /* 建立錯(cuò)誤標(biāo)志,后面打印錯(cuò)誤結(jié)果 */
Errors++; /* 記錄本次錯(cuò)誤個(gè)數(shù) */
}
}
}
}
/********************************************************************************/
/* 外部中斷EXT_INT5的中斷服務(wù)子程序 */
/* 根據(jù)需要打印出需要的數(shù)據(jù),以判斷MGT通信的性能 */
/********************************************************************************/
void PrintResult()
{
int i, Errors_local;
printf("Error!! Total_times = %d Err_Times = %d \n", Total_times, Err_times);
Errors_local = Errors;
if ( Errors_local > 10 )
{
Errors_local = 10;
}
if ( PingPong == Dec )
{
printf("Increase: \n");
for( i = 0; i < Errors_local; i++)
{
printf("0x%x: 0x%x ---> 0x%x \n", Pre_Data[i]*2, Pre_Data[i], Current_Data[i]);
}
printf("\n");
}
else
{
printf("Decrease \n");
for( i = 0; i < Errors_local; i++)
{
printf("0x%x: 0x%x ---> 0x%x \n", (0xff-Pre_Data[i])*2, Pre_Data[i], Current_Data[i]);
}
printf("\n");
}
}
/********************************************************************************/
/* 定時(shí)器timer0的開啟子函數(shù) */
/********************************************************************************/
void timer0_start()
{
T0CTL=0x00000200;
T0CTL=0x000002c0;
}
/********************************************************************************/
/* 外部中斷EXT_INT5的中斷服務(wù)子程序 */
/* MGT傳輸已經(jīng)完成,可以開始進(jìn)行數(shù)據(jù)的比較校驗(yàn) */
/********************************************************************************/
interrupt void EX5_ISR()
{
Finish_Flag = 0; /* 清除MGT通信結(jié)束阻塞標(biāo)志 */
CompareData(); /* 比較數(shù)據(jù) */
}
/********************************************************************************/
/* 定時(shí)器中斷服務(wù)子程序 */
/********************************************************************************/
interrupt void Timer0_ISR()
{
Start_Flag = 0; /* 清除MGT通信開始阻塞標(biāo)志 */
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -