前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 篇

FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 篇

原创
作者头像
FPGA技术江湖
修改2021-04-01 17:59:57
1.3K0
修改2021-04-01 17:59:57
举报
文章被收录于专栏:FPGA技术江湖

FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】篇

连载《叁芯智能fpga设计与研发-第8天》 【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】

原创作者:紫枫术河 转载请联系群主授权,否则追究责任

一、乘法器原理

1、我们先看十进制的乘法过程

可以看出来,我们是分别用乘数的个位、十位、百位与被乘数相乘分别得到 ;

最后的结果 等于 A + B10 + C100 = 401050

2、二进制的乘法过程

可以看出来,二进制乘法和十进制是一致的

最后的结果 等于 A + B2 + C4 + D*8 = 1991

二、verilog代码实现

mult4bit.v

代码语言:javascript
复制
module mult4bit(
    input   [3:0]       a,
    input   [3:0]       b,
     
    output  [7:0]       y
);
 
    wire    [7:0]   temp1;
    wire        [7:0]       temp2;
    wire        [7:0]       temp3;
    wire        [7:0]       temp4;
 
    assign temp1 = {4'b0000,a&{4{b[0]}}};
    assign temp2 = {3'b000,a&{4{b[1]}},1'b0};
    assign temp3 = {2'b00,a&{4{b[2]}},2'b0};
    assign temp4 = {1'b0,a&{4{b[3]}},3'b0};
     
    assign y = temp1 + temp2 + temp3 + temp4;
 
endmodule

三、编写仿真脚本

mult4bit.v

代码语言:javascript
复制
`timescale 1ns/1ps
 
module mult4bit_tb();
 
    reg     [3:0]       a;
    reg     [3:0]       b;
     
    wire    [7:0]       y;
 
    mult4bit mult4bit_inst(
        .a      (a),
        .b      (b),
         
        .y      (y)
    );
 
    initial begin
        repeat (100)begin
            a = {$random}%16;
            b = {$random}%16;  
            #20;
        end
    end
 
endmodule

四、仿真结果

仿真结果显示我们的乘法器设计正确

五、除法器原理

1、我们先看十进制的除法过程

从十进制的除法运算,我们可以看见有几个步骤;

1.1、首先除法是从高位至低位依次进行;

1.2、每一位要加上前一位留下来的余数,组成一个新数和除数比较;

1.3、当新数大于/等于除数时,写商求余;

1.4、按照上述方式依次进行,直到被除数最末尾,除法运算结束。

2、二进制的除法过程

从图中可以看出二进制的除法,和十进制一致

六、代码实现

div4bit.v

代码语言:javascript
复制
module div4bit(
    input   [3:0]       a,
    input       [3:0]       b,
     
    output  [3:0]       s,
    output  [3:0]       y
 
);
 
    wire    [3:0]   part1;
    wire    [3:0]   part2;
    wire    [3:0]   part3;
    wire    [3:0]   part4;
     
    assign s[3]     = (a[3] >= b)?1'b1:1'b0;
    assign part1    = (a[3] >= b)?(a[3]-b):a[3];
     
    assign s[2] = ({part1[0],a[2]} >= b)?1'b1:1'b0;
    assign part2 = ({part1[0],a[2]} >= b)?({part1[0],a[2]}-b):{part1[0],a[2]};
     
    assign s[1] = ({part2[1:0],a[1]} >= b)?1'b1:1'b0;
    assign part3 = ({part2[1:0],a[1]} >= b)?({part2[1:0],a[1]}-b):{part2[1:0],a[1]};
 
    assign s[0] = ({part3[2:0],a[0]} >= b)?1'b1:1'b0;
    assign part4 = ({part3[2:0],a[0]} >= b)?({part3[2:0],a[0]}-b):{part3[2:0],a[0]};
 
    assign y = part4;
 
//这段代码执行也是对的,但是编译器会报警告,因为我们把5bit的数据赋值给4bit
 
//  assign s[3] = a[3] >= b;
//  assign part1 = (s[3]) ? a[3] - b : a[3];
// 
//  assign s[2] = {part1,a[2]} >= b;
//  assign part2 = (s[2]) ? {part1,a[2]} - b : {part1,a[2]};
// 
//  assign s[1] = {part2,a[1]} >= b;
//  assign part3 = (s[1]) ? {part2,a[1]} - b : {part2,a[1]};
// 
//  assign s[0] = {part3,a[0]} >= b;
//  assign part4 = (s[0]) ? {part3,a[0]} - b : {part3,a[0]};
// 
//  assign y = part4;
     
endmodule

七、编写仿真文件

div4bit_tb.v

代码语言:javascript
复制
`timescale 1ns/1ps
 
 
module div4bit_tb();
        reg     [3:0]       a;
        reg [3:0]       b;
         
        wire    [3:0]       s;
        wire    [3:0]       y;
 
        div4bit div4bit_isnt(
            .a      (a),
            .b      (b),
             
            .s      (s),
            .y      (y)
        );
 
        initial begin
            repeat(100)begin
                a ={$random}%16;
                b ={$random}%16;
                #20;
            end
         
        end
 
endmodule

八、仿真结果

从仿真结果可以看出,我们设计的4bit除法器正确。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】篇
    • 连载《叁芯智能fpga设计与研发-第8天》 【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】
      • 一、乘法器原理
        • 二、verilog代码实现
          • 三、编写仿真脚本
            • 四、仿真结果
              • 五、除法器原理
                • 六、代码实现
                  • 七、编写仿真文件
                    • 八、仿真结果
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档