Menu Close

DDR3控制器的使用及答疑

问题:

%title插图%num

 

%title插图%num

%title插图%num

  1. 这是DDR3的顶层文件,画圆圈的部分是不是属于IP的输入部分?
  2. ddr_ctrl2程序里的时钟信号采用的是DDR3的IP核里的输出100M信号,能不能直接采用PLL输出的100M时钟信号?

回答: (1)画圆圈的的部分是DDR3控制器中的一部分接口,是IP接口的一部分。

(2)由于DDR3控制器内部有PLL,ui_clk是内部PLL生成的,无论频率还是相位都与DDR控制器的数据输入、输出同步。因此建议使用ui_clk。同时如果接口宽度不同sys_clk 与ui_clk的时钟周期也会不同。

%title插图%num

图1

2.

%title插图%num

%title插图%num

数据是128bit有点不太明白,我能想到是16位的数据接口乘以8,不过这个8是怎么来的?

在网上看到一种预存取的概念,就是8个数据,也是8个16位的数据,就是128位了。

%title插图%num

图2

还有老师你在讲这一段时,你说是因为列地址的低3位没有用到,所以就是用了这3位变成8个数据的。我感觉不能理解,列地址已经是提前设置好的数据,怎么会用到这个上面去,我觉得列地址的低3位数据已经有了,怎么会任意变化用到其他的地方上去?

回答:这个128与DDR3的8倍的预读取没有直接的关系,这个接口是FPGA内部的接口,也就是DDR3的接口是16位的,双边沿读取的,如果800M的时钟,将会产生1600M的数据吞吐率,也就是如果在FPGA内部如果采用同样的位宽比如16bits, 采用单边沿操作数据,FPGA内部的时钟将达到1600Mhz, 这样的时钟在FPGA内部很难满足时序收敛的要求,因此在DDR3器件与FPGA应用程序之间设计了一个DDR控制器的IPcore, 用于隔离应用程序与DDR3器件。

%title插图%num

图3

图3仅仅是APP—DDR_CTRL—DDR3的示意图。

%title插图%num

图4

实际上128bits 是由图4所决定的。而与DDR3是否8倍的预读取没有直接关系。

3.

%title插图%num

%title插图%num

老师,你在讲这个的时候,是因为burst chop为8,但是对burst chop的概念还是不太清楚,还有老师你举个这个例子,你的意思app_addr先从高位取8位,因为app_addr一共有27位,只能取高位的24位,剩下的3位取不到,为什么是从高位开始取的?剩下的3位我觉得也可以取到的。总之,对这个只取前24位不太理解,还有后3位去哪里了?列地址的低3位同样也要参与到整个系统中去的。

回答:这个同样与burst chop没有关系,这边所有的操作都是APP与ddr控制器的关系,因为每次读写都是128bits,也就是8个16bits, 因此低三位地址可以不用,上面的程序也可以写成app_ddr[26:0]<=app_ddr[26:0]+8; 结果是相同的。

4.

%title插图%num

%title插图%num

(1)老师,这个total数值240是不是随机给的?

(2)是不是total最大数值是224?因为total表示多少个地址数app_addr[26:3],还是最大数值是227

(3)这个读数据是个循环,从1状态结束后还是0状态,但是total数值还是240,就是读的还是原先的地址,感觉没有多大的意义,因为第一次已经在DDR3的地址中读到了数据,再读取一遍,表示不理解。同理,写程序中也存在着这样的循环。

回答:240是随机给的一个数,用来测试的,可以给任意值,只要不超过DDR3的容量即可。主要是看读写的数据是否一致。total的最大值是DDR3容量(按bit计算)除以128即可,这里应该是224

5.

%title插图%num

这个app_wdf_mask遮掩是什么意义?起到什么作用?只在写数据时才有这个信号,写数据工作时是低电平吗?

回答:mask是指在写的时候可以确定哪些8bits可以写入,如128bits 分成16个8bits,分别为data[127:120],data[119:112]……data[15:8],data[7:0]; 如果对应mask为1,则屏蔽该位,即该位对应的8个bits无法写入,在DDR3中的内容将保持不变,MASK和数据一起写入DDR控制器,最终由DDR控制器与DDR3打交道实现DDR3的字节屏蔽。

关于如何用RTL实现mask的Verilog代码,可以参照RISC-V CPU 设计DTCM部分内容。读的时候不需要MASK,因为读取后哪个字节不需要,直接在读出后利用逻辑挑选出来即可。

6.

%title插图%num

可不可以让写程序的app_en提前取值1?因为读程序的app_en就是在0状态取值的1。为什么写程序和读程序的app_en取值时间会不一样?

回答:app_en主要是控制命令(app_cmd)与地址(app_addr)的操作,主要看程序中的调度过程,而app_wdf_wren是控制写数据的过程,一般先设定好命令和地址后再控制读写,这样才能准确写到DDR3中的特定空间中。

7.

%title插图%num

这是写程序的1状态。

  1. app_wdf_rdy是DDR3的IP核的输出信号,是一直保持高电平吗?同理还有app_rdy是不是也是这样的?

回答: 不一定,因为DDR控制器与DDR3之间还有刷新等时间上的需求,因此当DDR控制器因为不能将数据及时写到DDR3器件时,APP写入到DDR控制器的数据就会积累,积累到上限后app_wdf_rdy就会变低,应用程序检测到该信号变化后应停止写入过程,改变程序进行测试(连续写入大批量数据,就会发现app_wdf_rdy变低)

  1. app_wdf_end信号是写结束的意思吗?

回答:是应用程序APP通知DDR控制器,这是本次写的最后一笔数,此后就会结束本次写的过程,如果后续还有写写需求,重新从app_en, app_rdy,app_addr, app_cmd开始下一轮。

  1. 假设app_wdf_rdy是第一个时钟,接下来if(app_wdf_wren)中app_wdf_wren是值还不是1,所以来到else,将app_wdf_wren和app_wdf_end赋值为1,这是不是第二个时钟?如果是的话,接下来if(app_wdf_wren),然后是if(wrnum != total – 1),因为wrnum起始值为0,所以不等于total – 1,这个是不是第三个时钟?如果不是的话,app_wdf_data <= app_wdf_data + 1 就是第三个时钟了?老师,我这样分析对不对的?不对的话,应该是怎么样分许程序的?

回答:所有这些都是在一个时钟下判断的,第一个时钟app_wdf_rdy为1,如果app_wdf_wren为0, 下一个时钟就满足条件了,共计2个时钟。if之间没有时钟的概念,就是在一个时钟的上升沿之后,把所有的条件都评估一遍,找出满足条件的部分执行,并不会因为if嵌套而延迟到下一个时钟周期去,可以在知识库上参照学习always(posedge clk…)的相关文章进行学习。

%title插图%num

  1. 这接下来的if语句中,是不是和上面一个if语句的时间上是持平的,也就是优先级是不是一样的?也就是状态1开始时,只要条件满足,这两个if语句就可以同时进行,没有先后顺序之分?

回答:这个理解是正确的

(2)第二个if语句的前后时钟和第一个if语句的前后时钟我觉得是一样的:app_rdy是DDR3的IP核的输出信号,假设为第一个时钟时,接下来if(app_en)中app_en是值还不是1,所以来到else,将app_en赋值为1。此时app_cmd、app_addr、app_en、app_rdy、app_wdf_mask、app_wdf_rdy、app_wdf_wren、app_wdf_end的值都满足条件,所以在第二个时钟下,app_wdf_data将值写入到app_addr对应的地址单元中去(这里回答老师帮助添了几个字),因为app_wdf_data的初始值为0,app_addr <= start_addr,start_addr的初始值为0,所以app_addr的值也为0,所以在第二个时钟下,将0值写进到0地址中去,也就是0行0 bank0列中去。

所以第二个if语句的前后时钟和第一个if语句的前后时钟一致,就是为了在同一时钟下,将0值写进到0地址中去,为后续的1值写进到1地址去做好时钟基础,为了不产生将1值写进0地址的情况。老师,我这样分析对不对的?

也就是下图中的1情况,是不是这样的?老师。

回答:这个理解基本正确,但是有一点需要声明的是,这些写的过程都是写到DDR控制器中,由DDR控制器根据命令,地址等译码再控制写入DDR3芯片中,虽然最终结果也是写到0行bank0的0列中去,但并不知道延迟几个时钟。

%title插图%num

8.

%title插图%num

划线部分的条件有点疑问,比如if(wrcmd_cnt != total – 1)中,wrcmd_cnt为239时就不执行写程序了,就会调到else app_en <= 0;,但实际上239时还有执行写程序,保证写进去240个数值,我的疑问是这个减1的写法是不是对的? if( (wrnum >= total – 1) && (wrcmd_cnt >= total – 1) ) 的条件状况类同。

回答:减法没有问题,首先减法(算数运算符)的优先级高于等式运算符或关系运算符;其次在判断语句中的表达式运算都是组合逻辑,是在当前时钟内就可以完成,不会产生时钟延迟。

9.

%title插图%num

%title插图%num

试验中read_on只维持了一个时钟周期,根据程序是不是可以理解,当按键按下时read_on赋值为1,当第二个时钟周期来的时候,并没有按键,是不是就进行

else

begin

read_on <= 0 ;

write_on <= 0 ;

End

的程序,就是图中划线的部分,老师,我这样分析对不对?

回答:这个理解是对的,就是每次按下控制一次读或写一批数据。

这里额外想提3个问题,老师

10.

%title插图%num

网络协议中,这里的读取fifo中的数据,提前了2个时钟。老师说FIFO读数是有寄存器延时的,从发出读请求到数据有效一般是2个clk,所以这样写的。但是以前所学的课程老师没有这样讲过,也没有这样用过,既然fifo的读数据需要提前2个时钟,是不是所有的fifo读数据时都要这样写呢?

我是这样想的,网络协议中需要要求对网速的尽可能的提高,所以这样写,防止有数据交互时产生的等待时间,但是我想大多数的数据交互应该也是速度越快越好的。

Fifo除了有这个特点,还有其他的知识没?还有其他的比如pll、flash、ddr3有什么需要注意的地方吗?

回答:由于在条件满足时“rd_req<=1; ”本身要在下一个时钟周期才会得到结果,这就已经延迟一个时钟周期,fifo的输出一般在端口会设为寄存器类型,从fifo存储阵列到寄存后的端口也需要一个时钟,因此需要两个时钟,我建议分析一下程序,然后把fifo的配置过程走一遍看看,是不是与程序说的一样,然后仿真观察一下波形,这样才能真正掌握,否则即使回答了这个问题,也只是在几十种组合中的一个问题,最终不能融汇贯通。pll、flash、ddr3有什么需要注意的地方在使用中也是多用多练,知识库上有大量的文章或视频探讨的比较详细,应多读,泛泛的谈无法详细说明问题

11.

电子信息传输时的速度可以理解为光速3×108m/s,简化来计算就是3ns信息数据传输为1m,一般50m频率的信息数据一个时钟周期为20ns,这样一个时钟周期20ns需要走大概21m,但是一般的电路板子中也不可能有这么长距离产生一个周期,更别说更低的时钟频率传输数据的一个周期距离就更长了,在现实中板子是怎么处理这个问题的?

12.

%title插图%num

原理图中,左边标1的×是什么意思?左标2的这种符号什么意思?右边中紫色、绿色、褐色的字体是不是只是区分不同硬件模块的?

回答:

  1. 首先更正一个问题,在线路板中电磁波的传输速度与光速在真空中的传播速度有比较大差别,公式为%title插图%num, 其中c是光在真空中的传播速度3×108m/s,µ是磁导率,一般接近1。ε是介电常数,与PCB板的材质有关,一般如果选择FR4,

    ε4.2, 可以算出电磁波在多层线路板中内层的电磁波传播速度。当然线路板的顶层及底层如果镀金且裸漏在空气中,该两层的传播速度接近光在空气中的传播速度,即V≈3×108m/s, 一般称该电磁波为横波。—见电磁场与电磁波理论。

  2. 一个周期20ns,传播从时钟的上升沿开始,到下一个上升沿出现时,第一个上升沿传播了接近21m。不过这个问题问的不够明确,因为这是时间和空间的两个问题,也就是时空特性。也就是说时间上20ns的波形,在空间上不一定要保持完整的波形,只要接收端在时间上能感受到20ns的波形即可。一般在接收端都会设定好阻抗匹配(终端电阻)防止波形反射,那么先到的波形部分先消失,后到的波形后消失,只要从时间上看对方也是20ns的波形即可,因此在线路板上不需要安排21m的线路长度,在空间展现完整的波形。但也有几个问题需要讨论。第一,如果时钟和数据一起布线,为了满足时钟和数据的时序关系,在线路上应该尽量满足等长,使得在时间上的延迟一致。第二布线的线路足够短,防止反射后的波形出现在数据的中间部位,例如1m长的空间距离,反射回来的波形与原始波形在时间约差10%(考虑往返2m,时钟频率为50M),这时一般认为出现反射干扰的边界。当然这是粗略估计,不同的时钟频率,对距离的要求也不同,按照上面方法估算。所以一般在总线布线时,多数走平行线,考虑等长,并有布线长度的限制。当然布线中还有其它因素需要考虑。

  3. 符号

%title插图%num

是差分信号对的标志,当布线规则设定好后,这两根线即按差分线的原则布线,知识库上目前智能硬件与PCB layout视频是对大家开放的,上去学习一下吧。红色的X表示,在原理图设计中如果没有连线的管脚,否则altium design在规则检查时会报错。

(4)网络标号中颜色差别,主要是为了阅读时容易区分,没有特别的含义。

 

 

Posted in FPGA, 教材与教案, 文章

发表评论

相关链接