maqingbiao 发表于 2010-8-17 14:46:08

FPGA 使用IP核与直接用"+""-""*""/&q

FPGA使用IP核与直接用"+""-""*""/"进行运算有什么差别的吗,比如调用IP核lmp_add_sub()和用+ -运算   一直都不是很了解?望前辈指教

p.nicholas 发表于 2010-8-17 14:47:28

资源更少+保密性更高

barryyan2007 发表于 2010-8-17 16:14:21

资源更少+保密性更高 , 这个是说IP核还是+-符号啊?

p.nicholas 发表于 2010-8-17 16:59:38

回复【2楼】barryyan2007
资源更少+保密性更高 , 这个是说ip核还是+-符号啊?
-----------------------------------------------------------------------

IP

lileistone 发表于 2010-8-17 17:02:24

回复【3楼】p.nicholas
回复【2楼】barryyan2007
资源更少+保密性更高 , 这个是说ip核还是+-符号啊?
-----------------------------------------------------------------------
ip
-----------------------------------------------------------------------

为啥?

maqingbiao 发表于 2010-8-17 19:52:31

我看过的很多书,都是喜欢调用IP核的   但不懂为什么?

cwfboy 发表于 2010-8-17 19:58:47

我觉得直接用 + - * /就可以了吧,剩下的 交给综合器了

maqingbiao 发表于 2010-8-17 20:38:21

其实   综合器   很不人性化的   有时我们 不能依靠综合器的

at90s 发表于 2010-8-17 21:00:09

其实   综合器   很不人性化的   有时我们 不能依靠综合器的

/* 但是大部分情况我们还是依靠综合器的,除法除外 */

470036398 发表于 2010-8-18 09:21:58

我就不明白, Altera能做出很好的“除法IP”为什么不能在qurters II 的综合器里把除法的综合做的像他的“除法IP”一样好呢??

470036398 发表于 2010-8-18 09:22:54

或者综合出跟他的“除法IP”一样的电路来呢??

seemrain 发表于 2010-8-18 12:49:15

调用IP可以灵活的控制流水线等级,符号不可以。。。

maqingbiao 发表于 2010-8-18 13:08:09

回复【11楼】seemrain
调用IP可以灵活的控制流水线等级,符号不可以。。。
-----------------------------------------------------------------------
对,符号不可以控制流水线等级,但用IP核要如何设计才能控制呢    感觉自己写的比较容易控制,但自己写的代码效率肯定没有IP核的高   因为他自己的芯片,他最清楚,肯定做得很好

at90s 发表于 2010-8-18 22:28:01

1.   加号和减号随便用,现代FPGA都有特别针对加减法而特别设计的快速进位链的,就算是现在最烂的综合器(xst之流)都能映射得很好;大位宽的加法器自己在代码里面拆成由多级流水组成的小位宽加法器;
2.0   18x18位(cyclone I II III IV、arria I II等)或18x25位(v5等)以内的乘法直接用*号没问题,因为这些都是FPGA内部已经做好了的,做一次这样的乘法只需要几纳秒(cyclone III为4ns,V5为2.5ns),综合器可以直接映射过去,担心速度上不去的话,在乘法的输入和输出都加入流水寄存器。
2.1   我做过的一个项目中,需要做大量的复数乘加运算(当然乘法都是在18x18位以内的),把一片ep3c80百分之九十以上的乘法器都用光了,仍然可以跑184.32MHz,所有的乘法都是直接用*来写的,哪里速度上不去,哪里就插入流水寄存器。
2.2用FPGA做高强度的信号处理个人认为是非常没技术含量的,特别是FIR之类的,让流水线流起来非常简单的;至于不能随便插入流水寄存器的算法,技术含量都在算法设计过程中如何将不能流水的地方通过一些近似或者其他方法转成可流水的算法,这些都和FPGA设计无关,具体见《VLSI数字信号处理-设计与实现》。
3. 因为FPGA内部通常没有集成硬件除法器,直接用/号的话,综合器会将其映射到很大一坨逻辑的,一个需要大量除法运算的算法个人认为不是好算法;
4. 尽量用运算符一个很重要的原因是源代码的可读性和可移植性,一个满篇都是lpm_add_sub、lpm_mul的代码是非常让人讨厌的!
5. 在代码设计的时候就应该先有电路,哪里逻辑或布线延时较大,哪里应该插入流水寄存器等等都应该心中有数,然后才能写代码。

wuyongqing1960 发表于 2010-8-19 11:37:45

回复【13楼】at90s 子非鱼
1.   加号和减号随便用,现代fpga都有特别针对加减法而特别设计的快速进位链的,就算是现在最烂的综合器(xst之流)都能映射得很好;大位宽的加法器自己在代码里面拆成由多级流水组成的小位宽加法器;
2.0   18x18位(cyclone i ii iii iv、arria i ii等)或18x25位(v5等)以内的乘法直接用*号没问题,因为这些都是fpga内部已经做好了的,做一次这样的乘法只需要几纳秒(cyclone iii为4ns,v5为2.5ns),综合器可以直接映射过去,担心速度上不去的话,在乘法的输入和输出都加入流水寄存器。
2.1   我做过的一个项目中,需要做大量的复数乘加运算(当然乘法都是在18x18位以内的),把一片ep3c80百分之九十以上的乘法器都用光了,仍然可以跑184.32mhz,所有的乘法都是直接用*来写的,哪里速度上不去,哪里就插入流水寄存器。
2.2......
-----------------------------------------------------------------------

请问一下,18x18位如何插入流水寄存器,是让它们在几个周期内都进行相同的乘法运算吗?

at90s 发表于 2010-8-19 13:01:55

不是,乘法器每个周期都是在做不同的乘法运算的,这样才能达到最大的吞吐率;
要是几个周期都是处理同一个运算的话,那么就没必要流水了,去掉流水寄存器,把时钟频率降下来即可,吞吐率一样的。

maqingbiao 发表于 2010-8-19 13:41:49

回复【13楼】at90s 子非鱼
2.2用FPGA做高强度的信号处理个人认为是非常没技术含量的,特别是FIR之类的,让流水线流起来非常简单的;……
-----------------------------------------------------------------------

恩   非常感谢您的经验分享   但我想问一下,为什么FPGA做高强度的信号处理不合适呢?信号处理不正是FPGA的强项吗?

at90s 发表于 2010-8-19 23:00:23

是非常合适,合适到没多大难度,甚至合适到没多少技术含量...............特别是FIR............
即使是带反馈的信号处理结构,如采用LMS算法的自适应滤波器,在采样率不高(几兆以下),阶数不高(几十阶),FPGA时钟频率足够高(现在比较低档的如cyclone III都能轻松跑190MHz左右)的情况下,由于每个采样都有足够的时钟周期干活,即使中间插入一些流水寄存器也不会改变信号处理结构。当采样率比较高或者阶数较高的情况下,插入流水寄存器会改变信号处理结构的,才需要考虑弛豫超前流水线之类的结构变换,这是个近似的变换,会影响算法性能的,已经是算法工程师干的活,和FPGA工程师没多大关系。

wuyongqing1960 发表于 2010-8-20 09:44:16

用Cyclone I,两个18位相乘,直接用*号编程,结果只需要一个周期就可以稳定吗?
左移(《)比直接用*号还要快些吗?
希望能各位大哥能帮我解答

maqingbiao 发表于 2010-8-20 14:52:46

回复【18楼】wuyongqing1960
左移(《)比直接用*号还要快些吗?
-----------------------------------------------------------------------
这样应该是更加的节约资源,但当两个相乘的数都是未知的呢?你要如何处理呢?似乎不太可行吧

maqingbiao 发表于 2010-8-20 14:58:47

回复【17楼】at90s 子非鱼
……已经是算法工程师干的活,和FPGA工程师没多大关系
-----------------------------------------------------------------------
我还是不太理解您的意思,是不是说,FPGA做信号处理确实是强项,但这样的工作不属于FPGA工程师的是吗?我是真心的请教,并不是在这里争论

newbier 发表于 2010-8-20 15:04:58

FPGA做信号处理难度比用DSP要高,不过速度更快

at90s 发表于 2010-8-21 00:05:37

回复【20楼】maqingbiao
我还是不太理解您的意思,是不是说,FPGA做信号处理确实是强项,但这样的工作不属于FPGA工程师的是吗?我是真心的请教,并不是在这里争论

---------------------------------------------------------------------------------------------------------------------

对于LMS算法,若采用弛豫超前流水线之类的之类的结构变换来提高吞吐率其实已经改变了算法,即变换后的结构已经和标准的LMS算法不一样了,只是一个近似的LMS算法,静态误差、收敛速度等等性能指标都会受影响的,这是属于算法设计了,在我们公司是由算法工程师做的,FPGA工程师仅仅是实现算法工程师给出的算法,并且要求每个步骤输出的结果都要跟算法工程师给出的matlab定点仿真平台一一对应,FPGA工程师干的活是在不改变算法结构的情况下,以尽量高的效率映射到FPGA中去,若因为算法原因导致映射效率不高,则向算法工程师给出改进建议,例如建议将前面所说的标准LMS算法转换成方便流水的近似LMS算法。


我的意思是对于无反馈的信号处理结构,FPGA工程师可以加入足够多的流水级数,轻松地达到系统工程师所提出的吞吐率指标要求,这是个没技术含量的体力活;
对于带反馈的信号处理结构(如IIR、LMS等),若仅靠增加流水级数来达到吞吐率要求的话,可能会改变信号处理结构的,算法的性能指标会受影响甚至干脆就是完全错误的,这时FPGA工程师会向算法工程师提出算法改进需求。

maqingbiao 发表于 2010-8-21 12:09:28

恩   明白了   非常感谢您的指导,辛苦了

wuyongqing1960 发表于 2010-8-23 11:04:29

非常感谢呵呵

weibingji 发表于 2010-8-31 15:57:31

哈哈,路过受教了。

honsimark 发表于 2010-9-15 20:56:08

回复【16楼】maqingbiao
-----------------------------------------------------------------------

楼主说的有理,但是硬件工程师需要不少经验的。我个人感觉算法工程师是比硬件逻辑工程师吃香,特别在研究所,搞硬件累

cwfboy 发表于 2010-11-9 21:33:01

如果是进行有符号 乘法运算,应该不好直接 用*吧,不知各位有没有这方面经验?

at90s 发表于 2010-11-10 14:39:49

有符号乘法:

reg signed a;
reg signed b;
reg signed c;

.....

always @(posedge clk)
begin
    c <= a * b;
end

或者

reg a;
reg b;
reg c;

.....

always @(posedge clk)
begin
    c <= $signed(a) * $signed(b);
end

cwfboy 发表于 2010-11-10 18:00:20

回复【28楼】at90s 子非鱼
-----------------------------------------------------------------------

前辈,受教了!

cuikai12345 发表于 2010-11-10 18:38:00

mark

wo_LKH 发表于 2010-11-10 19:24:14

学习了

unicontrol 发表于 2010-11-10 20:33:11

回复【6楼】cwfboy
我觉得直接用 + - * /就可以了吧,剩下的 交给综合器了
-----------------------------------------------------------------------

综合器有时候相当不着调,用一下你就知道了。

jielove2003 发表于 2010-11-10 20:43:53

学习

maqingbiao 发表于 2010-11-10 23:15:12

呵呵这帖子沉了那么久又浮起来了

xiaoxixi123 发表于 2011-7-24 23:44:00

mark

zhanshenguilai 发表于 2011-7-24 23:58:19

这个贴不错

study_yu 发表于 2011-7-25 08:23:51

回复【28楼】at90s 子非鱼
有符号乘法:
reg signed a;
reg signed b;
reg signed c;
.....
always @(posedge clk)
begin
    c &lt;= a * b;
end
或者
reg a;
reg b;
reg c;
.....
always @(posedge clk)
begin
    c &lt;= $signed(a) * $signed(b);
end

-----------------------------------------------------------------------

好贴,这种帖子才是最有技术含量的

lsw0136 发表于 2011-7-26 16:42:43

mark,大牛

bdzhaojing 发表于 2014-8-28 09:36:16


mark,大牛
页: [1]
查看完整版本: FPGA 使用IP核与直接用"+""-""*""/&q