zcy0517 发表于 2014-3-13 21:50:22

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

【例 5.17】用repeat 实现8 位二进制数的乘法
module mult_repeat(outcome,a,b);
parameter size=8;
input a,b;
output outcome;
reg 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) //如果temp_b 的最低位为1,就执行下面的加法
outcome=outcome+temp_a;
temp_a=temp_a<<1; //操作数a 左移一位
temp_b=temp_b>>1; //操作数b 右移一位
end
end
endmodule

除了这种,还有什么方法啊?{:shy:}

zcy0517 发表于 2014-3-13 22:00:44

reg 和input 后面如果不写类似这样的 是默认为32位对不?

zcy0517 发表于 2014-3-13 22:09:11

还有更灵活更快捷的方法么?

justin_n 发表于 2014-3-13 22:36:40

ipcore{:lol:}

sky5566 发表于 2014-3-13 22:37:55

一般 FPGA 內部有硬體乘法器速度比較快.

chen7055909 发表于 2014-3-13 22:51:12

zcy0517 发表于 2014-3-13 22:00
reg 和input 后面如果不写类似这样的 是默认为32位对不?

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

zcy0517 发表于 2014-3-13 22:51:16

本帖最后由 zcy0517 于 2014-3-14 10:25 编辑

http://wenku.baidu.com/link?url=GQrUePvmfV4OlWci3T63zYEd0WBAi8KKUJqGFWTSTbzX9X3ReMgjlgVcukx1GXQ2Hq-vN7Luyobum1RodJphNvuaPpqXwTze9uN7iwAtFg3
http://blog.csdn.net/fantasy_wxe/article/details/6787055
http://blog.sina.com.cn/s/blog_735f291001015tmm.html
http://wenku.baidu.com/link?url=GQrUePvmfV4OlWci3T63zYEd0WBAi8KKUJqGFWTSTbzX9X3ReMgjlgVcukx1GXQ2dczfHwGxIGuv8zEmeF7XEHCLNCdXrB5I7aNJqYJvOai

zcy0517 发表于 2014-3-14 09:59:02

本帖最后由 zcy0517 于 2014-3-14 10:15 编辑

sky5566 发表于 2014-3-13 22:37
一般 FPGA 內部有硬體乘法器速度比較快.

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

zcy0517 发表于 2014-3-14 10:21:37

一般如何用乘法器最优?

sky5566 发表于 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 硬核比較穩...{:lol:}

zcy0517 发表于 2014-3-14 23:27:23

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

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

sky5566 发表于 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)------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
               );

zcy0517 发表于 2014-3-15 15:06:54

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

谢谢哈~ 晓得了 {:loveliness:}

yayajie 发表于 2014-4-1 21:30:14

BOOTH算法实现

zcy0517 发表于 2014-4-2 18:18:14

yayajie 发表于 2014-4-1 21:30
BOOTH算法实现

学习了~

lusson 发表于 2014-4-2 19:55:52

input 后面不加位宽是1位宽。
如果是立即数的话不写宽度默认是int类型宽度
我记得是这样的。

linjpxt 发表于 2014-4-2 20:03:32

我直接写 c<=a*b
编译器会自动综合的,fpga有很多内部乘法器,9*9的宽度,可以拼成18*18或更多
你看用户手册就知道
如果用的多,可以逻辑上进行分时复用

linjpxt 发表于 2014-4-2 20:09:21

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

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

winster321 发表于 2014-4-2 21:40:13

无符号数a*b,有符号数$signed(a)*$signed(b)

sme 发表于 2014-4-3 08:58:17

直接 a*b
页: [1]
查看完整版本: 大家都怎样用verilog编乘法器?