Verilog基础之四、乘法器实现

目录

一、前言

二、代码实现

2.1 工程代码

2.2 综合结果

2.3 仿真结果

三、参考


一、前言

    本文介绍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乘法器

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值