目录
一、前言
本文介绍verilog实现乘法器,乘法的实现本质可以通过移位和加法实现,乘法的实现无需时序控制,用组合逻辑电路实现即可,因此即可用always或assign实现。
二、代码实现
2.1 工程代码
工程中同时包含了always和assign的实现两个4位2进制的乘法,always实现更多的是说明乘法实现的原理来编写代码,assign方法则更简便
module Multiply( num1,num2,out_always,out_assign);
parameter N=4;
input [N-1:0] num1;
input [N-1:0] num2;
output reg [2*N-1:0]out_always;
output [2*N-1:0] out_assign;
reg [2*N-1:0] temp;
reg [2*N-1:0] temp2;
//方式1
integer i;
always@(*)
begin
temp=8'b0;
temp2 ={4'b0000,num1};
for(i=0;i<=N-1;i=i+1)
begin
if (num2[i]==1)
temp=temp+temp2;
temp2={temp2[6:0],1'b0};
end
out_always=temp;
end
//方法2
assign out_assign=num1*num2;
endmodule
仿真代码
module multi_tb();
reg [3:0] a,b;
wire [7:0] out_always,out_assign;
initial
begin
a=4'b0001;
b=4'b0011;
#40 b=4'b0111;
#40 b=4'b1111;
end
always #5 a=a+1;
Multiply multiply_test(.num1(a),.num2(b),.out_always(out_always),.out_assign(out_assign));
endmodule
2.2 综合结果
两种方式综合的结果相同,都是用LUT和CARRY实现
2.3 仿真结果
使用modelsim仿真结果如下,乘数a每5ns增加1,乘数b初始值为3,40ns和70ns时设为7和15,通过out_always和out_assign可知结果的正确性,并且两者的值一致。
三、参考
书籍《Vivado 入门与FPGA设计实例》中4.9乘法器