admin 管理员组

文章数量: 887021


2023年12月21日发(作者:尚硅谷培训价目表)

FPGA 学习中的FAQ

1、在top层文件中包含多个例化的module,在top层与module之间传递参数时,所有参数设置成了reg形式,Synplify编译时提示ERROR :“Expecting wire for output

connection ”

解决:在module之间传递的参数一般设置为wire型变量。

2、在mealy型状态机的设计中,当要求未提到的状态保持上次输出不变时,使用组合逻辑设计输出等于输出,编译结果产生锁存器。

解决:mealy型状态机可以考虑采用三段方式描述,这样在最后输出端采用同步设计的话,很容易实现保持输出不变。

3、在异步fifo的设计过程中,如何判断异常情况情况(读溢出和写溢出)进行复位,最初的方法是进行地址判断,但设计中采用了异步两级同步的方法,这样我就不知道当前的地址与我同步后地址之间的关系,

有可能相同 (-----没有地址操作),相差一个(同步过程中进行了一次地址操作),相解决:在空或满有效的信号的开始时刻对进行读写次数进行计数,到达一定数目(即我们的预留门限)时,复位。

syntax error, unexpected "||"”

解决:if((nums >200)||(nums < 300))

5、if (address = 8’h21) 编译出错

解决:if

(address == 8’h21)一定要用“==”

6、在Altera的2 PORTs RAM的使能信号中,wr和rd有效电平是什么?

PDF 文件使用 "pdfFactory Pro" 试用版本创建 4、 if(nums >200)||(nums < 300) 把这样的语句作为判断条件,编译器报错 “near "||":

差两个(同步过程中进行了两次地址操作),这样设计地址状态就无法准确判断。

解决:wr

和 rd

的有效电平为都为高电平

7、在写testcase时在写时钟的上升沿和读时钟的下降沿碰巧在一起,程序中在这两个边沿同时对一个变量进行赋值,这时就冲突了。

解决:重新设计时钟,如果一定会重合的话,在一个时钟下对变量修改,或设置两个变量分别在两个边沿下赋值。

7、Modelsim对Altera器件仿真时,必须加入什么样的altera的库文件,

解决:必须加的文件有220model.v,altera_mf.v,再根据器件的不同选择**_atom.v文件

8、TTL电平和CMOS电平标准

解决:5 V TTL

:高电平 >2.4V ,

低电平<0.4V

CMOS :

高电平>0.9Vdd ,低电平<0.1Vdd

9、数据输入100Mbps,数据位宽为8位,时钟为19M,100M/8=12.5M,要采样时钟需要大于25M,当输入时钟不符合,原因是?

来达到100M

10、在可综合设计里面,过程语句使用“=”赋值,在synplify中会提示warning

语句,一般都采用“<=”非阻塞式赋值,“=”阻塞式赋值一般仅用在assign语句中,尽量避免在时序语句中。

11、在GFP-F的以太网数据接收过程中,以以太网包中的length字节(2个字节)作为计算GFP-F帧头PLI的依据。有可能出现问题:比如在length位置标注的是length/type这样把它作为长度就不行了,而且造成GFP-F对以太网数据的关联性太强。所以这种方PDF 文件使用 "pdfFactory Pro" 试用版本创建

解决:一般在可综合设计里面,比如always(posedge clk)这样带有时钟的同步设计解决:原因在于数据输入不是连续的,有时会停止,这样整体高速率155.52M慢了下

法不可取。

12、在考虑以太网数据接收的异常情况时,首先考虑到的是传输过来的以太网包数据之否正确,这样想法是不对的,因为“网线=》 PHY =》 MAC =》 GFP =》SDH”的过程中,MAC已经做了这个工作。

PHY:物理层处理,起到解码解扰,

MAC层:对以太网包数据解析计算受损性,对不同长度和类型的包进行计数.

13、CRC校验问题:如何实现并行数据校验?

解答:把串行校验数据的规律找到,通过组合逻辑电路循环实现。,注意组合逻辑电路中的反馈,有限的组合逻辑反馈可以,无限的组合逻辑反馈就不行了,把无限的组合逻辑反馈转换为有限的反馈方法是把组合逻辑的状态数据通过同步寄存器打一拍,再将结果反馈给组合逻辑。

14、在GFP-F项目设计中碰到的问题:

(1)GFP数据的长度是多少?

(2)GFP数据的速率为100M,对么?

解决:不对,MAC的有效数据为100Mbps,但在形成GFP过程中加进了PLI和cHEC, (3)在SDH中使用fifo,认为不会满的理由是SDH净荷的发送速率为149M,而GFP的速率为118M,这样就要发送IDLE帧,这就是为什么发IDLE帧。

解决:这种想法只考虑了GFP数据不会使fifo变满,但在GFP无效时每个时钟下都空闲帧发送,速率为152M高于净荷发送的149M,从而造成fifo的溢出,所以考虑在fifo中设计半空半满的指示状态,控制在GFP无效时,停止发送空闲帧,fifo中的可发送字PDF 文件使用 "pdfFactory Pro" 试用版本创建 和TYPE和tHEC,可能还有FCS,这样GFP的速率就有所提高,大概118M左右。

解决:因为PLI是两个字节,所以最大长度为65536字节。

节数就会减少。

(4)阻塞式赋值什么时候会被优化?

解决:如 a[1]=a[2];

a[3]=a[1].

这样的语句就要被优化掉。但如果是

a[1]= a[2];

a[2]= a[3]

这样就不会被优化掉。

(5)SDH下的STM-1帧格式,净荷数据是怎样安排的,下一帧数据又怎么衔接上去?

解决:SDH帧内的GFP数据是在POH后一个字界接着一个字节,发送每行发送260个字节(270-10),发送完成后,如果有GFP则继续发送数据,以260个字节为一块,于前端SOH,POH无关,等当没有GFP数据时,用空闲帧补充。

(6)接收MAC帧数据的异常情况

a. sop 和 eop同时出现

b. sop下一个没有eop还是一个sop

d. 在sop或eop出现的时候 val为低,显示无效数据

e.在sop之前eop之后出现val为高有效,显示有效数据。

(7)在方案的制定中,我想到了把接收缓存区中准备好的MAC内容一次性发送给GFP包封模块缓存,再由该缓存一个字节一个字节发送给扰码模块。两个缓存采用reg[7:0]结构构成,在实现上采用如下程序

PDF 文件使用 "pdfFactory Pro" 试用版本创建 c. eop 后面没有sop还是一个eop

解决:在时钟正常的前提下,主要考虑sop,eop,val信号之间的关系,如

reg[7:0] MAC[16383:0]; //设定MAC接收缓存区

reg[7:0] GFP[32767:0]; //设定GFP帧数据缓存区

for(i=0;i

GFP[i] = MAC[i]; //一次性把数据从MAC赋值到GFP中

解决:首先这样设计存在冗余,从MAC缓存区中读出来整块数据一次性放到GFP包封里面再一个字节一个字节的发送,不如在MAC里面直接处理,再一个字节一个字节的发送。这样还可以省掉大的GFP RAM。其次设计中采用reg做ram,实际使用LUT或Slice实现的分布式RAM,这样一次性赋值带来的难度很大,会最大产生9604*8的直接连线赋值,而且业界很少在时序的过程语句中使用for语句,值得注意!!

(8)在设计中如果输入的数据条件(sop,eop,val)出错,那么就要对MAC_Fifo模块进行地址回滚到上次帧结束的地方,防止错误帧数据发送出去。

解决:对每次的完整帧存入MAC_Fifo模块结束,对当前的地址进行缓存,以备回滚需要。缓存地址很重要做2个备份,判断备份地址之间的关系决定写入当前备份还是系(9)MAC数据存在MAC_fifo中,PLI、cHEC、type、tHEC存在Mux的fifo中,这样发现MAC_fifo为非空时,在Mux的fifo中提取四个字节,得到长度再发送出去,在根应呢?

过程中发生异常的麻烦处理(因为异常较难发现或要再次计算来做对比)。至于MAC_fifo的内容和Mux中的fifo内容如何对应起来,我们采用MAC_fifo数据夹带标志位(比如

fifo_in[9:0] <= {a[7:0],sop,eop}),根据Mux_fifo中的数据长度在起点和终点判PDF 文件使用 "pdfFactory Pro" 试用版本创建 据长度发送MAC_fifo中的数据,问题是怎样保证PLI字节数和MAC_fifo中的数据能对解决:这样的方案有些问题,两个HEC项和type完全可以在后端计算,这样还省去统全局复位。

断标志位,来确定是否统一,不统一则要全局复位。

(10)在always语句中采用如下写法:

always(posedge clk)

begin

a<= b;

if (a == b) //这时a,b会相等么?

end

解决:有可能不相等,因为时钟上差一拍。

(11)testbench中的配置文件都有什么作用?

解决:配置内容可以是DUT的CPU接口内容,也可以是simulation的激励内容。

(12)在使用`include文件时,注意“”中的文件名位置上下层文件之间用“/”并不是windows下的“”。

(13)端口命名方式:采用(a,b,)名字对齐的方式

齐,信号造成混乱。

(14)在编写状态机的时候尽量按照模型的方式去编写,便于synplify软件综合分析。

就直接使能。这样就产生问题,如fifo数据已发出,但SDH正处于发段开销的状态。

解决:控制fifo_rd的发送,计算fifo发送数据时序,与SDH的计数同步,提前判断段开销的发送时刻。

(16)观察波形ctrl_send模块给扰码模块的数据发送与空闲帧数据冲突

解决:重新计算时序,在fifo取数据时序上计算错误。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 (15)在编写ctrl_send模块的时候,fifo_rd信号在MAC进程中只要MAC数据没取完 解决:建议使用(.clk(),.rst().....)的方式,这样比较清晰,上面的万一对不

(17)空闲帧发送时如果遇到发SDH段开销的时候,会丢失空闲帧的完整性。

解决:建立标志位,在发送时随时判断段开销发送是否开始,如果开始则停止发送,等待段开销发送结束。

(18)做CRC校验的时候,cHEC,tHEC开始的时候设计为数据有效就一直计算,而且校验值累计,但考虑系统重启,丢数据的情况,使得CRC数据无法做到一直连冠,所以crc校验应该对帧具有独特性,应该为当前帧有效,那么CRC的初值是0呢还是别的什么?

解决:在每个帧的发送过程中,cHEC,tHEC,FCS仅对当前帧有效,就是说只计算当前帧的内容,在新帧数据来临时变量初始化为全1,重新开始计算。

(19)在做scoreboard的时候,对SDH净荷存储区从上到下开始判断帧头,找到有效数据后,那么GFP净荷的数据是在当前地址上面呢还是下面呢?

解决:由于先接收到的存在低位地址,后接收到的在高位地址,所以一旦判别有效数据后,有效的数据在高位地址。

(20)在scoreboard做多帧数据解扰的时候,发现第一帧数据type等解扰正确,第解决:解扰时一定要注意顺序,要先从第一帧开始解,否则会出错。

(21)在scoreboard中分析接收到的GFP净荷数据,采取的方法是先建立一个比9600外的帧数据就丢失了。应该建立一个缓冲区,采用地址管理的方式,读地址和写地址。每个时钟沿读进来一个数据,就做一次判断。当遇到空闲帧时,读地址地址加4,有效帧时读地址+帧长,有效的跳过处理过的数据。

(22)break关键字能使用么?

PDF 文件使用 "pdfFactory Pro" 试用版本创建 +4大一倍的存储区,接收满之后就判断一次。

解决:这种判断方法可能会遇到存储区中有一个半帧,这样只判断出了第一帧,另二帧数据解扰就错误了。

解决:在systemverilog语法中可以。

(23)在做scoreboard测试的时候发现如果当一个帧快发完时发现还有一个帧有效待发,那么在程序还没完成的时候,新的帧发送请求就会收到,来不及处理,造成帧传输丢失。

解决:设定标志位,用于存储帧发送请求,在发送过程的最后一步判断这个标志位,决定有效的话,直接从PLI的内容开始发送,然后清掉标志位。

(24)

PDF 文件使用 "pdfFactory Pro" 试用版本创建


本文标签: 数据 发送 地址 设计 解决