Junker 发表于 2012-11-20 09:49:07

寻FPGA绝对高手,有偿寻求帮助

最近搞一个设计,其中用到了FPGA,遇到棘手问题,寻资深FPGA高手。技术要求和报酬,请留联系方式,随后我会主动联系后详谈。

dadatou 发表于 2012-11-20 09:52:02

什么问题?

Junker 发表于 2012-11-20 09:57:50

简单的讲主要是代码的稳定性问题,上SignelTap 问题就怎么都不出现了,抓不到问题出在什么地方

gwj221 发表于 2012-11-20 10:11:01

很正常的,时序问题!

wildone 发表于 2012-11-20 10:28:26

还没解决?

Junker 发表于 2012-11-20 10:42:55

wildone 发表于 2012-11-20 10:28 static/image/common/back.gif
还没解决?

是啊,有愿意出手的没,时序问题?但怎么解决呢?

Cliff 发表于 2012-11-20 11:51:38

我预言,楼主的问题不会有人接手 {:3_54:}

ab8780000 发表于 2012-11-20 12:24:09

这种问题关键是定位
首先时序要保证收敛吧
然后关注内部跨时钟域问题是否做好
还有就是输入输出时钟与数据对齐有没有做好约束

Junker 发表于 2012-11-20 13:25:42

Cliff 发表于 2012-11-20 11:51 static/image/common/back.gif
我预言,楼主的问题不会有人接手

说说你的理由,我觉得代码其实也没多复杂,高手重写一遍也要不了几天,我当初写好到调试还加一起也没一个星期。不是什么烂摊子,可以接受被人推翻我的设计重新做。

wildone 发表于 2012-11-20 13:49:06

lz最好详细描述下问题,还有出错的地方

liurangzhou 发表于 2012-11-20 13:58:17

同意7楼的预言!

wangshaosh123 发表于 2012-11-20 14:06:40

高手不一定能解决问题呀
你说一下问题 说清楚问题
能解决的肯定告诉你

Junker 发表于 2012-11-20 15:06:21

以下内容是我之前发的一个帖子:

我写了一段Fpga代码在飓风3的片子上跑,运行有点不稳定,但每次我用Signle tap 去抓问题数据的时候,又怎么都不会出问题。我基本断定是布局布线对时序有影响,但不知怎么去解决,是代码写的不好,还是别的什么没设置好?从quartusii的时序分析报告来看,系统可以运行的最大频率有200多M,我实际用的时钟是60M的,为什么还会有问题啊?苦恼中。。。

mymainmail 发表于 2012-11-20 15:21:42

Junker 发表于 2012-11-20 15:06 static/image/common/back.gif
以下内容是我之前发的一个帖子:

我写了一段Fpga代码在飓风3的片子上跑,运行有点不稳定,但每次我用Signl ...

这么低的频率应该不是时序的问题,可能是竞争冒险之类的问题吧,LZ可以把代码发上来,坛里热心人不少,不一定非要有偿找

Junker 发表于 2012-11-20 17:23:34

毕竟还是商业产品的代码,下面是我摘了一段,也是出问题的一段,请各位看看,是否可以看出什么问题:
always@(posedge clk)
begin
        if(!nrst)
                begin
                mk_cnt_reg<=0;
                runed_steps_per_mk<=0;
                mk_sense_rise_temp<=0;
                mk_sense_fal_temp<=0;
                end
        else
                begin       
                if(mk_sense_rise) mk_sense_rise_temp<=1'b1;
                if(mk_sense_fal) mk_sense_fal_temp<=1'b1;
       
           //---------------------------------------------------------------------------------------          
                if ( (cs==0) && (add==7'h18) && (add==base_add) &&(wr==0) )
                        mk_cnt_reg<=data_in;
                       
                else if ( (cs==0) && (add==7'h19) && (add==base_add) &&(wr==0) )
                  mk_cnt_reg<=data_in;       
               
                else if(runed_steps==0)
                        runed_steps_per_mk<=0;
               
                else if(not_init_run_flag)//
                   begin
                   if(contrl_reg)//
                        begin
                        if(mk_sense_rise_temp&&(runed_steps_per_mk>MK_FILTER_STEP))
                                begin
                                runed_steps_per_mk<=0;//问题就出在在这一句有时候没有执行,下同                                        
                                        mk_sense_rise_temp<=1'b0;
                               
                                if(mk_cnt_reg==mk_top_vlu_reg)//达到峰值
                                        mk_cnt_reg<=1;
                                else
                                        mk_cnt_reg<=mk_cnt_reg+1;//问题就出在在这一句有时候没有执行,下同                                                                                     end
                        else
                                begin
                                        if(puls_out_fal)
                                                runed_steps_per_mk<=runed_steps_per_mk+1;
                                end
                        end
                   else
                        begin
                        if(mk_sense_fal_temp&&(runed_steps_per_mk>MK_FILTER_STEP))//
                                begin
                                runed_steps_per_mk<=0;//
                                mk_sense_fal_temp<=1'b0;
                       
                                if(mk_cnt_reg==mk_top_vlu_reg)//达到峰值
                                        mk_cnt_reg<=1;
                                else
                                        mk_cnt_reg<=mk_cnt_reg+1;

                                end
                        else
                                begin
                                if(puls_out_fal)
                                                runed_steps_per_mk<=runed_steps_per_mk+1;
                                end
                        end
                end
        end
end

wangshaosh123 发表于 2012-11-20 19:36:50

我也碰到过是用chipscop捕FPGA时序添加chipscop模块之后就正常了
当时代码也很简单   
应该就是代码的问题换一种方法写就OK了
我用的是spartan6

Junker 发表于 2012-11-20 20:02:23

wangshaosh123 发表于 2012-11-20 19:36 static/image/common/back.gif
我也碰到过是用chipscop捕FPGA时序添加chipscop模块之后就正常了
当时代码也很简单   
应该就是代码的 ...

怎么换一种写法啊?谁知道那一种写法好呢

xlwxdl1 发表于 2012-11-20 20:33:57

if(mk_sense_rise) mk_sense_rise_temp<=1'b1;
if(mk_sense_fal) mk_sense_fal_temp<=1'b1;
                                    
mk_sense_rise_temp<=1'b0;
具体原因我不知道,但是你这几句代码,我总觉得挺纠结的。你说要是条件都满足了,会出现啥状况。。。。。比如某一个时钟这货本身是1,然后第一个if满足,后边赋0的也满足。这咋弄呢。你看看RTL网表给综合成什么样了,或者看一下map后的网表。。。

Junker 发表于 2012-11-20 21:34:55

xlwxdl1 发表于 2012-11-20 20:33 static/image/common/back.gif
if(mk_sense_rise) mk_sense_rise_temp

最后的那个赋0值的语句优先

wangshaosh123 发表于 2012-11-21 10:04:27

本帖最后由 wangshaosh123 于 2012-11-22 09:14 编辑

不要一个if套一个if

if
else if
else if试试

应该就是楼上说的那样      你条件重复了上面的条件满足了   就不往下面执行了
至于为什么有时候没暴露出来,这应该是ISE软件综合出来的结果都是随机的    所以改了一个地方,另外一个地方可能就不一样了这个是ISE比较蛋疼的地方

所以你在分析每个条件的时候一定要条理清晰不能有任何重复发生

wildone 发表于 2012-11-21 10:04:27

把 else if(not_init_run_flag) 去掉else试试

Cliff 发表于 2012-11-21 14:34:13

Junker 发表于 2012-11-20 13:25 static/image/common/back.gif
说说你的理由,我觉得代码其实也没多复杂,高手重写一遍也要不了几天,我当初写好到调试还加一起也没一个 ...

要说理由的话,那就是,你还不懂FPGA吧,而且也没表现出想搞懂(而不是仅解决眼前问题)的意愿。
在本论坛,外行人有偿寻求帮助的,往往就是这个下场啦。
至于原因么,这个也不好深入了。总之,包括但绝不限于对项目难度的估计不足,导致期望支出与能解决问题人的期望收入相差悬殊。

yf19860114 发表于 2012-11-21 16:00:14

按照FPGA设计流程把功能仿真,时序仿真做了 就找见问题了

Junker 发表于 2012-11-21 17:31:09

本帖最后由 Junker 于 2012-11-21 17:33 编辑

Cliff 发表于 2012-11-21 14:34 static/image/common/back.gif
要说理由的话,那就是,你还不懂FPGA吧,而且也没表现出想搞懂(而不是仅解决眼前问题)的意愿。
在本论 ...

你要是能对这个问题本身说点技术方面的好建议是最好不过了,不然你就是吝啬你那点”高深“的技术了

mymainmail 发表于 2012-11-21 18:47:12

Junker 发表于 2012-11-20 17:23 static/image/common/back.gif
毕竟还是商业产品的代码,下面是我摘了一段,也是出问题的一段,请各位看看,是否可以看出什么问题:
alway ...

至少也要描述一下功能吧,从时序上看太乱了吧,出问题那段到底在什么情况下该运行?

mymainmail 发表于 2012-11-21 18:48:54

我觉得你还是先按照功能把状态转移图画出来,像这种还是用状态机工具做吧

brahen 发表于 2012-11-21 19:21:05

贸然接受别人的东西,会死得很难看。我现在就死得很难看。

kavinsun 发表于 2012-11-21 23:35:49

一个always只对一个寄存器赋值
保证问题解决

Junker 发表于 2012-11-23 20:08:40

本帖最后由 Junker 于 2012-11-23 20:17 编辑

Cliff 发表于 2012-11-23 12:31 static/image/common/back.gif
吝啬?你也好意思说吝啬?
到底是谁在那边叫“毕竟是商业代码”而不把问题描述清楚的?
反过来说人家吝啬 ...

1、只有你觉得自己是高手,搞技术还是要朴实点好,别那么装x,我说话算客气的了。
2、代码是公司的,怎么可能全发,搞研发的谁没有签保密协议的。在论坛要是找到愿意接手的人,签了合约,自然给全部代码。

yanzhe128 发表于 2012-12-3 15:08:26

                              begin
                              runed_steps_per_mk<=0;//问题就出在在这一句有时候没有执行,下同                                       
                                        mk_sense_rise_temp<=1'b0;
                              
                              if(mk_cnt_reg==mk_top_vlu_reg)//达到峰值
                                        mk_cnt_reg<=1;
                              else
                                        mk_cnt_reg<=mk_cnt_reg+1;//问题就出在在这一句有时候没有执行,下同   
丢了个end

Mr.zhou 发表于 2012-12-3 15:33:36

大家还是静下来心来,好好交流为好。
To Junker:
    Cliff也算是热心的了,又没问你要报酬,虽然没有给你的代码明显的建议,不过还是建议你虚心的听听别人的意见,或许不慌不忙的交流能有意外的收获。
To Cliff:
    大哥,人家也是左思右想才想到阿莫这里求助,您就明显地给人家点提醒或建议,毕竟大家都是来打工的,可以像别的网友一样,给点实际的帮助。
   

dr2001 发表于 2012-12-3 15:46:00

这种风格的代码太程序语言化,在挑战综合器的能力。建议修改为状态机或者拆成综合器容易理解的代码段分段描述。

这种描述方式,往往综合后仿真就完蛋了,综合器综合理解到的行为和coding的人想的有差异。

浮云残雪 发表于 2012-12-3 19:23:45

楼主先把问题描述清楚,最好把自己做的一些工作和出现的现象描述清楚

wye11083 发表于 2012-12-3 20:57:52

这点代码足够反映LZ的风格了。太乱的if()else()倒不是最关键,有if没有else也不是太关键,但是&&,||之类的符号就大错特错了。虽然有时候也能综合出来,但是我相信多数情况下是综合不出正确结果的。但是奇怪的是加入SignalTap就正常,去就不正常,只有一个可能:代码不规范,有if没有else。LZ先好好查查代码,补上所有else,否则,用ISE=自杀。ISE很杯具,一旦没有else就会给你综合出一个Latch,而且这个Latch是不可控的。或者LZ改用Synplicity,这个工具能够比较智能地理解LZ的意图。根据经验,代码经过良好优化,用Synplicity可以达到更好的性能,但是如果代码比较烂,用这个工具反而会更慢。?SignalTap是XILINX的吧。那就对了。ISE的XST确实有BUG,但是一般情况下,代码风格无误的情况下,正确性是可以保证的。

Junker 发表于 2012-12-11 10:44:49

谢谢大家的回复!不瞒大家说,我是软件工程师兼项目主管,项目组里搞FPGA的小弟是新手,写出的代码运行起来非常不稳定(比我写的还不稳定)。想再招个牛B的,可来面试的水平视乎都差不多(专门搞FPGA三年以上的没有遇到)。后来迫于赶项目进度,我就试着全部重新写了(以前大学的时候还是写过的,那时候用的是VHDL,工作后一直做软件),没想到写出这么个东西来,大家见笑了。

mymainmail 发表于 2012-12-11 11:26:45

Junker 发表于 2012-12-11 10:44 static/image/common/back.gif
谢谢大家的回复!不瞒大家说,我是软件工程师兼项目主管,项目组里搞FPGA的小弟是新手,写出的代码运行起来 ...

我觉得在这种情况下还是嵌入一个软核比较合适

Junker 发表于 2012-12-11 13:25:06

mymainmail 发表于 2012-12-11 11:26 static/image/common/back.gif
我觉得在这种情况下还是嵌入一个软核比较合适

主要是看中了FPGA的并行性。如果用软核,EP3C10的片子,可以同时放4个内核吗,还有,内核的速度可以达到多少?

yanzhe128 发表于 2012-12-11 14:14:29

Junker 发表于 2012-12-11 13:25 static/image/common/back.gif
主要是看中了FPGA的并行性。如果用软核,EP3C10的片子,可以同时放4个内核吗,还有,内核的速 ...

   begin
                              runed_steps_per_mk<=0;//问题就出在在这一句有时候没有执行,下同                                       
                                        mk_sense_rise_temp<=1'b0;
                              
                              if(mk_cnt_reg==mk_top_vlu_reg)//达到峰值
                                        mk_cnt_reg<=1;
                              else
                                        mk_cnt_reg<=mk_cnt_reg+1;//问题就出在在这一句有时候没有执行,下同   
丢了个end

LZ你把这个end 补全 在看看,我觉得就是这个原因 这个if的有效区域认定出错了

Junker 发表于 2012-12-11 14:30:00

yanzhe128 发表于 2012-12-11 14:14 static/image/common/back.gif
begin
                              runed_steps_per_mk

多谢这位兄弟。刚才看了下代码,这个地方的End是没有掉了,是我发帖子的时候编辑出了问题。这个代码实现的功能是没有问题的,只是运行一天,总是会偶尔出一点错误,没有规律,运行不是绝对的稳定。问题就在这。有时候,一整天表现又很好。

ab8780000 发表于 2012-12-11 16:34:37

Junker 发表于 2012-12-11 14:30 static/image/common/back.gif
多谢这位兄弟。刚才看了下代码,这个地方的End是没有掉了,是我发帖子的时候编辑出了问题。这个代码实现 ...

时序导致的问题是无法用科学的角度去解释的

xivisi 发表于 2012-12-11 17:21:10

可以用时序分析 工具 分析下 组合逻辑部分的电路延时是不是可靠
页: [1]
查看完整版本: 寻FPGA绝对高手,有偿寻求帮助