搜索
bottom↓
回复: 19

大家都怎样用verilog编乘法器?

[复制链接]

出0入0汤圆

发表于 2014-3-13 21:50:22 | 显示全部楼层 |阅读模式
【例 5.17】用repeat 实现8 位二进制数的乘法
module mult_repeat(outcome,a,b);
parameter size=8;
input a,b;
output[2*size:1] outcome;
reg[2*size:1] temp_a,outcome;
reg temp_b;
always @(a or b)
begin
outcome=0;
temp_a=a;
temp_b=b;
repeat(size) //repeat 语句,size 为循环次数
begin
if(temp_b[1]) //如果temp_b 的最低位为1,就执行下面的加法
outcome=outcome+temp_a;
temp_a=temp_a<<1; //操作数a 左移一位
temp_b=temp_b>>1; //操作数b 右移一位
end
end
endmodule

除了这种,还有什么方法啊?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-3-13 22:00:44 | 显示全部楼层
reg 和input 后面如果不写类似[2:0]这样的 是默认为32位对不?

出0入0汤圆

 楼主| 发表于 2014-3-13 22:09:11 | 显示全部楼层
还有更灵活更快捷的方法么?

出0入0汤圆

发表于 2014-3-13 22:36:40 | 显示全部楼层
ipcore

出0入0汤圆

发表于 2014-3-13 22:37:55 | 显示全部楼层
一般 FPGA 內部有硬體乘法器速度比較快.

出0入0汤圆

发表于 2014-3-13 22:51:12 | 显示全部楼层
zcy0517 发表于 2014-3-13 22:00
reg 和input 后面如果不写类似[2:0]这样的 是默认为32位对不?

不写默认为1位的吧,一般用IP核

出0入0汤圆

 楼主| 发表于 2014-3-13 22:51:16 | 显示全部楼层
本帖最后由 zcy0517 于 2014-3-14 10:25 编辑

http://wenku.baidu.com/link?url= ... PpqXwTze9uN7iwAtFg3
http://blog.csdn.net/fantasy_wxe/article/details/6787055
http://blog.sina.com.cn/s/blog_735f291001015tmm.html
http://wenku.baidu.com/link?url= ... NCdXrB5I7aNJqYJvOai

出0入0汤圆

 楼主| 发表于 2014-3-14 09:59:02 | 显示全部楼层
本帖最后由 zcy0517 于 2014-3-14 10:15 编辑
sky5566 发表于 2014-3-13 22:37
一般 FPGA 內部有硬體乘法器速度比較快.


这个会很耗资源么?因为程序里可能多处需要用到乘法器
硬体乘法器,你指的的硬核还是ip core

出0入0汤圆

 楼主| 发表于 2014-3-14 10:21:37 | 显示全部楼层
一般如何用乘法器最优?

出0入0汤圆

发表于 2014-3-14 21:19:16 | 显示全部楼层
zcy0517 发表于 2014-3-14 09:59
这个会很耗资源么?因为程序里可能多处需要用到乘法器
硬体乘法器,你指的的硬核还是ip core  ...

http://zhidao.baidu.com/question/583234396.html
轉貼
在verilog设计中是可以使用乘法器的,只不过直接使用verilog的乘法器有一些不好的地方:
1、直接使用verilog的乘法器综合后是一个组合逻辑的乘法器,其需要面积(逻辑门)大,输出时序不稳定。
2、综合后的乘法器因为是组合逻辑,经过多级逻辑门,时序很差容易出时序问题,在FPGA上跑起来会很慢。
一般的乘法器设计会上上述两个问题(特别是第二点)优化掉.比如将一个乘法操作采用多个时钟周期实现,或者采用优化的算法实现。

所以用 IP 硬核比較穩...

出0入0汤圆

 楼主| 发表于 2014-3-14 23:27:23 | 显示全部楼层
sky5566 发表于 2014-3-14 21:19
http://zhidao.baidu.com/question/583234396.html
轉貼
在verilog设计中是可以使用乘法器的,只不过直接 ...

其实我不是很明白硬核怎么调用的。。

出0入0汤圆

发表于 2014-3-14 23:53:36 | 显示全部楼层
本帖最后由 sky5566 于 2014-3-14 23:57 编辑
zcy0517 发表于 2014-3-14 23:27
其实我不是很明白硬核怎么调用的。。


(1)先看你的 FPGA 是否有硬核
(2)可選擇邏輯產生或是使用FPGA內部硬核.
(如果是使用邏輯產生,這裡altera已經幫你優化好了,所以喔~如果自己寫verilog產生,那麼你還要優化一下時序)
例如:
--
--  D -------(SUB)-------\
--           /            \
--  B ------/              =>(*)--\
--                        /        \
--  A -------------------/          =>(ADD)--[R]----P
--                                 /
--  C-----------------------------/
--

   -- P = C + A*(D-B)
        -- s18=D-B
        SUB_inst: SUB18
           port map (
                     dataa  => d,  
                     datab  => b,   
                     result => s18  -- D-B
                    );

        -- A*B
        MULADD1_inst : MULADD1
        port map (
                  aclr0    => '0',
                  clock0   => clk,
                  dataa_0  => a,
                  datab_0  => s18,
                  result   => s36
                 );

        ADD48_inst : ADD48
        port map (
                  dataa               => c48,  
--                datab(47 downto 36) => (others=>s36(35)),
                  datab(47 downto 36) => (others=> '0'),
                  datab(35 downto 0)  => s36,  
                  result              => ad48
                 );

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-3-15 15:06:54 | 显示全部楼层
sky5566 发表于 2014-3-14 23:53
(1)先看你的 FPGA 是否有硬核
(2)可選擇邏輯產生或是使用FPGA內部硬核.
(如果是使用邏輯產生,這裡altera ...

谢谢哈~ 晓得了

出0入0汤圆

发表于 2014-4-1 21:30:14 | 显示全部楼层
BOOTH算法实现

出0入0汤圆

 楼主| 发表于 2014-4-2 18:18:14 | 显示全部楼层

学习了~

出0入54汤圆

发表于 2014-4-2 19:55:52 | 显示全部楼层
input 后面不加位宽是1位宽。
如果是立即数的话不写宽度默认是int类型宽度
我记得是这样的。

出0入0汤圆

发表于 2014-4-2 20:03:32 | 显示全部楼层
我直接写 c<=a*b
编译器会自动综合的,fpga有很多内部乘法器,9*9的宽度,可以拼成18*18或更多
你看用户手册就知道
如果用的多,可以逻辑上进行分时复用

出0入0汤圆

发表于 2014-4-2 20:09:21 | 显示全部楼层
sky5566 发表于 2014-3-14 21:19
http://zhidao.baidu.com/question/583234396.html
轉貼
在verilog设计中是可以使用乘法器的,只不过直接 ...

如果片上有硬乘法器会优先使用乘法器的
编译后看下资源的状态就知道了,一般都有十几个18*18的吧

出0入0汤圆

发表于 2014-4-2 21:40:13 来自手机 | 显示全部楼层
无符号数a*b,有符号数$signed(a)*$signed(b)

出0入0汤圆

发表于 2014-4-3 08:58:17 | 显示全部楼层
直接 a*b
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表