Xess SDRAM conctrller

这几天做工程用到了Xess 的SDRAM控制器,发现真的非常优秀。

上传两篇中文翻译应用笔记:

--------------------------

首先声明一下代码和应用笔记的作者的权利:

AUTHOR


    Dave Vanden Bout, X Engineering Software Systems Corp.


    Send bug reports to bugs@xess.com.


COPYRIGHT AND LICENSE


    Copyright 2005 by X Engineering Software Systems Corporation.


    These applications can be freely distributed and modified as long as you
    do not remove the attributions to the author or his employer.

    You can find application notes about the dualport module at
    http://www.xess.com/ho03000.html.

------------------------------

然后在声明一下翻译作品的作者权利:


-------------------------------

an-071205-xsasdramcntl应用笔记翻译稿

译者:郑立强

联系E-mail : zedis@sina.com

QQ 1599882166

日期:2014年3月21日

-----------------------------------------------------------------------------------------

XESS  公司  SDRAM控制器应用笔记

概述

 

该应用笔记描述了如何在非流水线和流水线模式下使用XSA板上的SDRAM控制器。

 

SDRAM控制器特性

XSA板SDRAM控制器核可以在主机侧接受简单的读写请求并在SDRAM侧生成需要的时序波形。在流水线使能后,SDRAM一行内的读和写操作可以在每一个时钟周期内调度。控制器也可以管理必须的数据保持的刷新操作,也会启动SDRAM自刷新模式,保证数据有效,即使是控制器停止操作时候。

 

SDRAM控制器接口

通用参数

几个通用参数影响SDRAM控制器的使用:

FREQ : 该参数设置输入系统主时钟

CLK_DIV : 该参数设置对于主时钟的分频,分频后的时钟用于SDRAM控制和clk1x输出。阶梯式的频率用于决定时序控制器操作的时钟的宽度,同时阶梯式频率必须在25MHz或以上以保证用DLLs 和SDRAM同步操作产生阶梯式时钟。

对于低于25MHz的频率,控制不能用DLL代替调整clocking,控制器和外部SDRAM会在相反的边沿触发。这种情况下,时钟不需要分频,保持与主时钟频率相同。有效的CLK_DIV值可以是1.0,1.5,2.0,2.5,3.0,4.0,5.0,8.0,16.0.

PIPE_EN: 该参数使能流水线操作。

MULTIPLE_ACTIVE_ROWS : 设置这个布尔行的参数为true使能用于跟踪SDRAM每一个块上活动行的电路。设置为false禁止该电路,只有当前操作的块上的活动行是被记录的。

MAX_NOP: 该参数设置在SDRAM控制器代替了外部进入自刷新模式的SDRAM的,没有读写操作的连续的时钟周期数目。

DATA_WIDTH:该参数设置主机和SDRAM的数据总线宽度。

NROWS,NCOLS: 这个参数设置外部SDRAM的每一个块的数据的行的数目和每一个行上的列的数目。一行上的每一个列包含有一个由DATA_WIDTH指定的位宽的单字的数据。这些参数的值对于XSA板显示如下:

 

HADDR_WIDTH:该参数设置主机一侧的地址总线宽度。

 

 

I/O Port

 

核心的接口如表1所示,I/O信号的功能如下所示:

clk: 主时钟的输入,从XSA板上的晶体接入到FPGA内部,成为全局时钟。

sclk: 这个输出是从主时钟产生,驱动外部SDRAM的时钟输入端。

sclkfb:该输入是SDRAM时钟信号的带有延时的拷贝,...........

bufclk:是主时钟的一个全局缓冲版本。它是可用的,即使CLK1X没有锁定到主时钟。

rst : 高有效,对于SDRAM控制器内部逻辑老说是异步复位,复位同时引起控制器初始化SDRAM。

rd : 高有效,从SDRAM中读出一个单字。在时钟上升沿采样,直到由opBegun信号指示的读操作开始前必须保持为高。读控制必须被置低在done信号置高后下一个时钟沿到来或者其他的读操作就要开始之前。

wr: 高有效,指示从SDRAM中写入一个单字数据。在时钟上升沿采样,直到由opBegun信号指示的读操作开始前必须保持为高。写控制必须置低在done信号拉高之后的下一个边沿到来或者其他的写操作即将开始之前。

opBegun: 同步输出信号置高来指示一个读或者写操作。

earlyOpBegun:同步输出信号,在立即处理opBegun信号动作的时钟周期内置高。

rdPending : 同步输出,如果有任何的读操作在流水线期间没有从SDRAM中获取数据,置高。

done  :  同步输出,用于指示当前的读/写的完成。维持一个单时钟中期的高电平。

rdDone: 同步输出:指示流水线读操作完成,保持一个单时钟的高电平。

hAddr : SDRAM读或者写操作字地址,通过此端口送入总线。地址值必须保持稳定知道opBegun信号置高。hAddr中的两个最显著的位,是SDRAM的bank地址位。 接下来的log2(NROWS)个位是块的行地址,最不显著的log2(NCOLS)位是行中的列地址。

hDin:写入SDRAM的数据通过此端口送入。数据值必须在opBegun信号置高之前保持稳定。

hDout: SDRAM数据从此总线读出,数据必须在done或者rdDone信号置高后的上升沿时钟被主机侧逻辑锁存。

cke  SDRAM 时钟使能

cs_n   SDRAM 片选

ras_n

cas_n

we_n

ba

sAddr

sData

dqmh

dqml

status  SDRAM控制器当前的状态,由四位总线组成。用于调试。

 

使用 sdram控制器

 

非流水线读操作

   非流水线操作的时序波形如表2所示,该实例演示了对于SDRAM中当前的活动块和行的读操作

时序动作:

 C1 SDRAM地址线被占用,同时读控制信号拉高。如果此时sdram控制器可以开始读操作,那么earlyOpBegun信号置高。此后地址线和读控制线必须保持稳定知道下一个上升边沿到来。

C2  earlyOpBegun信号置低,opBegun信号置高。列地址输出到信号引脚上,SDRAM控制信号设置为初始读操作。

C3  在时钟上升沿,在付好的列地址行SDRAM产生一个读

C4  SDRAM等待数据到来

C5  在此周期内的某个时刻,SDRAM的数据到来,需要确定此周期内数据稳定。

C6 在时钟上升沿,数据锁存到一个寄存器中。done信号置高来通知主机一侧的逻辑此时数据已经在hDout上有效。

读控制必须在下一个上升时钟沿或者其他的读操作开始前拉低。

C7 done信号再次置低,但是hDOut上的数据持续稳定直到下一个读操作完成。

 

 

在动作之前的时序,是假设为读操作已经开始同时读控制信号有效。这里有几个情况,SDRAM会延时开始:当一行在被刷新时候:此时,SDRAM控制器完成行的刷新操作。然后,SDRAM的全部块被预充电,同时给定的地址和块被激活。接着读操作才会按照上述的描述开始。

当给定的地址不在SDRAM当前的活动块或者行里时:此时,控制权预充电SDRAM所有块,同时包含有给定地址的块和行有效,接着读操作才会按照上述的描述开始。

 

当读操作延时启动时候,earlyOpBegun和opBegun信号保持为低直到读操作切实启动。

 

 

非线性写操作:

非线性写操作的时序波形如表3所示,该实例假设了当前活动的块和行的写操作过程,动作时序如下:

C1  SDRAM地址和数据被存储,写控制信号拉高。如果SDRAM控制权可以被写,那么earlyOpBegun信号置高,此时,地址线,数据线和控制线必须保持稳定直到下一个earlyOpBegun信号置高后的下一个上升沿。

C2  earlyOpBegun信号置低同时opBegun信号置高。数据和列地址输出到SDRAM的引脚上,此时SDRAM的控制信号设置为启动写操作。在SDRAM有效的完成写操作后,done信号置高。

C3  在时钟上升沿 SDRAM锁存了地址和数据并启动写入。SDRAM数据总线的输出驱动被禁止。

C4和5 SDRAM继续在给定的地址上进行内部的写操作。

 

在动作之前的时序,是假设为写操作已经开始同时写控制信号有效。这里有几个情况,SDRAM会延时开始:

当一行在被刷新时候:此时,SDRAM控制器完成行的刷新操作。然后,SDRAM的全部块被预充电,同时给定的地址和块被激活。接着写操作才会按照上述的描述开始。

当给定的地址不在SDRAM当前的活动块或者行里时:此时,控制器预充电SDRAM所有块,同时包含有给定地址的块和行有效,接着写操作才会按照上述的描述开始。

当一个读操作已经开始:此时,SDRAM控制器已经在进程中完成读操作,接着写操作随着任何预充电和所需的激活的步骤开始启动。

 

流水线读操作

三级流水读操作的时序波形如表4所示,在rd信号保持为高时,新的读操作进入流水线,当前一个读操作开始后,提供一个新的地址。该实例假设所有的三个读操作SDRAM的活动块和行的存储器位置。如果在SDRAM当前活动的块和行出现对于另一个块和行的读操作,SDRAM控制器将会在升起earlyOpBegun和opBegun信号之前,完成对于当前进行中的读然后激活新的块和行。

 

流水线写操作

三级流水读操作的时序波形如表5所示,在rd信号保持为高时,新的写操作进入流水线,当前一个写操作开始后,提供一个新的地址。该实例假设所有的三个读操作SDRAM的活动块和行的存储器位置。如果在SDRAM当前活动的块和行出现对于另一个块和行的写操作,SDRAM控制器将会在升起earlyOpBegun和opBegun信号之前,完成对于当前进行中的写然后激活新的块和行。

 

SDRAM控制器应用

 

一个简单的存储器测试应用用于演示SDRAM控制器核的使用,存储器测试以下的功能:

 

●用一个已知的种子,发生一个随机序列

●通过存储器地址写入该随机数

●重新生成随机数

●读回存储器的内容,与RNG生成的随机数做比较,任何的不匹配都会产生错误读或者写指示

 

该源程序文件描述的应用:

common.vhd    一些通用的功能和定义

memtest.vhd   存储器测试状态机

randgen.vhd   RNG随机数产生器

sdramcntl.vhd   描述了SDRAM核心状态机

 

xsasdrancntl.vhd  创建了一个用于XSA板的SDRAM控制器的包装

 

test_board_core.vhd 该文件结合了通用的存储器测试和SDRAM控制器核心,已完成全部的测试。

 

test_board.vhd 该文件实例化一个test_board_core模块用于对XSA板上的SDRAM测试

 

test_board.ucf: 该文件包含引脚分配映射

 

test_board.npl: 该文件告知Xilinx WebPACK 工具怎么编译组合源文件。

 

一旦存储器测试应用编译并下载到了XSA板,你可以看到LED显示2-3-0(如果存储器测试检测到错误,会显示2-3-E)

 

 

 

 

 ——————————————————————

an-071205-dualport应用笔记翻译稿

译者:郑立强

联系E-mail : zedis@sina.com

QQ 1599882166

日期:2014年3月21日

-----------------------------------------------------------------------------------------

 

SDRAM 双口控制器

 

概述

 

此应用笔记描述了在XESS SDRAM控制器的主机侧添加双口读写模块。

 

双端口特性

 

双端口模块连接到SDRAM的主机侧,将SDRAM控制器分为两个相同的主机侧端口。每一个端口的操作都和原有的主机侧端口一致,所以在任何所需要的应用中不需要做修改。每一个应用使用一组端口读写操作存储器和发生才其他端口上的操作是独立开的。全部的SDRAM的带宽可以在分配在两个端口之中,来配合附加的应用数据速率。双端口模块可以实现三个或以上的独立端口的级联。

 

双端口接口

通用参数

 

几个通用参数影响到双端口的操作:

 

PIPE_EN 当SDRAM使用了流水线模式时,该参数需要设置为 true

PORT_TIME_SLOTS:该参数通过在每个端口的间隔内分配时间插值,在两个端口之间分配SDRAM的带宽。

DATA_WIDTH:该参数需要被设置为与主机侧的SDRAM控制器的数据总线宽度一致。

HADDR_WIDTH: 该参数需要被设置为与主机侧地址总线宽度一致。

 

I/O 端口

XSA板的双端口模块的接口如表1所示,XSB板如表2所示。I/O信号的功能如下:

Clk: 主时钟输入。双端口被调用后应该和SDRAM控制器的时钟频率设置为一致。

 

SDRAM控制器的主机侧的信号被复制为两个独立的端口。与主机侧的接口的功能和时序对应如下。

 

 

双端口的应用

 

一个简单的内存测试程序用于演示双端口模块的使用。存储器测试由两个相同的测试模块组成,一个测试低半个存储器,另一个测试高半个存储器。每一个存储器测试模块使用双端口上的一组端口存取对应的存储器的部分。(模块测试低半个存储器通过Port0,测试高半个存储器通过Port1)每一个测试做如下工作:

●在RNG 内,通过一个已知的种子产生一组随机数。

●通过存储器的地址范围将此随机数写入

●再次在RNG内,用此种子产生随机数

●从存储器中读回内容,并和由RNG产生的随机数作比较,读写过程中的任何的不匹配都会产生错误指示。

 

该源程序文件描述的应用:

common.vhd    一些通用的功能和定义

memtest.vhd   存储器测试状态机

randgen.vhd   RNG随机数产生器

sdramcntl.vhd   描述了SDRAM核心状态机

 

xsasdrancntl.vhd  创建了一个用于XSA板的SDRAM控制器的包装

 

test_board_core.vhd 该文件结合了两个存储器测试,双端口模块和SDRAM控制器核心,来完成的测试。

 

test_board.vhd 该文件实例化一个test_board_core模块,对于具体的板创建一个双端口的测试。

 

test_board.ucf: 该文件包含引脚分配映射

 

test_board.npl: 该文件告知Xilinx WebPACK 工具怎么编译组合源文件。

 

一旦存储器测试应用编译并下载到了XSA板内,你可以看到在LED显示出的SDRAM的上半个和下半个的测试状态。LED数码管排置如下:

LED数码管的动作意义如下:

 

存储器测试将会一直循环运行直到XSA板上的SW2按下。你可以看到S4-S5 LED比S1-S2LED更快速的闪烁。因为Port1比Port0 分配了更多的时间间隙,上半个存储器可以在更少的时间内测试所以对应的LED会比下半个对应的闪烁的更快。

       对于XSB板的双端口存储器测试不提供那么多可视的反馈。一旦测试应用被编译下载到XSB板上,你可以看到LED在“OO”(测试无误)和“EE”(测试有误)之间滚动。

 

向端口分配SDRAM带宽

 

PORT_TIME_SLOTS通用参数用于在双端口模块两组端口之间分配带宽。PORT_TIME_SLOTS是一组十六位的标准逻辑,其中每一位在SDRAM发生一个读写操作时候响应一个时间隙,设置一个位为0,代表这个时间隙指向port0,设置为1指向port1.例如,通用参数 PORT_TIME_SLOTS => “1111000011110000” 指定了每个端口上有8个时间隙,在双端口模块切换控制到其他端口上之前,每一个端口获取4个SDRAM上面临近的操作过程。所以,每一组端口分配到SDRAM上的半个带宽。

PORT_TIME_SLOTS参数只会在双端口模块的两组端口同时尝试访问SDRAM时候起作用,一组端口上的应用在另一个端口没有读或者写的操作时,将会立刻操作。所以指定:

PORT_TIME_SLOTS=> “1111111111111111” 允许只有当Port1不存取SDRAM时候,Port0存取SDRAM。但是并不会完全阻止port0存取SDRAM。

 

一组PORT_TIME_SLOTS参数的位影响到双端口模块的性能和反应能力,指定:

PORT_TIME_SLOTS=> “1111111100000000” 向每一组端口分配了半个SDRAM的带宽,但是这样做也许会阻止一个端口对于SDRAM的访问 长达8个时间隙,当另一个端口有优先权时候。为了减少延时,指定:

PORT_TIME_SLOTS=> “1010101010101010”  在两组端口之间交替访问SDRAM但是会浪费时间,因为SDRAM控制器流水线必须在每次切换前清空。该组位的分配是用于特定应用的,但是用连续的组通常是最好的。

 

端口数目的扩展

         如表三中所示的,多个双端口模块可以级联使得可以建立多个SDRAM接口非常容易。注意通过双端口模块会在你的应用中增加传输延时,以致也许会需要降低最大时钟频率。

 

 链接地址:


http://wenku.baidu.com/view/95730f550b4e767f5acfce84.html

。。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值