DSP与FPGA间简单通信DSP与FPGA采用EMIF接口通信,即将FPGA作为DSP的外部SRAM,只需设置EMIF控制的存储器为SRAM类型即可,DSP通过EMIF接口读写SRAM的时序如下:参考datasheet《tms320dm642.pdf》可以根据以上时序图编写FPGA代码,以下仅供参考:moduleDSP_FPGA(inputclk,input[2:0]addr,//简单测试,没有用到所有地址inout[15:0]data,//16位数据宽度inputCE_2,//FPGA片选inputAOE,inputAWE);reg[15:0]DSP_FPGA_REG0;reg[15:0]DSP_FPGA_REG1;reg[15:0]DSP_FPGA_REG2;reg[15:0]DSP_FPGA_REG3;reg[15:0]DSP_FPGA_REG4;reg[15:0]DSP_FPGA_REG5;reg[15:0]DSP_FPGA_REG6;reg[15:0]DSP_FPGA_REG7;wirerd_en=~CE_2&&~AOE;reg[15:0]data_reg;//always@(posedgeclk)//DSP读操作,ThesamplingpointofDSPreadingistherisgingedgeofAWE!always@(*)//这里没有用时钟,用的latchbeginif(rd_en)begincase(addr[2:0])3'd0:data_reg=DSP_FPGA_REG0;3'd1:data_reg=DSP_FPGA_REG1;3'd2:data_reg=DSP_FPGA_REG2;3'd3:data_reg=DSP_FPGA_REG3;3'd4:data_reg=DSP_FPGA_REG4;3'd5:data_reg=DSP_FPGA_REG5;3'd6:data_reg=DSP_FPGA_REG6;3'd7:data_reg=DSP_FPGA_REG7;default:;endcaseendendregAWE_tmp1;regAWE_tmp2;always@(posedgeclk)beginAWE_tmp1=AWE;AWE_tmp2=AWE_tmp1;endwireAWE_RISING=~AWE_tmp2&&AWE_tmp1;//与clk同步always@(*)beginif(AWE_RISING)//这里也没有用时钟,用的是latchbegincase(addr[2:0])3'd0:DSP_FPGA_REG0=data;3'd1:DSP_FPGA_REG1=data;3'd2:DSP_FPGA_REG2=data;3'd3:DSP_FPGA_REG3=data;3'd4:DSP_FPGA_REG4=data;3'd5:DSP_FPGA_REG5=data;3'd6:DSP_FPGA_REG6=data;3'd7:DSP_FPGA_REG7=data;default:;endcaseendendassigndata=rd_en?data_reg:16'hzzzz;endmodule//////////////////////////////////////////////////////////DSP(具体为DM642)端程序:寄存器设置参考《EMIFReferenceGuide-spru266b.pdf》即spru266#defineFPGA_ADDR0xA0000000//#defineEMIFA_GBLCTL0x01800000#defineEMIFA_CECTL20x01800010//#defineEMIFA_CESEC20x01800050voiddelay(unsignedlongtime){unsignedlongi;for(i=0;i1000;i++){for(;time0;time--){}}}unsignedshortwrite_value=0;unsignedshortread_value=0;intmain(void){unsignedshort*ptr;*(unsignedvolatileint*)EMIFA_CECTL2=(unsignedint)0xFFFFFF13;//设置EMIF控制的存储器类型为//16位宽SRAMptr=(unsignedshort*)(unsignedint)FPGA_ADDR;while(1){*ptr=write_value;read_value=*ptr;//调试时通过观察write_value与read_value的值是否相等可以检验通信是否正常delay(100000);write_value++;}return0;}实际测试发现写入与读出的值相同其他方法:在FPGA实现一个FIFO,FPGA采集到数据之后先放入FIFO中;然后用DSP来读取FIFO内容(如果EMIF不支持同步接口的话,需要将同步FIFO接口通过逻辑转换为异步FIFO接口);如果需要带宽更高,将FIFO的halffull,notempty标记送入到DSP的INT输入,来触发DMA传输。