返回该小组首页 回复主题
songchao01

songchao01

小组等级:     E币:345  (E币换礼)

#1楼主:(求教) FPGA设计达人看过来!!

文章发表于:2008-07-07 09:43

最近遇到一个问题,同一个模块,将其单独作为一个工程下到FPGA片子里头工作正常,可是将其整合到一个大工程中再下进去工作就不行了呢。我的FPGA芯片选的是Stratix Ⅱ,资源很充足的,顶层例化连接都没问题,可以排除。我在想,是不是有可能FPGA布局布线改变了导致这种情况发生呢?

 

代码如下:

always @(posedge sys_clk2x or negedge sys_rst_n)

       if(!sys_rst_n)

              begin

                     dqs_reg          <=   8'b0000_0000;

                     dqsn_reg <=   8'b1111_1111;

              end

       else if(dqs_en)

              begin

                     dqs_reg[0]      <=   !dqs_reg[0];

                     dqs_reg[1]      <=   !dqs_reg[1];

                     dqsn_reg[0] <=      !dqsn_reg[0];

                     dqsn_reg[1] <=      !dqsn_reg[1];

              end

              else

                     begin

                            dqs_reg          <=   8'b0000_0000;

                            dqsn_reg <=   8'b1111_1111;

                     end

                    

 

 

assign     ddr2_dqs[1]=(dqs_en)?dqs_reg[1]:1'bz;

assign     ddr2_dqs[0]=(dqs_en)?dqs_reg[0]:1'bz;

assign     rd_dqs=ddr2_dqs;

assign     ddr2_dqs_n[0]=(dqs_en)?dqsn_reg[0]:1'bz;

assign     ddr2_dqs_n[1]=(dqs_en)?dqsn_reg[1]:1'bz;

assign     rd_dqs_n=ddr2_dqs_n;

目的是在dqs_en使能有效期间在ddr2_dqs[1]ddr2_dqs[0]ddr2_dqs_n[0]ddr2_dqs_n[1]信号上产生一个连续的脉冲群(ddr2_dqs,ddr2_dqs_n8位双向总线),为其单独建一个工程,下到片子里跑用Signaltap查看没问题,可是加到大工程里后,就只有两三个信号工作正常,不知道为什么?!!!

 

P.S.这段代码主要是为了产生DDR2芯片写数据时需要的data strobe信号,不知道我这样写是不是有什么问题,如果有哪位高人之前做过DDR2控制器的,还望不吝赐教!!!多谢!

 

还有另一种方法,单独下到片子里也能行,但是加到大工程里就不行了,代码如下:

assign     ddr2_dqs[1]=(dqs_en)?sys_clk:1'bz;

assign     ddr2_dqs[0]=(dqs_en)?sys_clk:1'bz;

assign     rd_dqs=ddr2_dqs;

assign     ddr2_dqs_n[1]=(dqs_en)?(~sys_clk):1'bz;

assign     ddr2_dqs_n[0]=(dqs_en)?(~sys_clk):1'bz;

assign     rd_dqs_n=ddr2_dqs_n;

之前觉得涉及到门控时钟了,再加上时钟频率比较高125MHz,所以就没敢采用这种方法,可是现在看来不一定是门控时钟的问题了….急煞我也!!!

 

riple

   小组等级:    E币:3100  (E币换礼)

#2

文章发表于:2008-07-07 22:32

没做过DDR2。看代码你是在做分频,然后用三态门输出。以下两个建议也许用得上:

1. 在两次编译的RTL视图中查看一下,看看是否是你要的电路,有没有寄存器被优化了。

2. 把两次编译的编译信息捋一遍,如果有优化的话,会有info或warning的。

 

还有一个不太高明的方法,能否把上面8位一组的信号拆成1bit来描述,然后再试一下。高6位看起来没什么作为啊。

songchao01

   小组等级:    E币:345  (E币换礼)

#3

文章发表于:2008-07-09 10:59

多谢riple,常去你的博客看文章,学到不少东西!
确实是在做分频,设想的是在使能信号有效的时间段里产生一个时钟的分频信号,可是总是不能正确实现,不知道原因在哪儿。高六位的地址线是为以后的应用保留的,目前这一调试阶段没用到...
还有问题要请教你一下:有两个模块通信,我采用的是同一个时钟,只不过一个是上升沿触发,另一个是下降沿触发。我原本是这样考虑的。第N个时钟的上升沿,模块A给出一个信号,模块B在第N个时钟的下降沿采样该信号。不知道这样是不是可行??时钟走的是全局时钟网络(弱弱的问一下,是不是在Quartus 2里用global 原语可以实现全局时钟?)
之前问过一个人,他说这样的设计很不稳定,最好用同一个时钟的上升沿,也就是说应该在第N个时钟上升沿A给信号,在第N+1个时钟上升沿B采样。是不是这样的呢??
我会参考你的建议的,再次感谢~!

riple

   小组等级:    E币:3100  (E币换礼)

#4

文章发表于:2008-07-09 13:07

上升沿、下降沿这种技巧在低速设计中可能有用,在高速设计中最好不用。

周期为T的时钟信号,如果像你描述的那样设计,理想情况下,其时序相当于采用周期为T/2的时钟信号的上升沿或下降沿。这样做相当于你提高了对电路的时序要求,如果你的电路不能运行在T/2这么快的时钟下,就会产生亚稳态,也就是电路不稳定。(非理想情况的一种是时钟占空比不为50%,你可以分析一下这样的时钟在同时使用其双边沿时会有哪些问题)。

所以还是像那位朋友给你建议的做为好。

songchao01

   小组等级:    E币:345  (E币换礼)

#5

文章发表于:2008-07-09 23:11

看来要彻底的改一下程序了...郁闷

今天试着改了一下,让两个相互通信的状态机都用同一个时钟的上升沿,结果状态机全乱套了,出现了好多未定义的状态,估计是握手信号考虑的不够周到吧,sigh

继续改咯

songchao01

   小组等级:    E币:345  (E币换礼)

#6

文章发表于:2008-07-09 23:26

还有一个问题,riple

如果,我把两个模块都改成上升沿触发,综合器会不会自动将模块A发给B的信号延迟一定的时间,以便模块B能够准确采样??

例如,我在源代码里头是利用上升沿对某个信号赋值,类似与下面的简单代码

always@(posedge sys_clk or negedge sys_rst_n)

   if(~sys_rst_n)

      signal_a<=1'b0;

 else

      signal_a<=1'b1;

可是从signal tap中看,模块A给出的signal_a与sys_clk的上升沿竟然差了半个时钟周期,刚好能被模块B的上升沿采到,不知道何解???是综合器实现的么?还是设计本身有问题??

多谢riple的耐心解答!!

riple

   小组等级:    E币:3100  (E币换礼)

#7

文章发表于:2008-07-10 13:00

这样的问题也曾经令我很困惑。

你可以思考这样一个问题:在移位寄存器(shift register)中是怎样实现相邻寄存器之间信号的可靠传递的?每一级寄存器的建立、保持时间是怎样得到保证的?Tco时间在这里起到了怎样的作用?

把这个问题想通了,你就能够理解同步设计的优势和对同步电路的基本时序要求了。

 

在你上面的描述中,可能没有考虑HDL语言综合后的物理效果,没有考虑到Tco时间,也就是sys_clk上升沿之后多久,对signal_a的赋值才会产生效果。Tco时间一定不能为0,而且还不会太小,如果太小,后级寄存器的保持时间就会被破坏。太大也不行,太大了,后级寄存器的建立时间就不能满足。这就是上面关于移位寄存器问题的一部分解答。

另外,你在SignalTap中看到的波形不是电路的真实行为,是被CLK采样后得到的波形。如果CLK的频率是sys_clk的二倍,再考虑到Tco不为0,你看到相差半个sys_clk周期就不奇怪了。

songchao01

   小组等级:    E币:345  (E币换礼)

#8

文章发表于:2008-07-11 10:29

我理解你说的移位寄存器Tco的问题了。困惑我的是,是不是只要采取同步设计,综合器就会自动考虑到Tco的问题,令其满足次级触发器的建立时间和保持时间??

感谢你关于SignalTap的解答!!如你所言,SignalTap的采样时钟CLK正好是sys_clk的2倍,我分析了一下,真的就是这样,学到了!!!

受益匪浅!!

songchao01

   小组等级:    E币:345  (E币换礼)

#9

文章发表于:2008-07-11 15:42

再问riple

在帖子最初的那个问题中,我在SignalTap中看到了 寄存器 在按照我设想的方式翻转,可是不知道为什么,寄存器的翻转就是传不到我定义的双向总线ddr2_dqs上去(具体现象见附图),我明明用assign语句将它们连接起来了呀,为什么ddr2_dqs上出现的脉冲就变窄了呢??

会是我双向总线的写法有问题么??百思不得其解啊

P.S.   SignalTap的采样时钟为500MHz,寄存器的翻转速率为125MHz(吸取了上面采样不准的教训...)

点击看大图

riple

   小组等级:    E币:3100  (E币换礼)

#10

文章发表于:2008-07-12 15:45

我试着把你上面的代码编译、仿真了一下。

module try (sys_clk2x,sys_rst_n,dqs_en,ddr2_dqs,ddr2_dqs_n,rd_dqs,rd_dqs_n);

input sys_clk2x, sys_rst_n;
input dqs_en;
output [1:0] ddr2_dqs, ddr2_dqs_n;
output [1:0] rd_dqs, rd_dqs_n;

reg [7:0] dqs_reg, dqsn_reg;

always @(posedge sys_clk2x or negedge sys_rst_n)
 if(!sys_rst_n)
 begin
  dqs_reg          <=   8'b0000_0000;
  dqsn_reg <=   8'b1111_1111;
 end
 else if(dqs_en)
 begin
  dqs_reg[0]      <=   !dqs_reg[0];
  dqs_reg[1]      <=   !dqs_reg[1];
  dqsn_reg[0] <=      !dqsn_reg[0];
  dqsn_reg[1] <=      !dqsn_reg[1];
 end
 else
 begin
  dqs_reg          <=   8'b0000_0000;
  dqsn_reg <=   8'b1111_1111;
 end

assign     ddr2_dqs[1]=(dqs_en)?dqs_reg[1]:1'bz;
assign     ddr2_dqs[0]=(dqs_en)?dqs_reg[0]:1'bz;
assign     rd_dqs=ddr2_dqs;
assign     ddr2_dqs_n[0]=(dqs_en)?dqsn_reg[0]:1'bz;
assign     ddr2_dqs_n[1]=(dqs_en)?dqsn_reg[1]:1'bz;
assign     rd_dqs_n=ddr2_dqs_n;

endmodule

仿真结果如下:

点击看大图

我依次采用了Cyclone II 和 Cyclone III器件进行了全编译,检查了RTL视图和Chip Editor视图,结果都正常。从上面的时序仿真看来,也符合你的设计初衷。

 

给你提两个建议:

1. 检查一下这些三态信号是否直接驱动输出,有没有再次经过其他逻辑。我上面的仿真是直接驱动输出的。有可能是后面的逻辑影响了你的三态信号。不要在内部使用三态,三态只能直接驱动引脚。

2. 检查一下你的外部电路,是否存在总线冲突。必要时用示波器观察一下这几个信号。SignalTap II是有局限的,反映不了模拟信号的真实情况。如果发生了总线冲突,那么你驱动的电平就会很缓慢地上升至高电平,在示波器上看会是很缓的一条曲线,甚至有阶跃;在SignalTap II上看就会是你现在的样子,高电平时间太短。

songchao01

   小组等级:    E币:345  (E币换礼)

#11

文章发表于:2008-07-12 20:09

再次感谢riple的耐心解答,学到了很多东西!!

我把这一部分单独拿出来下到Stiatix2里,然后用SignalTap看,是没问题的。可是将其添加到一个工程里头以后,问题出现了。偶尔功能正常(此时只要不改变设计&不重新编译,下多少次都是正常的),大多数情况下功能不正常。

1.三态门的双向总线那端,我直接连到了FPGA的 I/O 管脚,用来驱动DDR2,应该不是在内部使用吧??此外,我用SignalTap采样这个双向信号,会是SignalTap的逻辑电路影响了这个信号么??

2.刚才用示波器抓了一下这路信号,发现真的像你说的那样,信号高电平上升时间很长,而且有很大的抖动。可是我仔细排查了一下,并没有总线冲突的情况出现...还会有别的原因导致这个问题么??

2【下一页】总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

设计资源与分销