MyFPGA Forum

标题: DE2 上 SDRAM Multi-port 的問題 [打印本页]

作者: Terran    时间: 2009-11-7 21:09
标题: DE2 上 SDRAM Multi-port 的問題
因為剛開始學FPGA不久,在看DE2上的example code中有些問題想請教,

請問各位大大Sdram_control_4port中的訊號
1. WR1_ADDR
2. WR1_MAX_ADDR
3. WR1_LENGTH
4. WR1_LOAD

是代表是什麼意思?
作者: Steady_Chou    时间: 2009-11-7 21:44
1. WR1_ADDR 指的是 WR1 這個 Port 的起始位置(Starting address)。

2. WR1_MAX_ADDR 指的是 WR1 這個 Port 的結束位置(Ending address),每個address的資料寬度就是WR1 port的資料寬度16-bit。

3. WR1_LENGTH 是什麼呢? 每個Port內部都會有一個FIFO當做Buffer,當這個Buffer中資料到達一定的數量的時候,Sdram Multiport就會將Buffer中的資料寫進SDRAM,這個數量就是WR1_LENGTH。

4. WR1_LOAD 就是剛剛提到的FIFO中的Asynchronous Clear訊號,High的時候Clear。

111.JPG (10.79 KB, 下载次数: 1568)

111.JPG

作者: REN    时间: 2009-11-8 11:32
2# Steady_Chou
想延伸一下問題...
想請問一下Steady_Chou版主, 如果我需要把SDRAM給不同的裝置讀取
如 LTM CCD 或 Flash
那我需要怎麼樣的切割方式呢? 是否可以切成好幾個wr 和rd 只要將address都算好?
或是有其他限制,我在無雙板上有看到有clk 的限制 那是否 也要注意這方面的使用?
因為小弟對這方面也是門外漢,想在DE0實現這幾個裝置讀取 不知是否可行?
謝謝
作者: Steady_Chou    时间: 2009-11-9 11:57
首先在規劃SDRAM Multi-Port之前,第一個要考慮是我們目前所需要的資料頻寬(寫入加上讀取)是不是這顆記憶體頻寬(SDRAM)所能處理的,舉例來說假設SDRAM跑120MHz並且是16-bit,那它的理想頻寬就是120M * 16 = 1.92Gbps, 但是實際的頻寬通常要再乘上0.7 ( MultiPort Controller所消耗的加上SDRAM實際上頻寬) 大約為 1.3Gbps,所以只要全部輸出入的 “ 時脈頻率 * 資料寬度 “ 小於記憶體實際頻寬 (剛剛的1.3Gbps)就可以。

至於要怎麼切割呢,當然只要你所需要的Write & Read Port數量不超過實際的數量(DE系列multi-port為兩個Write及兩個Read ports)並且address別重疊到,除非你的應用剛好可以重疊,不然資料會亂掉。關於DE0是否可行?? 只要這些都有注意到,當然可以!! 別忘了DE0上面可是Cyclone III FPGA,理論上可以跑得比DE2快,只是LE少了些。

我記得半導體學院: 數位電視雜訊課程 裡面有一個作業是把Multi-Port改成多一個Read Port就是Write Port*2 & Read Port*3,有需要的話,可以問問誰有這個Source Code。
作者: REN    时间: 2009-11-9 12:50
4# Steady_Chou
我瞭解了 謝謝Steady_Chou版主
作者: Steady_Chou    时间: 2009-11-9 13:41
不會不會~ 有什麼問題盡量問
能幫忙解釋的 我一定幫到底
作者: Terran    时间: 2009-11-9 19:49
感謝,終於了解了...
但麻煩的是算了一下需要的頻寬,看起來SDRAM的頻寬不夠...>_<
作者: Steady_Chou    时间: 2009-11-9 21:16
如果你要儲存的資料是影像的話 是不是考慮將你的影像解析度降低一些,不然就是用DE2-70因為上面有兩顆SDRAM 頻寬是DE2的兩倍。
作者: Pocahontas    时间: 2009-11-10 10:05
Steady 大大解釋的真詳細, 崇拜萬分
作者: lengyuye020202    时间: 2009-11-30 23:24
想请问一下版主,DE2_70的Sdram_Control_4Port对SDRAM的读写是突发还是整页读写的???有点不明白的....
作者: Steady_Chou    时间: 2009-12-4 10:52
可以说是整页读写,至于一页是 透过 ADDR , MAX_ADDR做设定 :)
作者: lengyuye020202    时间: 2010-1-3 18:04
你好,请问一下,在DE2_70的TV历程还有一段看不明白的就是
......
assign        Tmp1        =        m4YCbCr[7:0]+mYCbCr_d[7:0];
assign        Tmp2        =        m4YCbCr[15:8]+mYCbCr_d[15:8];
assign        Tmp3        =        Tmp1[8:2]+m3YCbCr[7:1];
assign        Tmp4        =        Tmp2[8:2]+m3YCbCr[15:9];
assign        m5YCbCr        =        {Tmp4,Tmp3};
...这样处理实现怎样的功能呢?
作者: Steady_Chou    时间: 2010-1-3 18:21
个人感觉是在消除影像锯齿状, 不知道其它人认为呢?

我继续研究看看
作者: laoxizi    时间: 2010-4-1 16:44
本帖最后由 laoxizi 于 2010-4-1 17:18 编辑

Steady_Chou版主,在进行write 操作的时候,设置了开始地址和结束的地址,那么我写进FIFO的数据就是按照顺序的写到了SDRAM里面吗?这样的话,如果我想重新从起始地址开始写,要怎么操作呢?

Steady_Chou版主,能再讲讲读port部分吗?看了一下也没有很明白,先谢谢Steady_Chou版主了。
作者: Steady_Chou    时间: 2010-4-1 17:48
回复 14# laoxizi


要重新设定起始位置,好像只能先设定reset再改变起始位置,但是reset也会将其它讯号及缓存器清除  这会是一个问题,看起来原本的设计应该是不支持起始位置的动态改变。
作者: laoxizi    时间: 2010-4-1 19:22
Sdram_Control_4Port u6        (
  // HOST Side
  .REF_CLK(CLOCK_50),
  .RESET_N(1'b1),
  // FIFO Write Side 1
  .WR1_DATA({sCCD_G[9:5], sCCD_B[9:0]}),
  .WR1(sCCD_DVAL),
  .WR1_ADDR(0),
  .WR1_MAX_ADDR(320*256),
  .WR1_LENGTH(9'h100),
  .WR1_LOAD(!DLY_RST_0),
  .WR1_CLK(CCD_PIXCLK),
  // FIFO Write Side 2
  .WR2_DATA({sCCD_G[4:0], sCCD_R[9:0]}),
  .WR2(sCCD_DVAL),
  .WR2_ADDR(22'h100000),
  .WR2_MAX_ADDR(22'h100000+320*256),
  .WR2_LENGTH(9'h100),
  .WR2_LOAD(!DLY_RST_0),
  .WR2_CLK(CCD_PIXCLK),
  // FIFO Read Side 1
  .RD1_DATA(Read_DATA1),
  .RD1(Read),
  .RD1_ADDR(320*8),
  .RD1_MAX_ADDR(320*248),
  .RD1_LENGTH(9'h100),
  .RD1_LOAD(!DLY_RST_0),
  .RD1_CLK(CLK_18),
  // FIFO Read Side 2
  .RD2_DATA(Read_DATA2),
  .RD2(Read),
  .RD2_ADDR(22'h100000+320*8),
  .RD2_MAX_ADDR(22'h100000+320*248),
  .RD2_LENGTH(9'h100),
  .RD2_LOAD(!DLY_RST_0),
  .RD2_CLK(CLK_18),
  // SDRAM Side
  .SA(DRAM_ADDR),
  .BA({DRAM_BA_1,DRAM_BA_0}),
  .CS_N(DRAM_CS_N),
  .CKE(DRAM_CKE),
  .RAS_N(DRAM_RAS_N),
  .CAS_N(DRAM_CAS_N),
  .WE_N(DRAM_WE_N),
  .DQ(DRAM_DQ),
  .DQM({DRAM_UDQM,DRAM_LDQM}),
  .SDR_CLK(DRAM_CLK)
);

还要请教一下版主,为什么写的地址和读的地址不是对应的呢?这个例程的功能不就是把CCD的图像显示到VGA显示器上吗?那么应该从CCD写进去的地址开始读啊。为什么会这样写呢?
还有一个要请教版主的就是:
  .RD2_DATA(Read_DATA2),
  .RD2(Read),
  .RD2_ADDR(22'h100000+320*8),
  .RD2_MAX_ADDR(22'h100000+320*248),
  .RD2_LENGTH(9'h100),
  .RD2_LOAD(!DLY_RST_0),
  .RD2_CLK(CLK_18),
这里面的RD2_LENGTH是起到什么作用呢。是说明FIFO里面要存储多少数据吗?
作者: liyongjie    时间: 2010-4-2 09:28
是FIFO里面要存储多少数据,也就是FIFO支持的长度。
作者: youngsh    时间: 2010-4-11 16:58
大家都是用DE2的,能不能留个QQ
方便交流
我QQ 542588962
作者: w_m    时间: 2010-7-28 14:55
回复 4# Steady_Chou


    请问版主,我用的DE0的板子,想让NIOS来读取SDRAM里面的图像缓存数据进行处理,之前看过无双大大的博客,可是他是DE2的板子,DE0只有一个SDRAM,我想用2R+2W来共用SDRAM,可是SOPC里面的SDRAM_Controler与前面图像缓存的SDRAM_controler冲突,真不知道该如何解决,希望版主能指点一下啊
作者: Steady_Chou    时间: 2010-7-29 21:20
回复  Steady_Chou


    请问版主,我用的DE0的板子,想让NIOS来读取SDRAM里面的图像缓存数据进行处理, ...
w_m 发表于 2010-7-28 14:55


可是SOPC里面的SDRAM_Controler与前面图像缓存的SDRAM_controler冲突
==> 衝突的原因是 用了兩個SDRAM Controller ?
作者: w_m    时间: 2010-7-30 09:57
回复 20# Steady_Chou


    版主是什么意思?不能用两个SDRAM  controller吗?那该如何是好啊!!可以用DMA吗
作者: Steady_Chou    时间: 2010-7-30 10:32
是阿  用兩個SDRAM Controller 你的版子上要有兩顆SDRAM才行阿....

想問你一下  你的SOPC會用到SDRAM Controller的原因是甚麼  可不可以用SRAM or Flash替代??
作者: w_m    时间: 2010-7-30 15:33
回复 22# Steady_Chou


    我是DE0 的板子,没有SRAM.
    硬体语言写的控制摄像头采集数据在sdram里面缓存,送到VGA输出,然后我要在NIOS里面提取缓存的数据进行处理,最后存储,SOPC里面如果不用SDRAM的话,我不知道该拿什么来存储,或者缓存 数据了
作者: WPZAC    时间: 2010-7-30 16:13
回复 22# Steady_Chou
  请问,我用的是DE0的板子,只有一个SDRAM。我用CCD采集的数据放进SDRAM缓存后,又想让NIOS调取SDRAM里面缓存的数据进行处理,之后不得以又得放回SDRAM,最后存储到sd卡。

wire        [15:0]        Read_DATA1;
wire        [15:0]        Read_DATA2;
wire         [15:0]       Read_DATA3;     // add by oomusou for RGB16
Sdram_Control_4Port  u7   (        //  HOST Side                                               
          .REF_CLK(CLOCK_50),
          .RESET_N(1'b1),
          .CLK(sdram_ctrl_clk),

        //        FIFO Write Side 1
.WR1_DATA({sCCD_R[11:7], sCCD_G[11:6],  sCCD_B[11:7]}),
.WR1(sCCD_DVAL),
.WR1_ADDR(0),
.WR1_MAX_ADDR(800*480),
.WR1_LENGTH(9'h100),
.WR1_LOAD(!DLY_RST_0),
.WR1_CLK(CCD_PIXCLK),

//        FIFO Write Side 2
                                                       
.WR2_DATA(),         
.WR2(),
.WR2_ADDR(),
.WR2_MAX_ADDR(),
.WR2_LENGTH(),
.WR2_LOAD(!DLY_RST_0),
.WR2_CLK(~CCD_PIXCLK),
                           

//        FIFO Read Side 1
.RD1_DATA(Read_DATA3),
.RD1(Read),
.RD1_ADDR(0),
.RD1_MAX_ADDR(800*480),
.RD1_LENGTH(9'h100),
.RD1_LOAD(!DLY_RST_0),
.RD1_CLK(~VGA_CTRL_CLK),
                                                       
//        FIFO Read Side 2
.RD2_DATA(),
.RD2(),
.RD2_ADDR(),
.RD2_MAX_ADDR(),
.RD2_LENGTH(),
.RD2_LOAD(!DLY_RST_0),
.RD2_CLK(~VGA_CTRL_CLK),
                                                       
//        SDRAM Side
.SA(DRAM_ADDR),
.BA({DRAM_BA_1,DRAM_BA_0}),
.CS_N(DRAM_CS_N),
.CKE(DRAM_CKE),
.RAS_N(DRAM_RAS_N),
CAS_N(DRAM_CAS_N),
.WE_N(DRAM_WE_N),
.DQ(DRAM_DQ),
.DQM({DRAM_UDQM,DRAM_LDQM})
                                                );
// add by oomusou for RGB16
assign Read_DATA1 = {Read_DATA3[10:6], Read_DATA3[4:0], 5'h00};
assign Read_DATA2 = {Read_DATA3[5:5], 4'h0, Read_DATA3[15:11], 5'h00};
    参考了无双大大的博客,对2w和2r 进行了修改,这样可以省出空间。那么,一个用来缓存ccd采集的原始数据(w1和r1),另一个用来存储NIOS处理后的数据(w2和r2),这样的做法可以实现吗??
请教了,thank you!!!
作者: wh116wh    时间: 2010-8-18 08:55
那你用什么作为NIos II处理器的存储空间呢?
作者: hgy85714    时间: 2010-12-16 14:19
回复 4# Steady_Chou


    Steady_Chou版主有Write Port*2 & Read Port*3的SDRAM的Source Code吗?有的话发一份给我借鉴一下,感激不尽。邮箱:huguo.yang@163.com
作者: smmaxl    时间: 2011-4-19 10:22
想好好研究下。
作者: zxptju    时间: 2011-5-2 20:16
太感谢了,刚好用到
作者: lhqsky    时间: 2011-7-23 23:38
这个贴说的比较清楚
作者: zhanxin    时间: 2011-7-26 17:23
受益匪浅~
作者: motouhewo    时间: 2011-10-12 10:37
回复 16# laoxizi


    你的问题解决了吗?我也不明白,请教一下。
作者: motouhewo    时间: 2011-10-12 10:41
回复 6# Steady_Chou


    Sdram_Control_4Port u6        (
  // HOST Side
  .REF_CLK(CLOCK_50),
  .RESET_N(1'b1),
  // FIFO Write Side 1
  .WR1_DATA({sCCD_G[9:5], sCCD_B[9:0]}),
  .WR1(sCCD_DVAL),
  .WR1_ADDR(0),
  .WR1_MAX_ADDR(320*256),
  .WR1_LENGTH(9'h100),
  .WR1_LOAD(!DLY_RST_0),
  .WR1_CLK(CCD_PIXCLK),
  // FIFO Write Side 2
  .WR2_DATA({sCCD_G[4:0], sCCD_R[9:0]}),
  .WR2(sCCD_DVAL),
  .WR2_ADDR(22'h100000),
  .WR2_MAX_ADDR(22'h100000+320*256),
  .WR2_LENGTH(9'h100),
  .WR2_LOAD(!DLY_RST_0),
  .WR2_CLK(CCD_PIXCLK),
  // FIFO Read Side 1
  .RD1_DATA(Read_DATA1),
  .RD1(Read),
  .RD1_ADDR(320*8),
  .RD1_MAX_ADDR(320*248),
  .RD1_LENGTH(9'h100),
  .RD1_LOAD(!DLY_RST_0),
  .RD1_CLK(CLK_18),
  // FIFO Read Side 2
  .RD2_DATA(Read_DATA2),
  .RD2(Read),
  .RD2_ADDR(22'h100000+320*8),
  .RD2_MAX_ADDR(22'h100000+320*248),
  .RD2_LENGTH(9'h100),
  .RD2_LOAD(!DLY_RST_0),
  .RD2_CLK(CLK_18),
  // SDRAM Side
  .SA(DRAM_ADDR),
  .BA({DRAM_BA_1,DRAM_BA_0}),
  .CS_N(DRAM_CS_N),
  .CKE(DRAM_CKE),
  .RAS_N(DRAM_RAS_N),
  .CAS_N(DRAM_CAS_N),
  .WE_N(DRAM_WE_N),
  .DQ(DRAM_DQ),
  .DQM({DRAM_UDQM,DRAM_LDQM}),
  .SDR_CLK(DRAM_CLK)
);

还要请教一下版主,为什么写的地址和读的地址不是对应的呢?这个例程的功能不就是把CCD的图像显示到VGA显示器上吗?那么应该从CCD写进去的地址开始读啊。为什么会这样写呢?
还有一个要请教版主的就是:
  .RD2_DATA(Read_DATA2),
  .RD2(Read),
  .RD2_ADDR(22'h100000+320*8),
  .RD2_MAX_ADDR(22'h100000+320*248),
  .RD2_LENGTH(9'h100),
  .RD2_LOAD(!DLY_RST_0),
  .RD2_CLK(CLK_18),
这里面的RD2_LENGTH是起到什么作用呢。是说明FIFO里面要存储多少数据吗?
作者: jr_wong    时间: 2011-11-30 22:58
正在研究DE2_70_TV,看到sdram这个部分有很多都不懂,这个帖子讲得挺清楚的,获益匪浅啊!
作者: ye_song    时间: 2011-12-20 23:47
Sdram_Control_4Port的端口有两个read 两个write,是不是意味着可以有两个video模块分别操作sdram,把数据在两个数据空间里
作者: diyichangxue    时间: 2012-2-20 10:53
回复 10# lengyuye020202

版主,我发现把        rWR1_LENGTH                <=        128;
                rRD1_LENGTH                <=        128;
                rWR2_LENGTH                <=        128;
                rRD2_LENGTH                <=        128;
128改成640也行,没有影响,到底是怎么回事。我用PAL摄像头,改成640主要考虑的是一行为640像素
作者: leekama    时间: 2012-4-20 15:20
你好
想請問WR1_ADDR 是WR1的起始位置
WR1_MAX_ADDR是結束位子

那假如想要對sdram做指定位址的存取要怎寫??
就是從指定的ADDRESS取值
但在CONTRLLER裡  卻都沒有看到輸入位址的地方
謝謝
作者: boarbing    时间: 2012-7-30 17:40
添加端口需要注意的问题是什么呢?




欢迎光临 MyFPGA Forum (http://www.myfpga.org/discuz/) Powered by Discuz! X3