马上注册,看完整文章,学更多FPGA知识。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
温馨提示:明德扬2023推出了全新课程——逻辑设计基本功修炼课,降低学习FPGA门槛的同时,增加了学习的趣味性,并组织了考试赢积分活动
明德扬整理了的同学们提出的问题,本帖将所有问题进行一个汇总,大家可以从这里找到您想要学习或疑惑的问题,然后进入对应的汇总贴进行学习。为方便您随时找到答案,敬请您收藏本网址!
如果同学们的问题我们帖子里面没有的请第一时间联系我微信同步:13112063618易老师,我们对新问题进行补充!
一、SDRAM和DDR专题课
【问题1.1】DDR3那个课程,一般线速率能跑到多少?
答:本课程的DDR3内容,是基于XILINX K7芯片,使用的是VIVADO平台。DDR3的时钟频率是800M。用户侧时钟是200M。
【问题1.2】SDRAM和DDR3课程,使用是什么平台?
答:SDRAM部分使用的是QUARTUS平台,着重于讲解SDRAM时序和SDRAM的接口设计。DDR3部分,使用的是VIVADO平台,着重于DDR3 IP的生成和上板验证流程。DDR3的理论部分,基本上不涉及,建议可以参考SDRAM的理论部分。
【问题1.3】 使用DDR3 IP一定需要读地址FIFO,读数据FIFO,写地址FIFO,写数据FIFO来先进行数据缓存吗?
答:这个理解是不对的。这里没有跨时间域的信号传输的。因为IP核会产生一个本地时钟,这个本地时钟是可以直接采集数据的,假设为clk_ddr_local。用户可以直接使用clk_ddr_local来往IP核传输数据。好了,接下来再考虑一个场景:我有一组数据A,产生于时钟域clk;A要写到DDR,DDR的时钟域是clk_ddr_local。自然地,A要跟时钟域到clk_ddr_local,然后才能写到DDR中,这就需要用到FIFO。接下来考虑另一个场景:我有一组数据B,产生于时钟域clk_ddr_local;B要写到DDR,DDR的时钟是clk_ddr_local。由于两个时钟域相同,直接写就好了。(通常来说,这已经不属于DDR的知识了,而是属于跨时钟域处理的知识,是FPGA工程师都应该知道的概念)。
【问题1.4】用户逻辑控制DDR3读写的程序不是需要自己写吗?答:官方一般提供了DDR3的IP核。
答:用户可以通过DDR3 IP核来进行DDR3芯片的读写。但是用户需要写逻辑来控制DDR3 IP核。
【问题1.5】课程里会讲如何通过DDR3 IP像写入图像吗?
答:课程中的SDRAM部分,会有例子讲如何写入图像到SDRAM中,DDR3/4也是类似的。但由于每人的项目不同,所以需要学员根据自己情况来移植。
【问题1.6】如何知道ddr3里不空,可以读取了?
答:DDR3和RAM一样,是一个存储器件,它的每个内部单元都存储了当前的数据状态值。但DDR3和RAM本身,是没有“空”、“存有数据”,“数据满”等概念的。只要给地址,它就会把当前地址的数据给到总线上,而且这个地址可以读很多次。在设计的时候,是由设计师用自己写逻辑来判断DDR3是否为空。
【问题1.7】请问这个sdram的自动刷新命令发送后,是不是刷新的是所有bank的同一行都在执行刷新呀?也就是说刷新的是不同bank的同一行,是不是这样理解
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220389175751.png)
答:是的。发送一个自动刷新命令,所有BANK同一行都会刷新。
【问题1.8】请问有ddr3的IP核手册吗?(altera的)
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220390182276.png)
答:IP核不同,界面会所不同,但一般都会提供下载链接的。VIVADO、ISE等,也是同样的情况
【问题1.9】做一个用到ddr4的项目,有一个ddr3的例程,不知道怎么改成ddr4?
答:百度搜索找资料,按流程配置就好,这个我们没有教程,只能看数据手册
【问题1.10】下图中的自刷新有啥区别?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220390118624.jpg)
答:上电后,要经过初始化,初始化中要有两次刷新动作;当初始化完成后,才是每隔一段时间,要自刷新一次
【问题1.11】如下图所示,为什么在接口中,一般要锁存住地址addr、写数据wdata等?不锁存不行吗?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220391342285.png) 答:如上图所示,假设在第2~6时钟时刻,addr的值为2,表示此时要写地址2。本模块收到此请求后,会在后面如第7~10时钟,产生写地址为“2”的时序。但注意,在第7~10,addr的值还是不是2呢?可能不是了。
【问题1.12】请问连接ddr3 ip核与mem_burst时,有些端口未定义。内些未定义的端口怎么办?答:
1. 本课程提示的案例,经过上板验证是可以的,如果不可以,请及时向老师反映。
2. 本例程验证过是可以的,因此例化时未连接的信号,就说明对本例程来说不用关心,不用使用。
3. 如果您要想关心这些信号,可以阅读数据手册,了解该信号含义。
【问题1.13】问题:请问老师xilinx FPGA的HR bank的 lvds接口可以驱动250Mhz DDR adc 吗?我一直只能跑到100Mhz ,不知道是不是我的时序有问题?
答:
1、首先请确认使用的芯片是否支持该DDR的速率;
2、如果支持的话,请严格按照设计规范进行设计;
3、同时请检查该开发板的pcb原理图的设计是否合适,例如pcb的走线是否等长,或者pcb的板材是否合适、阻抗是否匹配......这些都会影响DDR的速率。
【问题1.15】问:SDRAM中将刷新时间改为1300的意义何在?
答:如果以1562个为周期,当时间到了之后,如果此时处于写或读操作状态,就要等一段时间再进行刷新操作,这样刷新间隔就会大于1562,不满足要求。
【问题1.16】问:请问在边缘检测的项目中,输入输出数据是25M,SDRAM的工作时钟是100M,这种情况下读写效能是多少呀?
答:SDRAM读写总线效能一般计算:SDRAM的工作时钟 * 数据位宽 *70% 。(注意:其中70%是指减去sdram的一些操作占用后的效能,70%的数值是经验之谈,请根据实际情况变更数值) 【问题1.17】问:SDRAM工程中,读写请求是一个脉冲,还是连续的电平?
答:在MDY自定义的接口中,读写请求是一个持续为高的电平信号,一直拉高直到模块响应为止。拉高一个电平为表示读写一次。
二、高手修炼专题课
【问题2.1】计数器练习的9.4节中,第二个计数器的代码为什么是计30个呀?我认为应该是3*(8+1)+2=29个。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220392173846.png)
答:数据位一共是27位,开始位1位,结束位1位,还要注意看上图中,第三字节x后还有1位的0,之后才是结束位,所以一共是30位。
【问题2.2】在高手修炼课中,使用MDY提供的DO文件跑仿真,提示如下错误:
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220392119547.png)
答:这是由于MODELSIM版本不一致导致的。请打开DO文件,去掉下面的-novopt语句。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220392618365.png)
三、实用调试技巧专题课
问题【3.1】调试技巧训练,signaltap练习1里,我找到了报错的位置,但是我很好奇为什么会出现这个错误:dout没有输出123,连续输出了两个124。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220392212003.png)
答:这是signalTap工具使用的训练习题,只需要找到错误即可,不用修正错误。并且该练习的设计文件已经封装成IP核了,
无法看到内部设计文件,所以不需要纠结练习问题的生成原因。
问题【3.2】调试技巧课程 - 测试文件编写练习3-练习要求中的”报文之间的间隔位3字节“ 是指3个时钟周期?
解答:需要根据报文数据的位宽来确定的。例如,报文数据data位宽为8bits,那么间隔3字节就需要3个时钟周期;假如data是其他位宽,以此类推。
四、FIFO架构设计专题课
【问题4.2】图中X代表什么意思
答:这个X是表示并串转换的次数。FIFO输出的Q是32位,正常情况下,是有4个字节的有效数据,因此x=4。但有一个情况,在包文的最后一个数据时,有可能是只有1字节、或者2字节、或3字节,或4字节有效,这个有效多少是取决于mdy的值(经过FIFO后,即是Q的33和32位)。可以代入数据可以看到x的值。例如:当q[33:32]=1时,表示有1字节无效,即3个字节有效,所以此时x等于3。
【问题4.3】问:FIFO仿真时,与预想的不一样,有时候会出读出的不对?
答:在做FIFO仿真的时候,如果出现仿真出错的情况,建议按如下方式定位。1.一定要抓取FIFO的内部信号来观察。注意,一定是内部信号,例如FIFO这个模块的q、rdreq等。2.要先确认FIFO的输入端,即wrreq信号和写数据,一个时钟(写时钟)一个时钟去对,最好记录一下这个数据。3.其次,确认FIFO的输出端,即读时钟、rdreq和q这三个信号,一个时钟一个时钟去对,把数据记录下来。4.最后,再用写数据和读数据进行对比。另外,一般是不会有问题的,请认真核对。请注意,有部分同学反馈还是出错,我们技术经过远程定位后,发现同学在确认数据时,没有按时钟一个一个来数,导致了疏忽和遗漏,请确保一定要仔细核对。
【问题4.4】wrusedw是写侧保持数据个数, rdusedw是指读出读出了多个数据个数?
答:无论wrusedw还是rdusedw,均表示FIFO内保存有多少个数据。它们之间的区别仅仅是时钟域不同,wrusedw对应的写时钟域,即与写时钟对齐的信号; rdusedw对应的是读时钟域,即与读时钟对应的信号。由于写时钟和读时钟频率、相位等不同,所以wrusedw和rdusedw是无法完成一致的,使用时要注意。
五、综合项目实践课——温度检测工程
【问题5.1】温度控制系统:
1.串口进去之后,你有一个ASCII 转Hex的一个模块 ,然后进去之后有将包头解析 里面进入控制模块 可以直接发送hex数据 进入 然后加CRC检验
2.原本出来的数据是hex数据也就是说数据出来之后,在上位机去计算一下就好了,反而简单,在这里你又将HEX转换为ASCII 也就是说 你上去之后又很麻烦,而且下面处理也变麻烦了 。直接发送hex去上位机解析就好了 。原本一个简单的小dome最后反而变复杂了。
3.就是原本温度的数据在采集的过程中 可能会有不稳定的情况,你比如在采集的很长的数据中,有突变的,但其实,那个是不稳定的数据。加一个滤波算法进去。这样数据就会很稳定。也让这个小dome变的有意义,因为FPGA主要的就是去做算发 让他发挥他本有的长处,才是最好的做法。 答: ①项目的功能需求各种各样,当然去掉ASCII转换模块更简单,但是有的项目它的需求就是ASCII码操作,所以项目功能的架构最终都要根据需求进行设计。 ②然后,我们这个温度检测工程是一个培训项目,所以关于ASCII功能也会加入到项目中用于训练。 ③同时,温度检测只是该工程里核心的功能,其他功能的设计同学们也可以根据自己的脑洞想法、自己的需求进行设计体会,
我们非常欢迎同学们在群提出和分享自己的思路想法,互相讨论,共同进步。 ④当然同学们也可以蹲一下我们不定期开播的潘老师直播间,把自己项目功能设计、架构设计等等的疑问和需求提出来,跟潘老师进行讨论,解决你的问题。
【问题5.2】问:在下面的DS18B20的读时序中,中间部分(即红色框部分),是否指FPGA要输出高电平 ?
答:不正确。该时序前面一段是FPGA输出低电平(dq_out为0,dout_out_en为1)。然后是FPGA释放总线(dq_out_en为0,dq_out不关心)。
在后一段,是DS18B20输出值,FPGA读出值(dq_out_en为0,dq_out不关心。取dq_in的值)。
六、综合项目实践课——边缘检测工程
【问题6.1】点拨开发板,下载工程检测工程后,没有反应。
答:注意:下载后,需要按下矩阵键盘的按键0(即左上角第一个按键),才能显示!!!
【问题6.2】点拨开发板可以显示摄像头拍摄过来的图片吗?
答:由于点拨开发板的资源不足,所以无法显示摄像头的图片,如要显示,建议购买MP801开发板。
【问题6.3】PCLK的时钟频率问题
答:FPGA提供XCLK给摄像头,摄像头利用XCLK产生PCLK。所以PCLK来源于XCLK,所以XCLK是多少,PCLK就是多少。也就是说PCLK和XCLK频率大小一样,只是说可能不同相
【问题6.4】是否不使用PLL,而是用PCLK来作为采集模块的时钟?
答:PCLK经过插件连到FPGA,这其中可能会不稳定。为解决此问题,将PCLK连到PLL,产生一个同频同相的时钟,使用这个时钟作为采集模块的工作时钟。这样,即使PCLK缺少或者不稳定,但产生的时钟也会保持稳定。
【问题6.5】摄像头寄存器配置模块中,配置的是04对应RGB,但是数据手册中RGB应该是01,这是为什么?
答:这里的Bayer RAW本质上是RAW RGB格式,也是RGB格式。RAW RGB:在摄像头里没有经过任何处理的数据。
RGB:在摄像头里经过了ISP等算法处理的数据。如果想要最原始的数据,就使用RAW格式;如果要摄像头先美化一下,就使用RGB格式。想要哪种格式,取决于您的需求。
【问题6.6】边缘检测寄存器是怎么样配置的呢?
答:边缘检测中,ov7670_cfg模块和sccb模块,就是用来配置的,可以参考
【问题6.7】边缘检查课程案例OV接口是用MIMP还是DVP的?
答:OV7670是标准的SCCB接口,兼容IIC接口
【问题6.8】请问在边缘检测模块中的vga_config模块,如果想显示完整的一帧图像(假设为彩条显示)而ram资源不够,我用的多维数组来做存储器存储16bit 640*480个像素点,(目的:在local_wr_req时将写数据按地址存进去,在local_rd_req时将数据按地址读出来),请问以下代码方案是否可行,若不行,请问该如何实现此目的?(代码如下图示) ![](http://www.mdy-edu.com/static/upload/image/20231025/1698220393597424.png)
答:
1. 使用二维数组代替RAM方法:二维数据使用的是寄存器资料,通常RAM资源是远远大于寄存器资源的,所以RAM不足时,寄存器一般也不足。
2. 如果只是仿真用途,这个是可以的,可以不考虑资源。既然是仿真,那自然也可以增大RAM了。
3. 注意上面代码中有错误,读写地址是独立,不是共同一个的。读哪些地址数据,无关写地址。上面代码中不正确,具体请仿真。
【问题6.9】这个关系怎么得到的呢?根据这个图的话 上面的关系不应该反过来吗?在下一拍的时候应该吧taps0_ff0赋值给taps0x呀?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220394164594.jpg) ![](http://www.mdy-edu.com/static/upload/image/20231025/1698220396202274.jpg)
答:没有 ff0就是表示 延时一拍的意思,taps0_ff是taps0前一时刻的值,需要得到这种结果,就是通过时序逻辑打一拍,资料提供的有直播课讲解,建议结合仿真波形去看,测试文件有提供
【问题6.10】请问这一段写在代码的哪里?我找不到,看不出
答:在SCCB代码里
【问题6.11】边缘检测课程这个判断读或写使能的计数器的rw_cnt为什么刚好对应add_wdata[16]和add_wdata[17]?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220396125942.png) ![](http://www.mdy-edu.com/static/upload/image/20231025/1698220397307260.png)
解答:在工作状态(flag==1)时,此时对ov7670的指令进行读写,那到底是对指令进行读还是写,使用读写操作计数器rw_cnt进行计数,按顺序的进行判断。根据模块ov7670_para.v 里指令的格式:{读操作(1bit),写操作(1bit),操作指令(16bits)}。当rw_cnt=0时,设计上此时先判断指令写操作是否有效,因此对应判断ov7670_para.v 里指令的add_wdata[16],确认对应比特位的写操作是否为高电平,如果是,那么需要对该指令进行写操作,产生一个写使能有效信号(wr_en==1)。其他以此类推。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220397111004.jpg)
【问题6.12】边缘检测里面的sccb模块中,根据sccb手册要求,读时序的传输周期要写成两段写,为什么代码里面省了第二段(设备地址+读数据)?
这上面读时序传输周期只写了一段。 解答:理解有误,代码里sccb的读操作是有两段时序的。请联系信号 rd_com、count_duan、out_data、flag_sel,直接仿真查看波形一起理解,这样会更直观。
【问题6.13】问:边缘检测工程中,配置ov7670的寄存器顺序是固定,修改顺序要重新修改代码后上电,有没有办法可以不上电直接修改? 答:目前代码就需要重新上电。 不重新上电的方式,就参考温度检测工程,需要上位机配合
【问题6.14】问:边沿检测课程里,VGA_driver里面的行同步场同步信号为什么需要打拍延时产生?
答:在本模块中,使用了行计数器和场计数器来产生了读地址rd_addr。
1.该地址送给上游模块vga_config,然后将数据返回给本模块会有几个时钟的延时。
2.为了让返回的数据,与最终的信号vga_vys和vga_hys对齐,所以要延时一下,打了两拍再产生行场同步信号。
3.具体可以通过整体工程仿真来检查确认。检查返回的第一个数据是否有延时;第一个数据与行场同步信号是否有就是对 。
【问题6.15】边IP核配置代码中,下面部分的 3'b110,8'h02,32'h00800020 110,02分别属于什么功能呢
答:
1. 前面3比特的3'b110用于定义读写属性:分别是表示读、写和等待位。当对应位为1,表示使能。
a. 例如,3'b110,表示读使能、写使能、等待不使能。那么在代码中,将会对寄存器先执行写操作,然后再执行读操作。读操作的目的,是为了检查写的对不对。
b.例如,3'b001,表示读不使能,写不使能,等级使能。在代码中,不对寄存器操作,只用于延时。
2. 中间的8位是读写地址。即寄存器的地址,对应着IP核数据手册中的寄存器地址。
3. 后面的32位是写数据或者延时值。当写寄存器时,是写到寄存器的数据。当读寄存器,不关心,可填充为0。当是延时操作时,表示要延时的值,单位为时钟周期。
【问题6.16】问:请问边缘检测中,对于SDRAM模块的读写,涉及到仲裁内容吗?(边缘检测)
答:涉及到,就是读写怎么判断的问题
七、综合项目实践课——千兆网项目专题课 【问题7.1】千兆网课程里的udp和百兆网通用的吗? 答:本课程讲述的是千兆网,对于百兆网来说,UDP IP MAC和ARP协议都是相同的, 不同的是MAC IP核、FPGA和PHY芯片的接口不同。 本课程提供的是千兆网的工程,如果要使用百兆网,需要根据上面的内容来修改。
【问题7.2】千兆网课程有实现TCP协议吗?
答:本千兆网课程实现的是UDP协议,没有TCP协议。
【问题7.3】请问下,三速以太网IP核配置时,32bit对齐选项的意义在哪里?
答:在接口为32bit时,每个VLD有效时的数量是4个字节。由于MAC头是14字节,不是4的整数倍,在发送方向,在补上MAC头后, 必须调整数据(拿出2字节与MAC头最后2字节凑成一个4字节的有效数据),这样处理比较麻烦。 同时道理,接收方向,去掉14字节MAC头后, 会有一个VLD多出2字节的有效数据,这样调整也麻烦。为此,MAC IP核里有一个功能,就是32位对齐功能。该功能决定,在SOP位置时, 最高2字节是否为无效数据。 当是无效数据模式时,发送方向插入2字节无效数据+14字节MAC头;在接收方向,删除前16字节MAC头,剩下就是效数据。这样处理就方便很多了。
【问题7.4】 只要勾选了32bit对齐功能,IP核自动添加2字节的无效数据?
答:勾选对齐后,接收方向将删除无效数据,直接输出数据,即SOP位置的高2字节也是有效的,一直到EOP位置。发送方向,认为从SOP到EOP的位置都是有效的。
不勾选的话,接收方向,IP核输出、SOP位置的高2字节是无效数据。发送方向,进到IP核的数据里,将SOP位置的高2字节视为无效数据。
【问题7.5】如下图所示,当使用了PAD_EN功能时,接收方向,会将PAD去掉,但实际上没有去除,是怎么回事?
答:请看下面描述:第一段,当值小于600,该域反映的是长度,才会继续检查PAYLOAD长度, 进而才会有REMOVAL。当值大于600时,该域反映的是类型而已,则不会REMOVAL。
【问题7.6】课程里会包含TCP协议吗? 答:TCP协议使用逻辑实现非常复杂,所以本课程不会包含此部分内容。
【问题7.7】RGMII支持10M/100M/1000M三种模式吗?
答:RGMII是"吉比特介质独立接口"的含义,即1000M的传输接口。其他几种接口包括GMII、MII等。注意一下,10M/100M/1000M三种模式,指的是该“芯片”支持这三种接口,不是说RGMII支持。当芯片采用了RGMII或GMII时,就传输1000M;当采用了MII 100M时,就是传输100M。注意的是,RGMII和MII的部分管脚是可以复用的。
【问题7.8】千兆网配置寄存器的定义代码中,下面两个IP核数据手册中没有说明,是什么作用的? 答:第一行语句的作用是“等待10000个时钟周期”。目的是当完成前面的配置后,等待10000个时钟后,再去配置下面的寄存器。这是因为有时 候,配置完上面寄存器后,有可能要等一段时间才起作用,所以要等一等。这个“等待”功能是FPGA里面代码实现的。 第二句作用是测试使用的,可以删除,在调试时看看接口是否正确。
【问题7.9】本项目有没有配置外部的PHY芯片?
答:本项目是没有配置的,因为默认PHY芯片是不用配置就能正确使用的。
【问题7.10】、百兆网和千兆网的区别是什么?
答:
1. IP核是一样的
2. 千兆网使用的是GMII接口,百兆网则是MII接口。gmii数据线是8位;MII接口使用是4位数据线,也就是TXD低4位和RXD低4位。
3. 时钟频率不同,千兆网是125M,百兆网是25M时钟。
4. 百兆网的TX时钟来自于PHY芯片,芯片管脚使用的是tx_clk,而不是gtx_clk。
5. MII接口的4位数据线,是先发1个字节的低4位,再发高4位。
【问题7.11】老师,咱们千兆网项目中,为啥用sharkwire抓包的时候 最大传输速率到不了千兆呢?
答:因为包文传输的时候,会有消耗的,例如包与包之间有帧间隙,并且每个包会有前导码和FCS部分。因此达不到理论的千兆。
【问题7.12】请问一下在千兆网工程里,初始化mac IP核时,signaltapii有些reg_cnt刚开始时,add_wdata会出现一小段莫名其妙的数据,是怎么回事 ?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220400725605.jpg)
答:请注意这个signaltap采样的时钟一定要跟代码模块的时钟一致。
SignalTap使用教程: http://old.mdy-edu.com/jishuwenz/2019/1210/107.html
【问题7.13】在千兆网的rx_filter模块中,读数据的时候为什么用add_cnt=m_empty==0,这个信息FIFO的不空作为读条件?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220400189380.png)
答:信息FIFO非空,表示数据FIFO中存有一个完整的包文,因为需要判断包文是否正确,所以需要数据FIFO中保存一个完整包文之后再读出。
由于本模块需要将32位的数据转成16位的,计数器cnt数两次,表示数据FIFO需要两个时钟读出一次,当遇到最后eop的时候,由于可能存在无效字节,所以当无效字节为2个或者3个的时候,计数器只需要数一次就够了。
【问题7.14】在千兆网的rx_filter模块中,信息FIFO深度为什么设置为32,设置为1就可以了吧?
答:这里设置为32只是顺手而为,而且占用的资源也不是很多,所以就没有进行修改,深度改为1也是可以的。
【问题7.15】在udp发送的过程中,假设源端口为0x1234,目的端口为0x5678,那么发送的是12345678还是56781234?
答:发送的时候是按照12345678来发送的
【问题7.16】为什么udp协议在发送和接收的时候,源端口和目的端口顺序会反? 答:包文的协议时固定的,只会按照源地址加目的地址的格式发送。
1.FPGA发送的时候,FPGA产生包文,端源端口是1234,目的端口是5678。然后发送格式是源+目,因此发送的是1234_5678
2.FPGA接收的时候,PC产生包文,源端口是5678,目的是1234,然后发送的是源+目,因此是5678_1234。
【问题7.17】请问一下,我编译千兆以太网的时候,为什么把这个clogb2文件添加进去就会报错,说是sv文件?还有这个文件有什么作用?谢谢
答:clogb2不是一个完整的module文件,它是被用include的方法加入代码中的。它不需要加到工程上,所以可以把它去掉。
【问题7.18】请问下,在做练习工程的时候,需要自己设计MAC首部发送电路,MAC首部14字节,但数据位是4字节的,我需要定义 发送首部的计数器,这里4是不能被14整除的,我应该怎么处理?
答:
1、可以在设计代码的时,把产生的mac头、IP头、UDP头拼接起来的时候,在最高位补2字节的无效数据零。
2、或者在mac_ip核进行相关的设置,具体可以查看相关数据手册附:数据手册在打开IP核后如图所示位置查看
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220401961165.png)
【问题7.19】千兆网转百兆网的时候,需要给phy芯片一个参考时钟,是怎么给的?
答:开发板上有一个12M的时钟芯片,是给phy芯片的。外部晶振的事,跟FPGA无关
【问题7.20】我的采样时钟就是模块的工作时钟(always块里的);现在从MAC_IP核输出的数据不正确,根据常见问题PDF里问题1和6的解答,
有两种情况,如果时钟没问题那就有可能是IP核的输入信号有问题。我对应的代码和signaltap采集到的数据如图:
请问这种情况下,输入的数据算是正确的吗?
答:结果是正确的。原因同上【问题9】
【问题7.21】再设置好电脑的IP地址之后,把界面关掉,然后再打开就没有了,需要重新设置,怎么解决?
答:
1、点击左下角的WIN图标,输入CMD然后回车,打开DOS模式窗口。
2、在DOS命令行提示符下直接输入:“netsh winsock
3、reset”,然后回车,会提示需要重启,不要管它。
4、在DOS命令行提示符下直接输入:“netsh int ip reset
5、reset.log”,然后回车,提示重新启动计算机完成此操作。
6、关闭DOS窗口,重新启动计算机,问题解决。
【问题7.22】千兆网我们的和用mdio接口的有什么区别? 我们的教程是没有用到这个接口的
答:MDIO接口是用来配置外部的PHY芯片的,不是用来传输数据的,也就不是做网络协议使用的。当您需要配置外部的PHY芯片时,可以使用MDIO接口,否则可以不用。
【问题7.23】请问千兆网工程里,输入给MAC_IP核的ff_rx_rdy信号为什么直接置1?跟速率和带宽有关吗?
答:rdy表示下游模块准备好指示信号,如果准备好了就为1,没准备好就为0。 在本案例中,下游模块是rx_mac_analy模块,该模块支持rtl8122_a_mac_ip模块任意速度的数据,
即无论怎么来,下游模块都能接收并正确处理,所以在此处置为1(时刻准备好)就可以了
【问题7.24】请问,一个基础问题,千兆网工程里多个模块都调用了FIFO,在不同模块里调用的fifo的例化名(比如:u_dfifo)能否重复?
答:可以试试操作,在不同模块是可以重复的。
【问题7.25】这个是因为IP核没有破解吗?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220403193457.png)
答:这个错误就是高版本生成的工程在低版本中打开出现的编译错误,用高版本的quartus打开即可(如18版本的)
【问题7.26】千兆网课程使用的是哪个PHY芯片?
答:本课程使用的是MP801芯片,使用提RTL8211芯片。但课程中,几乎没有涉及到PHY芯片的内容,PHY芯片使用的是默认配置。对于其他PHY芯片,也是通用的。
【问题7.27】千兆网课程是ALTERA,是否与XILINX的通用?
答:本课程主要涉及到各个协议的RTL实现,这部分代码是通用的。但有一个MAC IP核,本课程的工程是使用ALTERA的,XILINX的亦有相同的IP,需要您移植。总的来说,MAC IP占整个课程的比重不大,大概是5%的内容。
【问题7.28】您的UDP教程里面包不包含ARP和CRC328bit这两个地方的讲解?
答:有arp的讲解,但crc就不包括。
【问题7.29】千兆网课程的源码中有相应的tb仿真代码嘛?
答:没有,但如果要验证功能正确性可以上板验证和仿真文件
【问题7.30】请问下载程序后,电脑检测不到本地以太网,把程序删除又可以检测?
答:可能程序里有复位管脚,把这些PHY芯片复位了。
【问题7.31】以太网通信中,抓包工具wireshark能抓到 但网络调试助手收不到 是怎么回事?
答:可能性有如下几种,请逐一排除。 1. IP地址不正确,请检查IP地址,尤其注意目的IP和源IP的区别 2. 端口号不正确,请检查端口号,尤其注意目的端口和源端口的区分。 3. 目的MAC地址不正确,可以尝试发送广播包文(非ARP包文)测试。 4. 包文过短,小于60字节。
【问题7.32】工程仿真的前导码后为什么有两个字节的0呢? 按理说应该紧跟目的MAC地址 图中e8 6a就是目的MAC开头.
答:MAC IP核的有一个32bit对齐的功能,关于该功能意义,请看【问题7.3】。如果出现上图中问题,有可能是MAC IP核中的32bit对齐功能设置有误。
【问题7.33】千兆网项目中,是否包括TCP协议实现?
答:千兆网项目是使用的UDP协议,而非TCP协议。目前来说,TCP协议由于有握手机制、重发机制等功能,在逻辑上实现相当困难,暂未看到商用的案例。
【问题7.34】高速采集后的数据 是存到内存或者flash吗 ? 答:激光项目:采集到数据后,内部进行计算和处理,并将结果通过千兆网上传到上位机。大数据采集项目:从光纤采集到数据后,保存到DDR3中,然后读出送到PCIE上位机。
【问题7.35】请问插上千兆网模块后,PING不通?
答:千兆网模块是一个基于PHY层的模块,不是完整的网卡,实现的是PHY层的协议,没有实现MAC层、TCP/IP层协议。
因此,不可能PING通(因为PING功能是在TCP/IP层实现的)。要实现PING功能,需要编写FPGA程序来实现。
【问题7.36】插上设备后,电脑识别成百兆网问题? 答:上电后,电脑与千兆网模块之间会开展自协商对话,根据双方的环境确定通信速率。如果希望工作在1G,而实质协商成100M,则依次按如下检查。
1. 检查电脑网卡是否支持1G,具体请看网卡设置
2. 检查网线是否支持1G,有类型的要求。
3. 换台电脑试试
4. 以上都测试过后还不行,请找指导老师确认。
【问题7.37】请问千兆网的rx_ip_analy.v文件,getlen是获取总长度,第二个图片get_len_4byte是完全不懂,请老师给个提示?还有+5又是什么意思呢?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220404195847.png) ![](http://www.mdy-edu.com/static/upload/image/20231025/1698220404197587.png)
答:IP长度是20字节,get_len_byte是实质获取到的数据长度(不包括IP头),单位为字节;get_len_4byte是实质获取到的长度(包括IP头),单位为32bite。
【问题7.38】你好,这个rx_ip_analy部分的,我不太清楚到底是实际的采集长度小于等于输入获取的长度还是输入获取的长度小于等于实际采集的长度。
感觉上面说应该cnt <get_len_4byte,下面又说act_len_byte < get_len是错的。
答:get_len:从长度字段获取到的长度;
get_len_4byte:从长度字段获取到的长度,单位为4字节; act_len_byte:从数据字段中获取到的长度; 所以,从数据中获取到的长度,小于“字段指示的长度”,就是错的。 【问题7.39】请教大家一个问题,以太网调试的时候,主机网卡不是realtek PCIE FE Family,主机接收不到fpga发送的报文怎么办? 答:一般来说,只要发送端发送的包文符合网口传输协议,无论什么网卡都可以都到包文。可以检查一下
①fpga发送的包文协议是否正确;
②检查网口识别的速率是否与工程速率匹配;
③检查网卡是否有问题
【问题7.40】千兆网工程使用sgmii接口,请问在vivado中用哪个ip核呀?
解答:GMII和RGMII接口使用的VIVADO IP核为:tri_mode_ethernet_mac。而SGMII接口使用的IP核为:1G/2.5G Ethernet PCS/PMA OR SGMII。注意:SGMII模式,使用上面的这个IP核。注意,SGMII协议会与本课程中的MAC协议不同,要特别留意。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220405104937.png)
【问题7.42】问题:以太网约束中,建立时间的时序报告如图一,请问下为什么上面是4ns,下面又是加8ns呢? 保持时间分析如图二,为什么这两个都加4?
图一
【问题7.43】请问一下,IP校验和,校验和字段不加,这部分应该是5吧,16*5。 ![](http://www.mdy-edu.com/static/upload/image/20231025/1698220411194222.png)
解答: 如图所示,ip_head[16*5-1 -:16]对应的是IP校验和的值,但此时还未计算出IP校验和的值,所以ip_sum=0,因此可以省略对ip_head[16*5-1 -:16]的求和计算。
【问题7.44】想请问一下,以太网tx_pack模块的测试文件,这条语句是什么作用呀? ![](http://www.mdy-edu.com/static/upload/image/20231025/1698220412120196.png)
解答:用于计算长度的有多少个2字节长度的数据。length表示长度有多少字节,而len_2b表示长度有多少个2字节。信号length不取最低位,相当于数据除以2。
【问题7.45】问:当把板子和电脑的网线相连后,电脑那里显示“未识别网络”,如何解决“未识别网络”问题?
答:“未识别网络”这是正常现象。当把FPGA板子和电脑相连后,无论FPGA有没有程序,此时双方通信均是“MAC层”的协议。该层协议只识别出速率,即1G还是100M速率。
而“未识别网络”是指TCP/IP层的协议,需要TCP/IP层的完整协议支持,这是FPGA板子没有的,也难以实现的功能,所以肯定是处于“未识别网络”状态。在真正应用中,FPGA板子和电脑只是点对点通信,不需要组网。
【问题7.46】问:如果我想将GMII口换成RGMII口的话,是只需要将位宽以及MAC重新配置一下就可以了吗?由于RGMII口是双边沿采样,所以不确定需不需要加额外的操作。 我看网上用vivado的时候还需要用原语将phy给的rxclk处理一下才行。 答:将GMII口换成RGMII口的话,除了需要将位宽以及MAC重新配置一下,还需要更换一下硬件电路部分电阻。
【问题7.47】问:就是这个选项卡里面,勾选local loopback的时候,这个回环是MAC侧回环还是phy侧的回环呀 答:这个回环是MAC侧回环。
【问题7.48】问:千兆网工程里有一个用户时钟:100M。这个100M时钟是否可以用125M代替。 答:用户时钟只要大于75M即可。在提供的参考工程文档里,有这个说明,可以看文档。
【问题7.49】问:为什么是干什么用的?是不是IP头?
答:伪首部仅是参与校验和计算而使用的,不会放到包文中进行传输。
【问题7.50】问:如下图,UDP包文协议中,各部分的位置在哪?
答:按照一个包文的先后顺序,其包文字段分别是: 前导码+MAC头+IP头+UDP头(不包括伪首部)+UDP数据+校验码。
【问题7.51】问:接收方向做CRC校验,是如何确认结果的正确性的?
答:CRC接收校验有两种方式。 第一种,接收过来的数据做CRC校验,结果与接收过来的CRC校验值比较,相同则接受正确,第二种,数据和接受过来的CRC结果一起做CRC校验,结果应该为“固定数”。注意,这里是固定一个数,不一定是0,因为CRC算法里,还存在输出结果反转和异或等操作,会导致结果不一定为0。
【问题7.52】问:接收方向做CRC校验,将数据和CRC位一起计算,结果一定是0吗?
答:数据和接受过来的CRC结果一起做CRC校验,结果应该为“固定数”。注意,这里是固定一个数,不一定是0,因为CRC算法里,还存在输出结果反转和异或等操作,会导致结果不一定为0。
【问题7.53】问:在千兆网工程中,很多模块都有使用到了rdy信号,该信号的产生有些是跟FIFO的存储数据个数关联。如FIFO深度为4096,当存储数据大于4086时,rdy为0;小于4086时,rdy为1。为什么这样设计?
答:rdy是本模块准备好信号,为1时表示可以接收数据,并且保证能够正确处理。为0时,要求上游模块不能发送。 当FIFO满了的话,进来的数据无法保存,就会丢失。所以满了当然rdy为0。为了让上游模块有一定的缓冲时间,将提示的水线设置小一些,例如4096的,就设为4086,这样上游模块可以晚几个时钟响应也是可以的。 至于是4086,还是4090,根据项目情况自己设置。
【问题7.54】问:千兆以太网的macIP核部分的完整视频有没有?我看这个IP核说是也需要配置,还有ctc校验,这些都是自动完成的吗?
答:没有,这部分不是直接使用就可以了,我们工程里有一个配置表代码 直接可以用的,ctc是自动完成的 不需要参与 【问题7.55】问:请问老师这部分讲解有吗,找不到?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220412117964.png) 答:没有讲解,直接使用
【问题7.56】问:麻烦问下千兆以太网接收mac地址是0是怎么回事呢?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698220413942257.png)
答:广播包应该是这么显示的【问题7.57】问:这个代码里的注释要怎么打开才看得到呢?
【问题7.58】千兆网课程提供工程源代码吗? 在课程网盘没有找到,是哪个文件?
答:
![](http://www.mdy-edu.com/static/upload/image/20231103/1698993954972025.png)
八、时序约束专题课 【问题8.1】 VIVADO的时钟约束向导,常无法找到时钟,如下图所示,位置1中应该要识别出时钟。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222193718874.png)
答:请注意,位置1的地方是列出的是“没有被约束的时钟”,如果该时钟已经被约束了,就不会在这里列出来了。注意上图中3的位置,该列说明了有2条时钟约束。可以点击这里看看,是不是已经对时钟进行约束了。为什么会有时钟被约束了呢?因为该工程已经有约束文件。
【问题8.2】VIVADO/QUARTUS练习中,rst_n是否需要约束?
答:一个完整的约束,其基本要求是:所有的路径都覆盖,包括所有的输入管脚和输出管脚。所以,rst_n需要约束。注意的是,该信号是输入信号,但没有随路时钟进来。所以该信号可以认为是无时钟的情形,按照课程理论,应该定义一个虚拟时钟。定义了虚拟时钟后,再重新使用约束向导,约束rst_n。
【问题8.3】在VIVADO中,如何设置虚拟时钟?
答:虚拟时钟不能在时序约束向导中添加,需要在下面窗口添加 在Edit Timing Constraints中点击,然后在creat clock窗口中,双击“Double click to create a Create Clock Constrtaint”。在弹出的窗口中 Clock name为该时钟命一个名字,Source objects是不需要填的,因为是虚拟时钟,就是没对象了。
【问题8.4】时序约束出现时序违例(Slack为负数),如何处理?
答:首先指出一个误区:当约束出现错误时,想当然地认为是“时序约束做得不对”,所以应该怎么去改“时序约束”,从而让这些错误消失,这是一个错误的观念。时序约束的作用:在于检查“设计是否满足时序要求”,它是用来审视自己设计的,很多情况是,要改设计代码来满足时序要求。当时序约束提示有错误时,应该阅读“时序报告”,从报告中分析时序路径(数据到达时间、时钟到达时间和数据要求时间等),根据报告分析错误的原因,并根据原因来实行不同的方法。 以建立时间违例,说明具体方法如下 1. 时序报告中,找到提示错误的路径,即目的寄存器,以及源寄存器。注意,这是两个寄存器的点。 2. 首先判断,源寄存器的时钟,与目的寄存器的时钟,是否相同。如果不同,可以认为是异步时序,见步骤3;如果是相同,则看步骤4。 3. 如果是异步电路,那么处理方法如下: A. 确认做了异步处理。对于数据,则是通过异步FIFO来做异步处理;如果是控制信号,则要经过打两拍来处理。 B. 确认做了异步处理后,仍然会报“时序违例”的。这个时候,可以该路径设置成set false path,不用再检查。 4. 同步电路下,具体处理如下: A. 查看两个寄存器点之间,经过了多少加法器、乘法器、除法器等。 B. 对于除法器,要特别留意,一般是1个时钟计算不完的。那么可以 a.想办法不用除法;b. 通过使能信号控制获取除法器结果的时间。 C. 对于乘法器和加法器,或者其他组合电路较多的。想办法分隔成流水线来实现。可以参考MDY 流水线的内容。 5. 如果是IP核的违例,检查是否时钟不满足IP核的要求。如果没问题,就不用管。 6. 如果是ILA等在线调试工具路线的违例,则一般不用处理。 7. 如果是线延时太长的,可以尝试打一拍处理。即A->B的线太长,可以打一拍,变成A->C->B,这样线延时就小了。
【问题8.5】VIVADO中,如何查询未约束的时钟、未约束的输入延时和输出延时等?
答:如下图,在VIVADO的时序约束界面中,在下面栏目可显示未约束的地方。
【问题8.6】如下图所示,跨时钟域打两拍的方法,其实只是一个信号的传递,当第一个信号出现不稳之后或者错误之后,后面就会把这个错误的信号继续传递下去,并没有起到纠错的作用
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222197186055.png)
答:上图中打两拍的方法,其本质不是为了“纠错”,它的作用是为了防止“亚稳态”。防止亚稳态的本质:防止中间状态过长。之所以采用两级触发器的方法,是因为D触发器出现亚稳态的可能性非常小,而两级D触发器出现亚稳态的概率就更小了。
【问题8.7】既然打两拍的方法不能纠错,那“打两拍”还有什么意义?
【问题8.8】模块A的时钟clka为100MHz,模块B的时钟clkb为300MHz。现在模块A要把32bit的数据送给模块B。模块A要如何发送,模块B要如何接收呢? 答:
方法1:采用异步FIFO的方法。
方法2:采用指令信号的方法传输,模块A产生vld信号给模块B,模块B对vld进行同步化处理(打两拍)后,检测同步化信号的上升沿。
需要注意的,VLD的信号是让模块B周期的三倍或以上。由于clka是100M,产生的vld是10ns,而clkb是300M,周期是3.33ns。所以模块A只要产生1个时钟的vld给模块B即可。
【问题8.9】模块A的时钟clka为300MHz,模块B的时钟clkb为100MHz。现在模块A要把32bit的数据送给模块B。模块A要如何发送,模块B要如何接收呢?
答:
方法1:采用异步FIFO的方法。
方法2:采用指令信号的方法传输,模块A产生vld信号给模块B,模块B对vld进行同步化处理(打两拍)后,检测同步化信号的上升沿。需要注意的,VLD的信号是让模块B周期的三倍或以上。
由于clka是300M,产生的vld是3.33ns,而clkb是100M,周期是10ns。所以模块A要产生10个时钟的vld给模块B。
【问题8.10】一块电路板上,有两个芯片,芯片A的时钟clka为100MHz,芯片B的时钟clkb为100MHz。现在芯片A要把32bit的数据送给芯片B。模块A要如何发送,模块B要如何接收呢? 答:
方法1:采用异步FIFO的方法。
方法2:采用指令信号的方法传输,模块A产生vld信号给模块B,模块B对vld进行同步化处理(打两拍)后,检测同步化信号的上升沿。需要注意的,VLD的信号是让模块B周期的三倍或以上。
虽然clka和clkb都是100M,但他们不是同一个晶振产生的,因此都是异步时钟。为了满足以上要求,所以模块A要产生3个时钟的vld给模块B。
【问题8.11】A, B时钟都是50M,但是他们不相关,为了防止编译器把他们默认为同一个时钟,是不是要用一个异步时钟组约束,来告诉编译器他们是不同的两个时钟? 答:一般分别产生A和B的时钟约束即可。
【问题12】 建立时间可以是负值吗? 答:建立时间当然可以是负数了。负数表示,可以在时钟上升沿后数据才变化。(建立时间是器件的属性,至于怎么器件怎么做到的,那就要问器件工程师了)
【问题13】 程序原本时序可以通过,加上singalTap节点之后时序不通过是什么原因 答:增加signaltap ILA等在线调试工具时,需要使用到内部的资源,例如RAM、选择器、寄存器等,增加后再去综合和布局布线。由于改变了资源,因此肯定对时序是有影响的,有可能改善了也有可能恶化了。如果时序有问题,分析路径,如果是在线调试工具路径,评估是否会有风险,没风险就算了
【问题8.14】时序约束什么时候要做? 答: 1.在需要的时钟频率下,如果逻辑功能不稳定,那么就需要时序约束。
2.一般时钟大于100M的时候,我们就要做一下时序约束。
【问题8.15】时序约束建立时间和保持时间的生活案例。 答:可以想象,有一个人从家里出发去机场,搭乘13点的飞机。
1. 13点起飞,起飞前15分钟要到机场,这个15分钟,就类似于建立时间要求。
2. 机场每小时有要飞一趟飞机,每个小时表示的是时钟周期。
3. 飞机起飞后,机场要保持10分钟,之后才能来下一批乘客,这个10分钟就是保持时间。
4. 这个人出发去搭13点的飞机,因此他要在12点45分之前到机场,并且是12点10分之后到机场。既不能早到,也不能晚到机场。
5. 如果这个人12点45分之后才到机场,那就搭不上本趟飞机,即违反了建立时间要求。(建立时间影响的是自己坐飞机)
6. 如果这个人12点10分前就到了机场,那就会因此上一趟飞机的起飞,即违反了保持时间要求。(保持时间不满足,影响的是上一批乘客坐飞机)
7. 这个人是计划去机场,因此他要估算几点能到机场。首先他会算所有情况下的最大延迟,如刚到路口红灯就来了、走路最慢等,在这种最慢的情况下,如果能在12点45分前到,说明建立时间没问题。然后,他会算所有情况下的最小延迟,如刚到路口绿灯,走路最快,在这种最快的情况下,如果能在12点10分后才,那说明保持时间没问题。
【问题8.16】为什么建立时间分析的时钟到达时间要加一个时钟周期而保持时间分析则不用呢? 答: 因为建立时间是源寄存器发出数据,目的寄存器采集,也就是上一个时钟发出来,本时钟采集。这里有一个时钟周期的因素,所以要加1个时钟周期。而保持时间分析,则是“本个时钟”发出数据后,如果延时太小,会影响“本个时钟”对上一个数据的采集,因为不需要加1个时钟周期。另外,要注意一点,保持时间是跟时钟周期无关的。
【问题8.17】一个外部的信号,经过状态机的“组合逻辑”,这也要做同步处理吗?答:需要做同步处理的。首先明白一点,FPGA里的时序逻辑=组合逻辑 + D触发器。组合逻辑的最终结果,还是要发D触发器的。所以还要做同步化处理的。
【问题8.18】请教下,做时序约束,做到这步时,这些都要勾选上吗?
答:当然不是,要逐个分析确认,没有一选就全选上的道理。
【问题8.19】下面的生成时钟约束,是否一定要勾选?
答:这应该看生成时钟那一节视频,里面重点强调了“什么叫时钟”? 上面的图里,您应该要搞清楚,它被识别出时钟了,正不正常?如果是正常,那您肯定是要添加约束,定义频率吧。如果它不应该识别出时钟了,
那您应该检查您的代码,看是不是代码不规范引起,或者有没有潜在的问题。注意一下:约束不是目的,约束是为了查看报告,看设计有没有问题的。
【问题8.20】系统同步只可能是单沿采集?没法像DDR那样双沿采集?
答:系统同步也是可以是双沿采集的,但比较少。课程里,只是介绍了部分情形。如果想看所有情形有哪些,可以打开VIVADO的时序约束向导,可以设置INPUT DELAY窗口查看。
【问题8.21】QUARTUS生成SDC时,默认出现的那条时钟约束是正常的么?我自己删掉就行了?
答:默认生成的当然是不正常。
【问题8.22】老师问一下,我画的后边那个部分,我认为应该没有数据吧?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222199674916.jpg)
答:不是 这个不是有没有数据的概念 而是数据是否稳定的概念。
【问题8.23】请问下有没有针对SDC时序约束语法的讲解吗?
答:时序约束里,只讲解了用到的部分。如果想看更多部分,我估计你要看这个语法的权威资料了。
【问题8.24】老师您好,我在学习时序约束视频,看到第一个视频这块“流水线设计思路:乘法器可以分成加法器,然后加法器还可以分成什么,一直听不清”
答:最后可以分成与门这些最简单的门电路。
【问题8.25】老师请问红色的是不是不满足时序要求?
答:不是的,setup和hold时间形成一个时间窗,只要在这个时间窗里信号稳定就饿可以了 在使用时序分析工具的时候,字体为红色时间提示是不满足时序要求
【问题8.26】什么样的信号会被工具判断为时钟?
答:一个信号被VIVADO QUARTUS判断为时钟,不是看名称里是否带有“clk”等字母。而是主要看其是否用于“时钟”的行为中,主要有如下几种情况。
1. 被关联到always敏感列表里的时钟信号。说明会被连到触发器的时钟端,所以会被认为为时钟。
2. 被连到PLL和MMCM等时钟管理器的输入端,这会被认为是时钟。
3. 被连到锁存器的条件端,例如一个没有补全的组合逻辑代码,其条件就会被认为时钟。
【问题8.27】用ila抓取信号分析,发现异常,而时序约束报告正常,因此可以认为时序报告正常,而时序会有问题?
答:
1.在线逻辑分析仪是用于判断逻辑是否出现问题,可以认为是检查时钟节拍下的逻辑判断。而时序约束是解决D触发器的建立时间和保持时间问题,是一个时钟内的时序问题。所以,不能用ila来推导时序约束,这是不同层次的问题。
2.官方可以保证,用户代码和时序约束的生成结果是正确,即在输入的代码和约束,给出来的报告一定是正确的。但时序约束对不对,这是客户保证的。
3.出现结果不对,可能性很多,不一定是时序问题,要注意“充分必要条件”。
【问题8.28】同样的工程不做任何改动,有时编译后下板验证正确,有时编译后下板验证不正确,是不是时序问题呢?
答:有可能是,但又不一定是。这是时序不满足的一种现象。但反过来,没有说,出现这种现象,就一定是时序问题。
【问题8.29】设置时钟约束时,假如有虚拟时钟的情况,虚拟时钟是必须要设置的吗?
答:
1.原则上所有接口有应有约束。
2.设置虚拟时钟,可以方便将对应信号归到该虚拟时钟好,这样方便做分析,例如看有没有跨时钟域等。
3.是不是一定要做,取决于项目老大要求,不做不一定有问题。
【问题8.30】一个always模块下,if 、else if,,,else ,写的太多了 ,是不是会容易造成时序问题呢?这种说法对吗?
答:这里有一个定义要搞清楚的,什么叫“多”?
1. 是3个就多,还是10个?每个人标准不同。
2. 即使是同一个人,使用不同的器件,这个“多”也是不同的。有些高级的器件,10个IF也不多,有些低端器件,3个也多。
3. 即使同一个人,同一个器件,但if里的判断条件也有讲究。如果判断条件里一个除法器,那1个if也多,如果只是判断0和1,那么10个也算少。
4. 最具可操作性的做法,给定时钟约束,看时序报告。报告没问题,那就是没问题;否则会有时序违例的错误。
【问题8.31】output latency一般设置成多少呢?pipeline 有啥用?
答:由于除法器占用资源较大,难以在一个时钟周期内计算完毕,需要多个时钟才计算完,这个pipeline就是设置多少个时钟周期的。
如果您不清楚要多少个,设置填一个较大的数,然后看时序报告是否正确。如果正确,就没问题。
【问题8.32】请问:MDY的案例中,为什么串口需要对din进行同步化,而SCCB就不需要对sio_din进行同步化?sio_din也是外部器件进来的吗?
答: 是否要对信号进行同步化,最核心的理解是“该信号是否能够保证满足建立时间和保持时间要求”,也就是“该信号的变化和时钟存在确定性相位关系”。
以串口为例,串口的输入信号与FPGA时钟是没有任何联系的,该输入信号可以在任意时刻变化,也就有可能刚好在时钟上升沿变化,从而不满足建立时间要求,
因此要做同步化处理。而SCCB案例中,由FPGA时钟里产生了sio_dout、SCK等信号,而sio_din在sck作用下变化,所以sio_din与FPGA时钟是有一定关系的。
可以认真看时序图,在FPGA对sio_din有采样时刻,时序已经要求sio_din要稳定不变的,所以可以不用做同化处理。
【问题8.33】请问工程中使用了PLL,在做时序约束时,generate clocks窗口显示没有PLL产生的时钟,如下图,为什么? 答:PLL、MMCM等产生的时钟,默认是由工具自动推导约束的,不用用户来约束。虽然用户没有约束,事实上是做了分析的。例如下图中, 可以看到c0_my_pll这个时钟。其中,c0_my_pll是工具自动命名的。 ![](http://www.mdy-edu.com/static/upload/image/20231025/1698222200231971.png)
用户也可以自己约束PLL/MMCM产生的时钟,方法如下图。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222201297903.png)
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222202893992.png) 按照方面方法,约束好,重新分析就可以了。
【问题8.34】问:如果使用的IP核内部代码出现了时序约束违例,该如何解决?答:IP核是由官方提供的代码,一般用户不能修改,如果该IP核出现违例,可以从以下方向入手:
1. 一般IP核是有指定的频率范围,可以从数据手册找到,请看是否满足了数据手册要求。
2. 如果频率正确,还会出现报错,可以检查时钟和复位管脚有没有正确使用,根据经验,这通常是引起问题的原因。
3. 尝试修改编译策略,重新综合看看。
【问题8.35】问:请问时序约束只是针对FPGA输入与输出端进行约束,而不是针对FPGA内部模块之间或者模块里面。这样理解是否正确?答:不是的,内部肯定也跟约束有关。
【问题8.36】问:老师,想问下时序约束,DDR4的uiclk需要时钟约束吗?
答:需要的,设置好时钟频率,周期就可以了,就是需要create clock就好了
【问题8.37】问:关于input delay的抖动解释。
答:需要理解的抖动,不是指一个波形的结果,是多个波形叠加的结果。假设说一个PWM波形,周期为10ns,理想情况下变高为2.5ns,变低在7.5ns。由于存在不确定延时情况,所以有时候变高在2.6ns,变低在7.6ns。有时候变高在2.4ns,变低在7.4ns。有时变高在2.3ns,变低在7.3ns。数个波形叠加,就看到了抖动的现象。
九、PCIE专题课
【问题9.1】 PCIE视频教程是否有讲简单的pio数据交互?
答:有此方面的内容。
【问题9.2】多少通道都可以吗?
答: 是的,都可以。 |
【问题9.3】为什么我得pcie板卡驱动识别为PCI standard RAM Controller而不是pci设备或者未知设备呢?
答:可能Windows自带的驱动也适配了卡,卸载驱动,然后用windriver生成驱动的安装。
【问题9.4】请问课程可以在VIVADO平台开发是吗?
答:不可以的。
【问题9.5】win10 可以安装windriver吗?
答:可以的,正常安装即可
十、就业班项目-光纤项目 【问题10.1】光纤项目主要是培训内容是哪些接口?
答:主要是培训DDR3/GTX接口(着重培训的是用户接口逻辑设计,也就是接口代码,而非单纯的IP核使用),本项目的工程也包括PCIE接口内容,但不会详细教授。
【问题10.2】GTX接口使用的是什么协议?
答:本项目是点对点通信,所以MDY使用GTX IP核后,封装了一层用户协议,这个用户协议是自定义的,参考了UDP协议的思想。
【问题10.3】光纤项目包含PCIE吗?
答:本项目的工程包括PCIE代码,但注意的是,虽然有PCIE代码,但文档资料以及教学内容都不包含此部分,即不教授PCIE的内容。如果需要PCIE的学习内容,可以参考MDY的PCIE教程(注意,PCIE教程与光纤项目是完全独立的,内容没有任何相关性)。
【问题10.4】光纤ip 核的输入时钟是156.25M hz,输出时钟是多少呢?
答:光纤的IP核,有一个从外部时钟芯片过来的时钟,本项目中使用的是156.25M。通过该时钟,IP核产生给“用户侧”的时钟gtx_tx_clk,频率为156.25M。同时,IP核会从LANE中恢复出接收时钟gtx_rx_clk,频率为156.25M。 注意,LANE那边是没有时钟线的。
【问题10.5】pcie(pcie_usr_clk) 用户侧的输出时钟是多少呢?
答:该时钟是150Hhz。
【问题10.6】ddr3(ui_clk )用户侧的输出时钟是多少呢?
答:该时钟是200M。
【问题10.7】光纤最大可以跑多少G?
答:单独从光纤接口来说,光纤接口最多可以跑10G。但如果是4条光纤都跑10G的话,总带宽是40G,PCIE则只能跑20G,即进来的数量多,送给PC的少,这样是不行的。
【问题10.8】现在这个光纤是跑2.5G 吗?是按16bit 数据乘以156.25Mhz 得来的吗?
答: 首先是项目需要2.5G的速率,所以光纤要跑2.5G。其次,根据2.5G,从而推算出你的用户侧时钟和数据位宽,位宽*时钟频率=2.5G。例如,位宽为1,则意味着用户侧时钟2.5G,这不现实。位宽为16位,则时钟频率是156.25M,这是比较正常的时钟;当然,你可以选位宽为32位,时钟频率则为78.125M,也是可以。
【问题10.9】课程说使用的是用户自定义的协议,难道不是使用aurora协议吗?
答:本项目的IP核,其内部是使用了aurora协议的,IP核已经实现了该协议的内容。这里所说的“自定义协议”,是指IP核之外,由用户定义的用户层协议。例如接收侧,用户从IP核收到数据后,这里数据的定义是什么,则由用户确定的。
【问题10.10】老师您好,高速光纤通信项目通过光纤接口进来的数据量是多大的?DDR中需要存放多少数据呢?
答:每路是2G左右
【问题10.11】每一路是2G,四路就是8G,那DDR可以放的了吗?
答:DDR是边存边读的,写满就丢弃。
【问题10.12】老师您好,高速光纤通信项目通过光纤接口进来的是什么数据,出去的又是什么数据呢?
答:项目背景是高速AD数据,出去的也是此数据。但其他我们不关心
【问题10.13】老师您好,想问一下光纤项目的光纤接口模块传输速率是多少,是怎么计算出来的?
答:请看问题11.7的答疑
【问题10.14】光纤通信项目代码是串口控制模块的,但是说明文档基本上没有讲解这一块,请问MDY有没有更详细的说明文档呢?
答:课程网盘还没有这方面内容,串口控制是基础内容。您需要了解哪些问题,可以在交流群里沟通。
【问题10.15】问:使用同步码(charisk)有没有使用规则,或者有没有注意事项,要注意什么?
答:一般通信两端的设备都是自己设计的话,那么同步码使用规则都是自定义的,只要能解出来就可以了。 本课程中有关于同步码使用的详细介绍,可以详细参考一下。
【问题10.16】光纤我请教个问题,xilinx的光纤我见charisk用的01,然后16bit的数据为xxbc,然后charisk用的00,然后16bit的数据为发送数据。altera的呢?两个对接怎么弄?
问题:不同平台下,光纤的charisk怎么通信?
解答:光纤的charisk,只要模式和标准对上都可以通信的,无论是Xilinx跟Xilinx对接,还是Xilinx跟Altera对接都可以,跟平台没关系。
【问题10.17】光纤项目里的学员笔记,是用什么工具画的阿
答:VISIO画的
【问题10.18】老师好,做了4路GTX光纤通信,丢包比较严重,这种正常吗?发送10张图片,就有一个64bit数据丢了,是不是跟发送comma的频率有关系嘛? 没有看到哪里讲这个comma应该每隔多少时间发送一次,我现在是空闲时256个时钟发送一次,发送数据时是4000个周期发送一次。项目采用的是GTX 10G Aurora8/10B
答:这个也有可能是硬件有问题,你使用ibert测试,排除硬件问题
【问题10.19】问:光纤项目中,GTX是使用的哪个IP核?
答:使用的是“7 Series FPGAs Transceviers”IP核。
【问题10.20】问:整体流程用了k7多少资源?
答:没有数据
【问题10.21】问:光口传输的是tcp ip协议数据包吗?
答:使用的udp协议
十一、就业班项目-精密仪器项目(JESD204B) 【问题11.1】JESD204B专题课有交流群吗?答:购买此课后,均加入MDY的专题课交流群。
【问题11.2】交流群会解答哪方面的内容?
答: 购买此课程的同学,需要有一定的FPGA基础,如一定的设计能力、验证能力和调试能力。本课程的交流群,将不会详细解答基础问题,例如VERILOG语法;自己修改的代码,如果出错,请自行定位。对于协议、架构等,如有问题,MDY都会详细解答。
【问题11.3】FPGA的JESD204B参考文档是PG066吗?
答:是的。
【问题11.4】 AD9144的同步信号已经拉高了,这说明已经配置成功了?
答:要使用AD9144成功,可以依次检查以下AD9144的几个寄存器。 地址OX470:该寄存器用于表示LANE有没有检测到K28.5同步字。如果说FPGA管脚配置错误、时钟有问题、LANE速率有问题(例如双方配置的LANE速率不同,一端为2G,另一端为2.5G;或者信号质量不高,传输有误码等),则读到的值将不正确。 地址OX471:检查是否所有的LANE都已经同步。如果地址0X470正确,本寄存器不正确,则可能是速率、时钟有问题。 地址OX472:检查checksum,即校验和是否正确。如果说FPGA和AD9144的参数不同,或者是传递有错误,则此寄存器值不正确。 地址OX473: 检查ILAS。如果说此正确,基本上都正确了。
【问题11.5】顶层模块jest204b_test中,下面的代码是什么含义?
答: 本工程有一个功能,通过按下按键,可以改变信号的频率。工程一共支持6种频率,cnt1值为0~5,分别用来表示6种频率。上面代码中的cnt0控制频率的,其是通过控制同一值重复的次数来达到控制频率的目的,例如假设某信号值为01234为100M信号频率,让每个点重复一次,即0011223344,信号频率就变为50M。cnt0的值根据cnt1来改变,例如当cnt1为0时,cnt0的值为0~31,当cnt1为1时,cnt0的值为0~15,当cnt2为2时,cnt0的值为0~7。
【问题11.6】如果要实现与工程中不同的分辨率和不同的采样率(即输出波形的频率不同、分辨率不同),要怎么做?答: 如果要改变波形的频率,需要涉及到整个系统不同参数的调整,包括用于通信的lane的个数、时钟频率、IP核的寄存器配置和AD9144的寄存器配置等等。具体可以参考视频中,具体应该按下图的步骤来分析:
上图中,依次是确定需求,即您希望的信号频率、采样率DAC个数分别是多少,然后据此确定需要多少条LANE;进而确定AD9144的配置;lane的,速率;sample时钟等等。本课程有对应的视频讲解,可以详细理解。请理解视频中介绍的思想,从而应用到您自己的项目中。实用建议:建议您在我们提供的案例基础上,每次改动一点点,看到正确效果后,再做下一下,最终完成最终的目标。
【问题11.7】案例中,插值为2的意义?为什么要插值?答:插值,顾名思义,就是在两个数据中间自动插入数据。例如要产生一个波形012345,不插值的情况下,FPGA必须要发送数据012345这几个 数据给AD9144;而在插值为2时,FPGA只需要发送0246数据,然后AD9144自动补充135。本案例中,为什么要使用插值为2,是假设的一种需求情况。
【问题11.8】在文档《JESD204B协议》中,第52页的下面两个图,为什么这两者的CF不一致?CS又是什么?
答:CS是指一个SAMPLE中的控制位比特数,上面两种情况,每个SAMPLE都加了2位的控制比特,即图中的C1和C0。 注意,图中的“Cr0:3[C1:C0]”,是指Cr0的[C1:C0]+Cr1的[C1:C0]+Cr2的[C1:C0]+Cr3的[C1:C0]。CF是指一个FRAME CLK中的控制字个数,单位为字节。注意,这里的CF的限定条件是一个“FRAME CLK”。一个FRAME CLK,即上图中的一列数据。 从第一个图可以看出,第一列控制字是Cr0:3[C1:C0],共8比特,所以为CF=1。 从第二个图可以看出,第一列控制字是Cr0:3[C1:C0]和Cr8:11[C1:C0],一列共有16比特,所以CF=2
【问题11.9】在讲解需求时,下面的16是什么含义? ![](http://www.mdy-edu.com/static/upload/image/20231025/1698222306181127.png)
答:这里的16,是我们假设一个正弦波由16个采样点组成,所以由信号频率*16=采样频率。当然,这里的16假设值,当您的正弦波是由32或者64,或者更大数组成时,当然就不同。我们这里是先确定需求。
【问题11.10】204b配置完了才正常工作还是不配置也能工作,配置完之后会改变工作方式?
答:都是需要配置完才能正常工作的。
【问题11.11】是否应该补充IP核的配置,为什么要那样配?
答:
1. 关于各个参数,如CS F M N等参数,在讲解确定需求的视频中,已经逐个分析出来。总的来说,是看AD9144文档,看MODE后,根据MODE所推荐的参数来配置。
2. 得到上面参数后,请阅读一下FPGA IP核的寄存器手册,很简单的,基本上是各个参数配上去就行了。
3. 配置代码,可以看代码解释视频,后面补充了。
【问题11.12】204b配置文件里面有一个寄存器有疑惑,手册里面写的最小是1,但coe配置成0 。
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222307128111.png)
答:寄存器中,“parameter range 1-256”,是指F这个参数的范围是1-256。但后面有描述,此寄存值的值 = F-1,所以才填为0。这里描述有些歧义,但可以用这种方法排除:假设寄存器是1-256,那该寄存器是8位的,无法表示256,矛盾。
【问题11.13】在AD9144的0X308~0X30B这几个寄存器,是用来选择serdin和lan的关系的,这是如何对应的?答:下面是这几个寄存器的相关描述。
首先,明确概念,SERDIN0~7指的是AD9144芯片上定义的管脚,是物理的,可以去看管脚图。LANE0~7,是指内部表示的LANE编号。 估计是为了灵活性,LANE0~7不是与SDRDIN0~7不是一个一个对应的,其对应关系是可以配置的,上面几个寄存器就是起这种作用。 例如,LANE0可以与SERDIN0对应,这个时候的0X308[2:0]=0,也可以和SERDIN4对应起来,这个时候0X308[2:0]=4。 其次,理解了上面关系后。你可以根据实际情况来配置,例如,本案例中的AD9144子板,它的SERDIN0~3是没有用的,只使用了SERDIN4~7,这是 固定死的。然后内部的配置,您可以使用LANE4~7来对应SERDIN4~7,也可以使用LANE0~3来对应SERDIN4~7,这由您来决定,都是可以实现的。 最后,再强调一下工程思维:芯片提供了很多功能,您用也可以,不用也可以,您会怎么做?你就选择最简单的来做,甚至就是忽视它存在,也就是使用默认值。
【问题11.14】JESD204B课程里包括AD和DA吗?还是只是其中一个?
答:本课程只包括AD部分,并且是以AD9144为例来说明。注意不同AD和DA芯片,其使用方法都是不同的。本课程只讲述一般思路,需要学员举一反三使用。
【问题11.15】要得到16个点,插2,所以实际传8个点;学习笔记里面生成的正弦波,由于插2了,实际是32个点,这么理解对么?
答:在DA输出端如果16个点组成一个正弦波,插值为2的情况下,FPGA只需要传输8个点/正弦波。如果FPGA传输16个点/正弦波,插值为2的情况下,DA输出端实际是32个点/正弦波。
【问题11.16】为什么v5版本是6.4Glane速率,而v7就是3.2Glane速率了,都是10~40M的正弦波啊?
答:LANE的速率,可以大于等于“需要的速率”,只要能保证传输即可。
【问题11.17】专题课实现的最高采样率是多少?答:专题课里有多个工程案例,实现的最高采样率是1Gbps。理论上,AD9144是可以实现2.8G的,但课程没有提供。
【问题11.19】用户用破解的Vivado能不能使用 JESD204B的Ip?答:可以使用。但注意,JESD204B的IP是临时licensing,具体请看问题11.19。
【问题11.20】案例中的AXI时钟必须是100M吗?答:不一定,满足范围即可。在设置IP核时,有提示范围的。
【问题11.22】204B的每个时钟发送的4个采样点,是输出波形里紧挨着的4个点吗?还有9144输出波形周期是如何控制的?怎样算发送完了一个完整波形的数据?
答:这个可以看txdata的视频讲解。
【问题11.23】204B的教程目前只有发送的,没有做接收的吗?
答:我们课程是只有发送的,没有接收的,不过接收方向的可以参考。
【问题11.24】使用204B的IP,为什么需要用到204B_PHY,是为了链接网络口吗,那如果不连接网络口,是否就不需要使用204B_PHY这个IP了,只用204b的IP一个就够了?
答:PHY只是接口传输作用,如果没有接口的话,那自然可以不用。目前没看到有这种使用场景。
【问题11.25】关于时钟计算,那个R是如何得到的?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222308168131.png)
答:R值只要是整数都是可以的。所以这个时钟也可以等于Multiframe时钟,也是可以的。不用设置寄存器。
【问题11.26】请问一下jesd课程的参考工程中:v7与与其他版本的不同是没有拆除9144子板的cpu。
请问这里的拆除具体指的是什么?难道v3v4v5不能直接把9144fmc插到k7上就能用?要另外做什么硬件准备吗?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222309197693.jpg)
答:按照V7去做硬件即可。前面拆除是因为我们做项目时,就拿到一个拆除的硬件。
【问题11.27】204b,通过lane传输的时候,fpga不用单独给DAC提供时钟,而是通过CDR从lane数据线中恢复出时钟,这样理解对吗?那还有output delay吗?
答:是可以这样理解,没有output delay的。
【问题11.29】老师,204b的input delay是SYSREF吗?这个是怎么处理的。
答:本项目不需要时序约束,您描述的问题点也不清晰。
【问题11.30】204b是不是不能通过示波器抓取,那有什么方式知道lane的速率是2.5G?答:配台高级示波器,或者使用IBRT测试,具体的方法请百度。
【问题11.31】如果我这里有两个9144芯片,他们之间如何同步呢?
答:
1. 时钟同步,采用同一个时钟芯片,由这个时钟芯片产生多路时钟给这些AD9144,由于时钟源是相同的,所以时钟都是一样的。这样可以保证时钟的同步。
2. 由于都是一个FPGA发数据,按照JESD204B排列数据分配给各条LANE,这样就可以了。
【问题11.32】JESD课程是用Veriiog代码实现还是用XILINX的IP核?
答:该课程使用了IP核来实现
【问题11.33】是否包含有高速AD/DA的项目?最高速率是多少?有多少路?
答:激光工程项目中,包含有高速ADC AD9684,速率是500M,目前是支持一路的实现。精密仪器项目中,包含有高速的DAC AD9144,目前实现的最高速率是1G,支持2路输出。
【问题11.34】精密仪器项目中,AD9144的AD测量范围,DA输出的范围,以及采样率分别是多少?答:AD9144是一款DAC芯片,所以没有AD测量范围。DA采样率我们实现的是1G,实质可达1.8G。DA输出范围以及更多信息,请参考以下数据手册。
【问题11.35】JESD204B课程中,是那种并口高速adc用的那种协议么?答:不是高速并行口,而是高速串行口,即SERDES接口来实现,单根线的速率可达到10G。
【问题11.36】就业班企业项目里视频拼接MIPI项目有用到IP核吗?需要额外交IP核费用吗?答:MIPI项目是用的lattice芯片,lattice的此IP是免费的,学习此项目无需额外缴费。
【问题11.37】申请JESD的临时License提示不符合出口规定,有没有什么其它办法?答:换了个企业邮箱账号就行了
【问题11.38】一,首先我得读9156寄存器,二,我的读9154{我自己的dac}三,用 dpg..现在dpg软件驶不了,麻烦解答一下答:我们提供的例程,已集成在工程里面的,全部代码是FPGA代码。
【问题11.39】请问9144用的是mose0,配置完后,CGS可以过,可以读到寄存器470是FF,8个lane都收到了k28.5,但是寄存器023的bit1一直在01之间不停的跳动,代表FIFO的读写一直有错误,查看30c和30d也能看到错误标记,此时发送sysref的话,ILAS也能过,但是470,471,472,473都在不停的跳动,sync标记也是忽高忽低,此时链路不稳定,给tx核送数据,在频谱仪上能看到9144的输出,但是因为链路不稳定,输出会不停的闪烁,理论上讲,链路稳定的话,470.471.472.473都应该回读FF才对,我想请教一下,是什么导致了9144配置完后fifo的读写标记一直报错呢?也就是寄存器023的bit 1
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222310261808.jpg)
答:如果是自己做的硬件板,则有可能是硬件的稳定性问题。请检查硬件电路。
【问题11.40】请教一个问题,204b时序不行。12.5g,312.5M的核时钟。一个dac时序违例不严重能工作,另一个不行,怎么处理答:解决时序违例,其思路是减少组合电路逻辑。如果确实无法减小,那就只能降低时钟频率了。您使用的315.5M是工作时钟的话,那确实是太高了,建议可以将工作时钟降为156.25M
【问题11.41】请问按键是有4位., 但代码中只使用了0位和1位, 这按键有没有顺序要求, 先按哪个再按哪个? 然后这个这个按键信号作为使能信号, 是只持续一个时钟, 还是需要一直为高?答:先按启动有效的按键,再按改变频率的按键,具体请看使用说明。
【问题11.42】请问在给JESD204C IP核配置的时候,读取0x020 RESET寄存器的值,读到的值是0x081,说明这个IP一直处于复位状态,无法从复位状态退出,可能是什么问题呢?
答:检查一下所有的时钟和复位信号,一般都是跟这些信号有关
【问题11.43】请问FPGA中的204B IP核,其配置是在哪里定义?答:JESD204B的IP核配置,其地址在addr.coe文件中定义;其寄存器值在data.coe文件中定义。
【问题11.44】device clock是什么意思?
答:可以认为是AD9516给FPGA的一个多帧时钟,用于同步多帧的,可以认为D个多帧就发一个上升沿,这样就好同步了。具体有一个视频,可以看JESD204B协议04_实践_协议各个时钟的关系。
【问题11.45】:课程提供的上位机软件是直接和dac连接用于检测dac里寄存器的值吗?还是dac通过传数据到fpga通过fpga连接呢?
答:
做法1:上位机将寄存器配置值写到FPGA,FPGA再写到DAC里。
做法2:FPGA内部有配置表,上电后自动配置DAC的寄存器。 以上两种方法都有。
【问题11.46】:如果是通过fpga连接的,是走的uart还是ethernet呢?
答:走的是网口。
【问题11.47】:vc707可不可以兼容我们的程序?
答:只要有HPC接口的,均支持
【问题11.48】:是不是地址8的ILA support设为1就代表在CGS之后开启ILAS的功能?答:该地址设为1,表示启动ILA功能,设为0表示不启用。
【问题11.49】:地址20的ILA multiframe是选择ILAS一共发送几组8位数据?我们设为3就代表发送4组8位数据?
答:这里不是以8位数据为音位,而是multiframe为单位。所以设为3,表示发送4个多帧数据。
【问题11.50】:地址2060和2072的ILA config data 3 和 6 功能似乎是Sets the values to be transmitted in the ILA sequence for all lanes. 这两个寄存器是用于设置ILAS发送的数据吗?
两个寄存器都是0那发送的ILAS是全0,还是某个默认值?我看到网上有说是k28.0到k28.4顺序发送的,但我看我的一个TI的dac好像默认是0x1C也就是K28.0答:这里是设置需要的L、BID、LID和DID等参数。从字面上理解,发送方向就会把这些数据当成ILA数据发给对端。按真实要求配置即可。设了什么值,就会打包成对应数据发送给对端。至于如何打包,我这还没有研究。
【问题11.51】:multiframe包含几个frame?答:这个每个工程不同,是可以灵活设计的参数,并且是与时钟频率、其他参数相关联的。
【问题11.52】:BID这些参数具体就要从DAC那边找到对应的然后两边匹配就可以了,是吗?答:BID DID 这些,两边匹配即可。
【问题11.53】麻烦问一下这个sin_data数据是怎么来的?自己造的数据吗?
![](http://www.mdy-edu.com/static/upload/image/20231025/1698222310147528.png)
答:sin_data是正弦波的数据,该正弦波数据用matlab产生,模块这里是转化成verilog语言后的。
【问题11.54】减得那个8'h80是什么意思呢?为什么要减那个8'h80呢?
答:如图红色波形所示,该正弦波数据用8bit位宽表示,0~8'hff是它的幅度值范围,中间的幅度值为8'h7f。 而在工程需求里,接口要求输出的正弦波数据为补码形式,那么正弦波的补码波形如图蓝色波形所示, 补码表示的最高点数值为8'h7f,最低点数值8'h80。对于数值8'h80+1=8'h01,8'h80-1=8'h7f,那么将正弦波数据sin_data-8'h80得到的就是如图蓝色的波形数据,也是一个补码的数据。
【问题11.55】问题:请问jesd204 phy能选择具体某一个quad吗?具体如何选?
答:JESD204 PHY是可以选择QUAD的,在IP核界面里可以选择使用哪个,具体可以教程里的视频
【问题11.56】JESD204B课程是ADC采样,还是DAC采样?(模数转换是ADC,数模转换是DAC)
答:是DAC采样
【问题11.57】Jesd204B那个项目里的以太网通信是不是没有调用MAC ip核,自己写的答:是的。该代码没有调用IP核,纯RTL实现,模块名为gmii
【问题11.58】fmcAD9144模块从jp2送入AD9516的时钟信号需要多大幅值的?1.8V够吗?答:一般JP2的时钟幅值为1.5V。1.8V也是可以的
【问题11.59】问:我JESD204B ADC接受的数据全是0咋回事?
答:
1.确认接收到了数据?
2.基于1后,再确认是 0
【问题11.60】问:这个sysref信号必须由外部提供吗?我们板子没有这个信号,能不能用device clk这个信号分频得到? 答;这里的核心思想是:
1.时钟要稳定;
2. 两边都是完全同频同步的时钟
【问题11.61】问:老师我想问一下jesd项目里的9516和9144的配置视频里讲的是通过ACE工具和上位机软件配置的,那vivado程序中又有配置模块,这是怎么回事?
答:前期工程是由上位机配置的,后面提供的工程 由内部模块配置的
明德扬除了培训学习还有项目承接业务,擅长的项目主要包括的方向有以下几个方面: 1. MIPI视频拼接
2. SLVS-EC转MIPI接口(IMX472 IMX492)
3. PCIE采集系统
4. 图像项目
5. 高速多通道ADDA系统
6. 基于FPGA板卡研发
7. 多通道高灵敏电荷放大器
8. 射频前端
|