工具/软件:Code Composer Studio
我们的设计是使用 EPI 总线在 FPGA 中读取或写入128字节 SRAM。 MCU 配置为通用模式、具有16位数据大小和12位地址大小。 总线操作为1个 EPI 时钟用于写周期、2个 EPI 时钟用于读周期。
将数据写入 FPGA 中的 SRAM 是正确的。 我们在读取方面存在问题。 我们希望在第二个时钟内获得数据、但它使用旧数据在第一个时钟内返回数据。
在我们的测试中、我们写入 SRAM{10、11、12、13}、但读出{13、10、11、12}、这意味着[addr1]=旧数据、[addr2]=data1。 我们监控了这些信号、并验证是否遵循以下时序模式。
EPI 测试代码。
空 initEPIPins (空)
{
//MCU EPI 数据总线(仅将 EPI_D0至 EPI_D7连接到 FPGA):
MAP_GPIOPinConfigure (GPIO_PK0_EPI0S0);
MAP_GPIOPinTypeEPI (GPIO_PORTK_base、GPIO_PIN_0); //D0
MAP_GPIOPinConfigure (GPIO_PK1_EPI0S1);
MAP_GPIOPinTypeEPI (GPIO_PORTK_base、GPIO_PIN_1); //D1
MAP_GPIOPinConfigure (GPIO_PK2_EPI0S2);
MAP_GPIOPinTypeEPI (GPIO_PORTK_base、GPIO_PIN_2); //D2
MAP_GPIOPinConfigure (GPIO_PK3_EPI0S3);
MAP_GPIOPinTypeEPI (GPIO_PORTK_base、GPIO_PIN_3); //D3
MAP_GPIOPinConfigure (GPIO_PC7_EPI0S4);
MAP_GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_7); //D4
MAP_GPIOPinConfigure (GPIO_PC6_EPI0S5);
MAP_GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_6); //D5
MAP_GPIOPinConfigure (GPIO_PC5_EPI0S6);
MAP_GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_5); //D6
MAP_GPIOPinConfigure (GPIO_PC4_EPI0S7);
MAP_GPIOPinTypeEPI (GPIO_PORTC_BASE、GPIO_PIN_4); //D7
MAP_GPIOPinConfigure (GPIO_PA6_EPI0S8);
MAP_GPIOPinTypeEPI (GPIO_Porta_base、GPIO_PIN_6); //D8
MAP_GPIOPinConfigure (GPIO_PA7_EPI0S9);
MAP_GPIOPinTypeEPI (GPIO_Porta_base、GPIO_PIN_7); //D9
MAP_GPIOPinConfigure (GPIO_PG1_EPI0S10);
MAP_GPIOPinTypeEPI (GPIO_PORTG_BASE、GPIO_PIN_1); //D10
MAP_GPIOPinConfigure (GPIO_PG0_EPI0S11);
MAP_GPIOPinTypeEPI (GPIO_PORTG_BASE、GPIO_PIN_0); //D11
MAP_GPIOPinConfigure (GPIO_PM3_EPI0S12);
MAP_GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_3); //D12
MAP_GPIOPinConfigure (GPIO_PM2_EPI0S13);
MAP_GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_2); //D13
MAP_GPIOPinConfigure (GPIO_PM1_EPI0S14);
MAP_GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_1); //D14
MAP_GPIOPinConfigure (GPIO_PM0_EPI0S15);
MAP_GPIOPinTypeEPI (GPIO_PORTM_BASE、GPIO_PIN_0); //D15
// MCU EPI 地址总线(只有 EPI_A0至 EPI_A6连接到 FPGA)
MAP_GPIOPinConfigure (GPIO_PL0_EPI0S16);
MAP_GPIOPinTypeEPI (GPIO_PORTL_base、GPIO_PIN_0); //A0
MAP_GPIOPinConfigure (GPIO_PL1_EPI0S17);
MAP_GPIOPinTypeEPI (GPIO_PORTL_base、GPIO_PIN_1); //A1
MAP_GPIOPinConfigure (GPIO_PL2_EPI0S18);
MAP_GPIOPinTypeEPI (GPIO_PORTL_base、GPIO_PIN_2); //A2
MAP_GPIOPinConfigure (GPIO_PL3_EPI0S19);
MAP_GPIOPinTypeEPI (GPIO_PORTL_base、GPIO_PIN_3); //A3
MAP_GPIOPinConfigure (GPIO_PQ0_EPI0S20);
MAP_GPIOPinTypeEPI (GPIO_PORTQ_BASE、GPIO_PIN_0); //A4
MAP_GPIOPinConfigure (GPIO_PQ1_EPI0S21);
MAP_GPIOPinTypeEPI (GPIO_PORTQ_BASE、GPIO_PIN_1); //A5
MAP_GPIOPinConfigure (GPIO_PQ2_EPI0S22);
MAP_GPIOPinTypeEPI (GPIO_PORTQ_BASE、GPIO_PIN_2); //A6
MAP_GPIOPinConfigure (GPIO_PQ3_EPI0S23);
MAP_GPIOPinTypeEPI (GPIO_PORTQ_BASE、GPIO_PIN_3); /A7
MAP_GPIOPinConfigure (GPIO_PK7_EPI0S24);
MAP_GPIOPinTypeEPI (GPIO_PORTK_base、GPIO_PIN_7); //A8
MAP_GPIOPinConfigure (GPIO_PK6_EPI0S25);
MAP_GPIOPinTypeEPI (GPIO_PORTK_base、GPIO_PIN_6); /A9
MAP_GPIOPinConfigure (GPIO_PL4_EPI0S26);
MAP_GPIOPinTypeEPI (GPIO_PORTL_base、GPIO_PIN_4); //A10
MAP_GPIOPinConfigure (GPIO_PB2_EPI0S27);
MAP_GPIOPinTypeEPI (GPIO_PORTB_BASE、GPIO_PIN_2); /A11
// MCU EPI 控制信号(输出)
MAP_GPIOPinConfigure (GPIO_PB3_EPI0S28);
MAP_GPIOPinTypeEPI (GPIO_PORTB_BASE、GPIO_PIN_3); //WR
MAP_GPIOPinConfigure (GPIO_PP2_EPI0S29);
MAP_GPIOPinTypeEPI (GPIO_PORTP_BASE、GPIO_PIN_2); //RD
MAP_GPIOPinConfigure (GPIO_PP3_EPI0S30);
MAP_GPIOPinTypeEPI (GPIO_PORTP_BASE、GPIO_PIN_3); //frame
MAP_GPIOPinConfigure (GPIO_PK5_EPI0S31);
MAP_GPIOPinTypeEPI (GPIO_PORTK_base、GPIO_PIN_5); //CLK
}
void Initialize()
{
//启用 EPI0
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_EPI0);
//等待它准备就绪
while (!map_SysCtlPeripheralReady (SYSCTL_Periph_EPI0)){}
initEPIPins();
//配置 EPI 时钟:1M Hz
MAP_EPIDividerSet (EPI0_BASE、118);//系统时钟120M、EPI:1M
MAP_EPImodeSet (EPI0_BASE、EPI_MODE_General);
MAP_EPIConfigGPModeSet (EPI0_BASE、EPI_GPMODE_CLKPIN | EPI_GPMODE_CLKGATE | EPI_GPMODE_ASIZE_12 | EPI_GPMODE_DSIZE_16、0、0);
MAP_EPIAddressMapSet (EPI0_BASE、 EPI_ADDR_PER_SIZE _256B | EPI_ADDR_PER_BASE_C);
}
#define EPI_BUF_SIZE 4
静态 int16_t g_TxBuf[EP_BUF_SIZE];
静态 int16_t g_RxBuf[EP_BUF_SIZE];
uint32_t loop = 0;
void main (void)
{
initialize();
对于(int i = 0;i < EPI_BUF_SIZE;I ++)
{
G_TxBuf[i]= i + 10;
G_RxBuf[i]= 0;
}
while (1)
{
LOOP ++;
如果(LOOP == 100)
{
对于(int i = 0;i < EPI_BUF_SIZE;I ++)
EPIfpga[i]= g_TxBuf[i];
}
if (loop =10000)
{
对于(int i = 0;i < EPI_BUF_SIZE;I ++)
{
G_RxBuf[i]= EPIfpga[i];
}
}
}
}
谢谢!