问题:



- 这是DDR3的顶层文件,画圆圈的部分是不是属于IP的输入部分?
- ddr_ctrl2程序里的时钟信号采用的是DDR3的IP核里的输出100M信号,能不能直接采用PLL输出的100M时钟信号?
回答: (1)画圆圈的的部分是DDR3控制器中的一部分接口,是IP接口的一部分。
(2)由于DDR3内部有PLL,ui_clk是内部PLL生成的,无论频率还是相位都与DDR控制器的数据输入、输出同步。因此建议使用ui_clk。同时因为接口宽度不同sys_clk 与ui_clk的时钟周期也会不同。

图1
2.


数据是128bit有点不太明白,我能想到是16位的数据接口乘以8,不过这个8是怎么来的?
在网上看到一种预存取的概念,就是8个数据,也是8个16位的数据,就是128位了。

图2
还有老师你在讲这一段时,你说是因为列地址的低3位没有用到,所以就是用了这3位变成8个数据的。我感觉不能理解,列地址已经是提前设置好的数据,怎么会用到这个上面去,我觉得列地址的低3位数据已经有了,怎么会任意变化用到其他的地方上去?
回答:这个128与DDR3的8倍的预读取没有直接的关系,这个接口是FPGA内部的接口,也就是DDR3的接口是16位的,双边沿读取的,如果800M的时钟,将会产生1600M的数据吞吐率,也就是如果在FPGA内部如果采用同样的位宽比如16bits, 采用单边沿操作数据,FPGA内部的时钟将达到1600Mhz, 这样的时钟在FPGA内部很难满足时序收敛的要求,因此在DDR3器件与FPGA应用程序之间设计了一个DDR控制器的IPcore, 用于隔离应用程序与DDR3器件。

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

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


老师,你在讲这个的时候,是因为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.


(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.

这个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中的内容将保持不变,关于如何用RTL实现mask的Verilog代码,可以参照RISC-V CPU 设计DTCM部分内容。读的时候不需要MASK,因为读取后哪个字节不需要,直接在读出后利用逻辑挑选出来即可。
6.

可不可以让写程序的app_en提前取值1?因为读程序的app_en就是在0状态取值的1。为什么写程序和读程序的app_en取值时间会不一样?
回答:app_en主要是控制命令(app_cmd)与地址(app_addr)的操作,主要看程序中的调度过程,而app_wdf_wren是控制写数据的过程,一般先设定好命令和地址后在控制读写,这样才能准确写到DDR3中的特定空间中。
7.

这是写程序的1状态。
- app_wdf_rdy是DDR3的IP核的输出信号,是一直保持高电平吗?同理还有app_rdy是不是也是这样的?
回答: 不一定,因为DDR控制器与DDR3之间还有刷新等时间上的需求,因此当DDR控制器因为不能将数据及时写到DDR3器件时,APP写入到DDR控制器的数据就会积累,积累到上限后app_wdf_rdy就会变低,改变程序进行测试(连续写入大批量数据,就会发现app_wdf_rdy变低)
- app_wdf_end信号是写结束的意思吗?
回答:是应用程序APP通知DDR控制器,这是本次写的最后一笔数,此后就会结束本次写的过程,如果后续还有写写需求,重新从app_en, app_rdy,app_addr, app_cmd开始下一轮。
- 假设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…)的相关文章进行学习。

- 这接下来的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行0 bank0列中去,但并不知道延迟几个时钟。

8.

划线部分的条件有点疑问,比如if(wrcmd_cnt != total – 1)中,wrcmd_cnt为239时就不执行写程序了,就会调到else app_en <= 0;,但实际上239时还有执行写程序,保证写进去240个数值,我的疑问是这个减1的写法是不是对的? if( (wrnum >= total – 1) && (wrcmd_cnt >= total – 1) ) 的条件状况类同。
回答:减法没有问题,首先减法(算数运算符)的优先级高于等式运算符或关系运算符;其次在判断语句中的表达式运算都是组合逻辑,是在当前时钟内就可以完成,不会产生时钟延迟。
9.


试验中read_on只维持了一个时钟周期,根据程序是不是可以理解,当按键按下时read_on赋值为1,当第二个时钟周期来的时候,并没有按键,是不是就进行
else
begin
read_on <= 0 ;
write_on <= 0 ;
End
的程序,就是图中划线的部分,老师,我这样分析对不对?
回答:这个理解是对的,就是每次按下控制一次读或写一批数据。
这里额外想提3个问题,老师
10.

网络协议中,这里的读取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.

原理图中,左边标1的×是什么意思?左标2的这种符号什么意思?右边中紫色、绿色、褐色的字体是不是只是区分不同硬件模块的?
回答:
-
首先更正一个问题,在线路板中电磁波的速度与光速在正空中的传播速度比较大,公式为 V≈c/, 其中c是光在真空中的传播速度3×108m/s,是磁导率,一般接近1,是介电常数,与PCB板的材质有关,一般如果选择FR4, 4.2, 可以算出电磁波在多层线路板中内层的电磁波传播速度。当然线路板的顶层及底层如果镀金且裸漏在空气中,该两层的传播速度接近光在空气中的传播速度,即V≈3×108m/s, 一般称该电磁波为横波。—见电磁场与电磁波理论。
-
一个周期20ns,传播从时钟的上升沿开始,到下一个上升沿出现时,第一个上升沿传播了接近21m。不过这个问题问的不够明确,因为这是时间和空间的两个问题,也就是时空特性。也就是说时间上20ns的波形,在空间上不一定要保持完整的波形,只要接收端在时间上能感受到20ns的波形即可。一般在接收端都会设定好阻抗匹配(终端电阻)防止波形反射,那么先到的波形部分先消失,后到的波形后消失,只要时间上对方也是20ns的波形即可,因此在线路板上不需要安排21m的线路长度,在空间展现完整的波形。但也有几个问题需要讨论。第一,如果时钟和数据一起布线,为了满足时钟和数据的时序关系,在线路上应该尽量满足等长,使得在时间上的延迟一致。第二布线的线路足够短,防止反射后的波形出现在数据的中间部位,例如1m长的空间距离,反射回来的波形与原始波形在时间约差10%(考虑往返2m),这时一般认为出现反射干扰的边界。当然这是粗略估计,不同的时钟频率,对距离的要求也不同,按照上面方法估算。所以一般在总线布线时,多数走平行线,考虑等长,并有布线长度的限制。当然布线中还有其它因素需要考虑。
-
符号
表示差分信号标志,当布线规则设定好后,这两根线即按差分线的原则布线,知识库上目前智能硬件与PCB layout视频是对大家开放的,上去学习一下吧。
(4)颜色差别,主要是为了阅读时容易区分,没有特别的含义。
DDR3插眼