FPGA实现DDR3读写操作,乒乓操作——FPGA学习笔记1

前言笔者:人生建议从第四章开始看。。。。

一、初认SDRAM

物理 Bank:传统内存系统为了保证 CPU 的正常工作,必须一次传输完 CPU 在一个传输周期内所需的数据。而CPU 在一个传输周期能接受的数据容量就是 CPU 数据总线的位宽当时控制内存与 CPU之间数据交换的北桥芯片也因此将内存总线的数据单位是 bit (位)位宽等同于 CPU 数据总线的位宽,而这个位宽就称之为物理 Bank (Physical Bank) 的位宽。

芯片位宽:每一片SDRAM缓存芯片本身的位宽。

CPU需要多少位宽数据,SDRAM就要提供多少位宽数据,位宽不够使用多片SDRAM级联。、


二、SDRAM操作时序

        1、SDRAM操作指令

CS#:片选  RAS#:行选通  CAS#:列选通  WE#:读写切换  DQM:数据掩码  ADDR:数据总线  DQ:数据  Notes:参考详细说明

        2、指令时序        

                (1)ACTIVE Command(行激活指令)

                (2)READ Command(读,列激活)

                (3)WRITE Command(写,列激活)

                (4)PRECHARGE Command(手动预充电)

                (5)初始化时序,加载模式寄存器

                (6)配置模式寄存器

A0~2:突发模式        A3:突发类型        A4~6:CL延迟        

                    (7)突发读时序

                (8)连续发送读指令时序

                (9)突发写时序

                (10)连续写时序

                (11)禁止指令

三、DDR2 SDRAM

        1、OCD校准

        2、前置CAS、附加潜伏期、写入潜伏期

四、DDR3 SDRAM

        1、与DDR2的区别之处

                (1)突发长度

                (2)寻址时序

                (3)新增重置功能

                (4)新增ZQ校准功能

                (5)参考电压分成两个

                (6)点对点连接

        2、DDR3硬件设计与时序

DDR3

        3、初始化时序

        (1)上电一瞬间RESET拉低保持200us(再次期间其他信号无效)。

        (2)RESET拉高前,CKE至少保持10ns拉低。

        (3)至少等待500us后(期间CK差分始终提前CKSRX时间稳定),CKE拉高。

        (4)CKE拉高后,等待tls时间,后发送NOP指令,继续等待tXPR时间。(期间ODT处于工作状态)

        (5)发送MRS配置指令,每配置一个等待tXPR时间,MRX寄存器配置完成等待tDLIK=tMOD+tZQinit时间。

        (6)在tDLIK等待时间内,发送ZQCL指令,以及NOP指令。到此整个DDR激活结束。

        4、DDR3模式寄存器配置

                (1)MR0寄存器

BL:突发长度        CL:等待        RBT:读的突发类型        CAS Latency:延时配置

TM:工作模式(常规/测试)        DLL:重置(back返回值归零)

WR:写复原(重新写回原本数据)        PPD:退出速度( )

### FPGADDR 乒乓缓存的工作原理 在FPGA设计中,DDR乒乓缓存是一种有效的方法来提高数据传输速率并优化资源利用效率。该技术通过交替访问两个独立的存储区域(通常称为缓冲区A和B),使得在一个缓冲区被写入的同时另一个可以用于读取操作[^1]。 当处理连续的数据流时,这种机制允许系统持续不断地接收新输入而不会造成阻塞。具体来说,在一个周期内向其中一个缓冲区加载数据;而在下一个周期,则切换到另一侧执行相同的操作——即前一阶段处于写状态下的部分现在转为只读模式,反之亦然。这样就实现了无缝衔接的数据交换过程[^2]。 为了更好地理解这一概念,下面是一个简单的Python伪代码示例展示了如何模拟这样的行为: ```python import time def ddr_ping_pong(buffer_a, buffer_b): active_buffer = 'A' while True: if active_buffer == 'A': # 对buffer A 进行写入操作 write_data_to_ddr(buffer_a) # 切换至Buffer B准备下一轮循环 active_buffer = 'B' read_and_process_from_ddr(buffer_b) elif active_buffer == 'B': # 对buffer B 进行写入操作 write_data_to_ddr(buffer_b) # 切换回 Buffer A 准备下一次迭代 active_buffer = 'A' read_and_process_from_ddr(buffer_a) # 模拟等待一段时间以便观察效果 time.sleep(0.5) def write_data_to_ddr(target_buffer): print(f"Writing data into {target_buffer}") def read_and_process_from_ddr(source_buffer): print(f"Reading and processing from {source_buffer}") ``` 上述代码片段仅作为逻辑示意,并未实际涉及硬件层面的具体实现细节。真正的FPGA编程会使用VHDL或Verilog等专用语言完成相应的电路描述与配置工作[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值