嵌入式驱动开发之dsp fpga通信接口---spi串行外围接口、emif sram接口

-----------------------------------------author:pkf

------------------------------------------------time:2015-3-17

-----------------------------------------------------qq:1327706646

(0)应用背景

(1)i2c 两根线

(2)spi 用作控制接口4根线

(2)emif 用作大数据传输接口16位数据带宽

(3)dma

(4)输入口

(0)

  在雷达信号处理、数字图像处理等领域中,信号处理的实时性至关重要。由于FPGA芯片在大数据量的底层算法处理上的优势及DSP芯片在复杂算法处理上的优势,DSP+FPGA的实时信号处理系统的应用越来越广泛。ADI公司的TigerSHARC系列DSP芯片浮点处理性能优越,故基于这类。DSP的DSP+FPGA处理系统正广泛应用于复杂的信号处理领域。同时在这类实时处理系统中,FPGA与DSP芯片之间数据的实时通信至关重要。比如

赛灵思Kintex-7 FPGA 系列芯片和ti的6678 或key stone 系列通信

 

DSP与FPGA采用EMIF接口通信,即将FPGA作为DSP的外部SRAM,只需设置EMIF控制的存储器为SRAM类型即可,DSP通过EMIF接口读写SRAM的时序如下: 参考datasheet《tms320dm642.pdf》 

 

嵌入式驱动开发之dsp fpga通信接口---spi串行外围接口、emif sram接口_第1张图片

嵌入式驱动开发之dsp fpga通信接口---spi串行外围接口、emif sram接口_第2张图片



可以根据以上时序图编写FPGA代码,以下仅供参考:

module DSP_FPGA(                                       
                                 input clk,                            
                                 input [2:0] addr,       //简单测试,没有用到所有地址            
                                 inout [15:0] data,     //16位数据宽度             
                                 input CE_2,//FPGA片选                 
                                 input AOE,                            
                                 input AWE                             
                              );                                     
                                                                      
                                                       
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;                          
                                                  

     

wire rd_en = ~CE_2 && ~AOE;

reg [15:0] data_reg;      
//always @(posedge clk) //DSP读操作,The sampling point of DSP reading is the risging edge of AWE!                               
always @(*)    //这里没有用时钟,用的latch
begin                                                
   if(rd_en)                                 
     begin                                           
        case(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:  ;                                 
        endcase                                   
     end                                                                                                
end                                              

      
      
reg AWE_tmp1;
reg AWE_tmp2;
always @(posedge clk)
begin
     AWE_tmp1 <= AWE;
     AWE_tmp2 <= AWE_tmp1;
end      
      
wire AWE_RISING = ~AWE_tmp2 && AWE_tmp1;//与clk同步  

     
always @(*)                                   
begin                                        
  if(AWE_RISING)      //这里也没有用时钟,用的是latch                       
     begin                                    
        case(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:  ;                          
        endcase                            
     end                                      
end                                         

assign data =  rd_en ? data_reg : 16'hzzzz;
      
endmodule


//////////////////////////////////////////////////////////
DSP(具体为DM642)端程序:寄存器设置参考 《EMIF Reference Guide- spru266b.pdf》即spru266


#define   FPGA_ADDR              0xA0000000  
//#define   EMIFA_GBLCTL         0x01800000
#define   EMIFA_CECTL2         0x01800010 

//#define   EMIFA_CESEC2         0x01800050  

void  delay(unsigned long time)
{
       unsigned long i;
       for(i = 0; i < 1000; i++)
       {
            for(; time >0 ; time--)
             {
             } 
        }
 }

unsigned short write_value = 0;
unsigned short read_value = 0; 
int main(void)
{
        unsigned short *ptr;


        *(unsigned volatile int *)EMIFA_CECTL2 = (unsigned int)0xFFFFFF13;//设置EMIF控制的存储器类型为                                                                                                                             //16位宽SRAM    

        ptr = (unsigned short *)(unsigned int)FPGA_ADDR;
        
        while(1)
        {
              *ptr = write_value;
               read_value =   *ptr;     //调试时通过观察write_value与read_value的值是否相等可以检验通信是否正常 


               delay(100000);
               write_value++;
         }
     
         return 0;
}    

(4)输入口

 师兄们   请教下8168和FPGA使用nand flash方式通信能够达到视频传输的速度要求吗
Brave        2015/3/13 10:44:05

接口是GPMC
ghos 2015/3/13 10:44:41

没编码压缩的肯定不行吧,可以考虑pcie
2015/3/13 10:46:54
Brave        2015/3/13 10:46:54

GPMC 一般就支持NOR或者nand    NOR肯定没问题的    nand的话有现成驱动  不用DSP和FPGA端都进行调试要轻松点
Brave        2015/3/13 10:47:53

存储会考虑PCIE  我们这儿不会用
2015/3/13 10:51:10
ghos 2015/3/13 10:51:10

关键是你要传输多大的视频,带宽要够才行
2015/3/13 10:51:57
Brave        2015/3/13 10:51:57

原始码流  
Brave        2015/3/13 10:52:17

打算用16bit nand方式
ghos 2015/3/13 10:52:38

你板子16bitnand带宽能做到多少?
Brave        2015/3/13 10:53:19

不知道啊 也还没看具体时序
2015/3/13 10:54:36
ghos 2015/3/13 10:54:36

估计一般不会有人这么设计吧,用pcie的比较多
Brave        2015/3/13 10:55:42

我先试试看吧   不行用Nor  不过调试起来麻烦点  
Brave        2015/3/13 10:56:19

我们确实要求用GPMC  原理上应该不会有问题
2015/3/13 11:00:27
ghos 2015/3/13 11:00:27

你得先确认带宽需求,要是理论值都达不到的话做了也是白做
2015/3/13 11:01:56
Brave        2015/3/13 11:01:56

怎么确定  我只知道会用一个3D摄像机   数据量应该不小.....
ghos 2015/3/13 11:02:24

看图像分辨率
ghos 2015/3/13 11:02:37

和要传输几路视频
Brave        2015/3/13 11:02:45

1080P60
ghos 2015/3/13 11:03:04

你是做硬件的还是做软件的?
Brave        2015/3/13 11:03:09

几路也没问.........项目说明书没有...
Brave        2015/3/13 11:03:13

软件
2015/3/13 11:04:34
Brave        2015/3/13 11:04:34

估计2-3路  不是视频会议
ghos 2015/3/13 11:04:35

你是做软件的,那硬件的设计你让硬件设计师去考虑吧,3d的可能需要同时传输两路  1920*1080*2*8*2 你可以初步估算一下
自由 2015/3/13 11:05:09

GHOST这个是广州的么?
ghos 2015/3/13 11:06:00

不是
自由 2015/3/13 11:06:11

我以为是亿航呢。
2015/3/13 11:09:07
Brave        2015/3/13 11:09:07

看起来挺大的...
2015/3/13 11:11:23
ghos 2015/3/13 11:11:23

这还只是一帧,p60你还得*60
Brave        2015/3/13 11:12:15

。。
ghos 2015/3/13 11:12:40

GPMC是你们做硬件的定的么?
Brave        2015/3/13 11:12:50


Brave        2015/3/13 11:13:05

老板定的...
2015/3/13 11:25:23
ghos 2015/3/13 11:25:23

让你们老板跟你发奖金,你可以让他避免一两个月的人工浪费和做样板的费用,省掉几万块呢
 
 板子都要出来了 ..  我想这两天把时序做出来...结果都要出来了  顺带可以问下   具体看他了
ghos 2015/3/13 11:29:03

如果做d1的倒还是可能的,1080p60应该不靠谱
2015/3/13 11:30:00
ghos 2015/3/13 11:30:00

你们是fpga预处理输入的视频,然后给到8168处理?
Brave        2015/3/13 11:31:19

是的  应该可以稍微提高速率
ghos 2015/3/13 11:31:49

没有上g的带宽,1080p60怎么玩
Brave        2015/3/13 11:31:56

我也不确定有没有预处理再过来
2015/3/13 11:32:09
ghos 2015/3/13 11:32:09

8168有vport的,为什么不直接用
Brave        2015/3/13 11:32:25

还没研究到那儿去..
2015/3/13 11:37:15
Brave        2015/3/13 11:37:15

之前不知道方向纠结于整个体系的实现机制  … 收获还不是很大  进度就这样下来了…
ghos 2015/3/13 11:38:53

这样的话,请个熟悉平台的人做兼职顾问吧,要是钻进死胡同,那可大大的不妙
2015/3/13 11:40:57
Brave        2015/3/13 11:40:57

我还是嵌入式菜鸟…
Brave        2015/3/13 11:40:59

预处理也要先到共享内存才执行吧
2015/3/13 11:42:13
Brave        2015/3/13 11:42:13

还是得自己多看  有点积累别人才能点通  …
ghos 2015/3/13 11:42:44

这样要看硬件设计了,fpga和8168之间做共享内存不是那么容易吧,一般还是得靠传输
Brave        2015/3/13 11:43:49

应该是先得到原始数据再压缩
2015/3/13 11:45:48
ghos 2015/3/13 11:45:48

感觉你没说到一块去,你知道你们fgpa在系统中的作用是什么吗
虎啸山 2015/3/13 11:45:55

emif传输?
Brave        2015/3/13 11:46:09

各种外设…
2015/3/13 11:46:52
Brave        2015/3/13 11:46:52

速度达到了不就自然当成DDR了吗  
虎啸山 2015/3/13 11:47:10

之前做过dm6467和fpga传输
Brave        2015/3/13 11:48:14

不是很清楚fpga  先把他当成一个外设看待
2015/3/13 12:00:34
TI专家-兼 2015/3/13 12:00:34

8168要用VPORT要不1080P60 会有问题的
TI专家-兼 2015/3/13 12:00:51

GPMC肯定不能用的
2015/3/13 12:29:20
流泪的佛 2015/3/13 12:29:20

还是pcie吧,哥正在研究~
2015/3/13 12:29:42
Brave        2015/3/13 12:29:42

嗯 周末再研究研究
TI专家-兼 2015/3/13 12:29:47

PCIE有延时
TI专家-兼 2015/3/13 12:29:52

VIP是必须的
TI专家-兼 2015/3/13 12:30:10

2个VIP,每个24bit RGB支持1080P
流泪的佛 2015/3/13 12:30:51

恩,vip的话软件开发也简单多了
流泪的佛 2015/3/13 12:31:07

Hdmi接口也可以吧
TI专家-兼 2015/3/13 12:31:28

HDMI就是进的VIP
2015/3/13 12:33:19
流泪的佛 2015/3/13 12:33:19

Vip是芯片直连,如果板子已经做好的话,也只能考虑像pcie,hdmi之类的接口吧
TI专家-兼 2015/3/13 12:33:45

1080P60 3Gbps,你算算2路怎么进吧
2015/3/13 12:35:19
流泪的佛 2015/3/13 12:35:19

这样的话Pcie速度还很危险……
Brave        2015/3/13 12:35:21

通常接口只能编码之后了
流泪的佛 2015/3/13 12:36:34

我们是传1080p30
流泪的佛 2015/3/13 12:36:51

所以pcie两路问题不是问题
2015/3/13 12:37:38
TI专家-兼 2015/3/13 12:37:38

PCIE什么时候算一帧传输完了,可以使用了,系统延时是个问题啊
TI专家-兼 2015/3/13 12:38:56

而且做双目要两幅同一时刻的图像
TI专家-兼 2015/3/13 12:39:17

PCIE会增大系统难度
2015/3/13 12:56:24
流泪的佛 2015/3/13 12:56:24

恩,难度好大,尤其fpga那头,搞起我了
流泪的佛 2015/3/13 12:56:30


2015/3/13 13:24:54
Brave        2015/3/13 13:24:54

ARM这边是不是随便给FPGA一个时序,那边就可以对应上...........
2015/3/13 14:06:40
扬帆起 2015/3/13 14:06:40

FPGA 搞时序是最容易的
2015/3/13 16:24:25
Brave        2015/3/13 16:24:25

看了gpmc_nand.c里面只是对硬件借点做了注册,而且没有时序信息,请问各位怎么可以找到软件节点呢...
2015/3/13 17:13:03
Brave        2015/3/13 17:13:03

搜索.name找到了...   弱智了一回..
 

 

实际测试发现写入与读出的值相同

http://blog.sina.com.cn/s/blog_500bd63c0101d3z8.html

http://zhidao.baidu.com/link?url=1v_S2rwD2CN56G3JUmZhkZUDSYROC0asGaTsw0AQSILHDN7VFF7EqjP_eoTS9L9HsPaPbP3YxikVpwNrA9kgwK

http://www.sdedu.cc/tx/hlwjs/1103.html dsp fpga 简介

http://www.eepw.com.cn/article/190225.htm kentex 7 fpga 简介

http://xilinx.eetop.cn/viewthread-325043

你可能感兴趣的:(嵌入式驱动开发之dsp fpga通信接口---spi串行外围接口、emif sram接口)