打印

项目随笔: 虽有万千语,不知怎么去表白

[复制链接]
2588|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sahh|  楼主 | 2013-4-14 01:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
碰到问题了。一大堆问题,不知道怎么问起。

项目不复杂,Cyclone4C6,跑250MHz,综合之后,资源利用率不到10%,Timequest 检查,Fmax达315MHz。跑起来应该没问题。

加SignalTag,再综合,Timequest检查,Fmax 达275MHz,timing看来应该是没问题。

但是实际上,Timequest的波形显示,抓的数据有问题。无法证实是不是timequest抓数据的时候引入的问题。

例如:

always @ (posedge clk_250m or negedge RSTN) begin
      if (~RSTN) begin
            data_out <= 16'h0;
      end else begin
            data_out <= cnt[0] ? data_A : ( cnt[2] ? data_B : data_out );
      end
end

上面几个变量,cnt,data_A, data_B 都是被 clk_250m 同步过的。而timequest的时钟,正是这个clk_250m。

Timequest 抓到的结果,有时候data_out既不是data_A, 也不是data_B,而是由某些bit变掉了。

不期望有谁能很深入帮我解决,但是如果能有一些让我受到启发的建议,我会很感谢。

相关帖子

沙发
cuianbin| | 2013-4-14 09:53 | 只看该作者
本帖最后由 cuianbin 于 2013-4-14 09:59 编辑

data_out <= cnt[0] ? data_A : ( cnt[2] ? data_B : data_out );
上面觉得写的不合适。
改成这样: module(....);
             assign  select={cnt[2],cnt[0]};
            always @(posedge clk or negedge rst)
         if(!rst)
              data_out<=16'b0;
       else  case(select)
        2'b00:data_out<=data_out;
        2'b01: data_out<=data_b;
        2'b10: data_out<=data_A;
        2'b11: data_out<=data_A;
        endcase
endmodule

LZ 可以试一下。

使用特权

评论回复
板凳
ifpga| | 2013-4-14 20:24 | 只看该作者
用 case 可以降低延时
如果那几个信号都是同步过的不应该
检查一下看是不是约束的不完全
是不是有路径过不去,但是没有做约束

使用特权

评论回复
地板
liyshen| | 2013-4-15 14:14 | 只看该作者
这个可以跑这么快吗?有点怀疑!

使用特权

评论回复
5
Backkom80| | 2013-4-15 16:18 | 只看该作者
:D

使用特权

评论回复
6
sahh|  楼主 | 2013-4-15 19:19 | 只看该作者
谢谢楼上诸位。问题还没有解决。

上面的例子,更改代码风格也没有用。

问题是,上面的代码,只是错误的一个例子,还有一些其他地方,也会出现一些奇怪的现象。

如果要简单总结一下这些现象,就是,“抓出来的数据,本来不应该这样子的”

有朋友说过,频率太高了,signaltap抓不准。250MHz,我以前也确实没有用这么高的频率抓过。也许他的是经验之谈。

但是,令人郁闷的是,如果因为频率太高了抓不准,timing应该报错才是啊,现在的时序分析是通过了的~~

使用特权

评论回复
7
drentsi| | 2013-4-15 20:48 | 只看该作者
正常情况,时序通过,电路应该是可以正常工作的。
时序通过,数据有随机现象,以下几个原因:
1.电路板PCB布局问题,退耦电容太少
2.电源不稳定,FPGA动态电流是很大的,电源要有足够的余量
3.时钟源问题,抖动太太
4.温度太高,速度快,功耗大,温度就高

使用特权

评论回复
8
cxh_boy| | 2013-4-16 17:21 | 只看该作者
这种情况我也遇到过,抓出来的数据偶尔出现问题,但是实际运行正常!!

使用特权

评论回复
9
sleepybear| | 2013-4-17 10:00 | 只看该作者
基本没用过A家的器件,但是,我觉得你说时序报告没报错,是不是因为你的约束本身过于宽松?看看是不是把约束修改一下?

使用特权

评论回复
10
sahh|  楼主 | 2013-4-17 16:54 | 只看该作者
终于搞定了。原因有点蹊跷。

datain 的来源是16位的LVDS,clk_250m的来源是伴随datain 的 clock,也是LVDS格式的。lvds 进来后,变成单边信号datain_lvds,经过clk_250m 来latch,变成data_A和data_B。

之前clk_250m在数据变化的时候,去latch数据,后来在lvds来源那边更改了一下clk的边缘,相当于现在把clk_250m的时钟反相一下,就好了。

接下来的疑问就是,如果是lvds的数据与时钟的相位问题,那么,不管怎么样,不应该影响到data_A/data_B与dataout的关系的,也就是说,dataout 无论如何,应该是 data_A 或者 data_B的。

Anyway,先把这问题放一边,项目继续走。

使用特权

评论回复
11
sleepybear| | 2013-4-17 17:15 | 只看该作者
还是时钟与数据之间的相位关系没调整好,建立和保持时间不够吧。
建议还是花些时间下一些约束,否则将来很可能还会出问题。

使用特权

评论回复
12
zhang_2000| | 2013-4-17 21:54 | 只看该作者
input-delay  问题
内部约束没有问题   端口约束不到位

使用特权

评论回复
13
zengguangjun| | 2013-4-18 19:14 | 只看该作者
是否布线问题?

使用特权

评论回复
14
sahh|  楼主 | 2013-4-19 22:19 | 只看该作者
kaiseradler 发表于 2013-4-18 14:19
输入延时问题啊!呵呵,你stp采集到的data_A不代表就是外部输入时钟伴随的data_A,这个有可能采到边沿!自然 ...

data_A是经过latch之后的。

stp采集的过程timing如果有问题,按我的理解,它应该报错的,但是它没有。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

224

帖子

0

粉丝