大家都怎样用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:} reg 和input 后面如果不写类似这样的 是默认为32位对不? 还有更灵活更快捷的方法么? ipcore{:lol:} 一般 FPGA 內部有硬體乘法器速度比較快. zcy0517 发表于 2014-3-13 22:00
reg 和input 后面如果不写类似这样的 是默认为32位对不?
不写默认为1位的吧,一般用IP核 本帖最后由 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 10:15 编辑
sky5566 发表于 2014-3-13 22:37
一般 FPGA 內部有硬體乘法器速度比較快.
这个会很耗资源么?因为程序里可能多处需要用到乘法器
硬体乘法器,你指的的硬核还是ip core{:smile:} 一般如何用乘法器最优? zcy0517 发表于 2014-3-14 09:59
这个会很耗资源么?因为程序里可能多处需要用到乘法器
硬体乘法器,你指的的硬核还是ip core...
http://zhidao.baidu.com/question/583234396.html
轉貼
在verilog设计中是可以使用乘法器的,只不过直接使用verilog的乘法器有一些不好的地方:
1、直接使用verilog的乘法器综合后是一个组合逻辑的乘法器,其需要面积(逻辑门)大,输出时序不稳定。
2、综合后的乘法器因为是组合逻辑,经过多级逻辑门,时序很差容易出时序问题,在FPGA上跑起来会很慢。
一般的乘法器设计会上上述两个问题(特别是第二点)优化掉.比如将一个乘法操作采用多个时钟周期实现,或者采用优化的算法实现。
所以用 IP 硬核比較穩...{:lol:}
sky5566 发表于 2014-3-14 21:19
http://zhidao.baidu.com/question/583234396.html
轉貼
在verilog设计中是可以使用乘法器的,只不过直接 ...
其实我不是很明白硬核怎么调用的。。{:sweat:} 本帖最后由 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
);
sky5566 发表于 2014-3-14 23:53
(1)先看你的 FPGA 是否有硬核
(2)可選擇邏輯產生或是使用FPGA內部硬核.
(如果是使用邏輯產生,這裡altera ...
谢谢哈~ 晓得了 {:loveliness:} BOOTH算法实现 yayajie 发表于 2014-4-1 21:30
BOOTH算法实现
学习了~ input 后面不加位宽是1位宽。
如果是立即数的话不写宽度默认是int类型宽度
我记得是这样的。 我直接写 c<=a*b
编译器会自动综合的,fpga有很多内部乘法器,9*9的宽度,可以拼成18*18或更多
你看用户手册就知道
如果用的多,可以逻辑上进行分时复用
sky5566 发表于 2014-3-14 21:19
http://zhidao.baidu.com/question/583234396.html
轉貼
在verilog设计中是可以使用乘法器的,只不过直接 ...
如果片上有硬乘法器会优先使用乘法器的
编译后看下资源的状态就知道了,一般都有十几个18*18的吧 无符号数a*b,有符号数$signed(a)*$signed(b) 直接 a*b
页:
[1]