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

2021-04-01 17:59:57 浏览数 (1)

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};
            b = {$random};  
            #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};
                b ={$random};
                #20;
            end
         
        end
 
endmodule

八、仿真结果

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

0 人点赞