基于FPGA的4位减法器结构化设计

1. 设计要求:

  设计一个4位减法器,采用结构化设计。该设计名为sub_4bit,其顶层设计如下图所示,有三个输入量:被减数x[3:0],减数y[3:0],低位向本位的借位bin;有两个输出量本位差dif[3:0],本位向高位的借位bout。数学表达式为:(x + bout) – y – bin = diff

2. 设计实现

  4位减法器由四个全减器构成,1位全减器由两个半减器和1个或门构成,如下图所示。

(1) 半减器:

  半减器用于计算两个二进制数x和y的剑法,输出结果d和向高位的借位bo,没有考虑低位向本位的借位。

(2) 全减器

  全加器有三个输入量:被减数Ai,减数Bi,低位向本位的借位Ci-1;有两个输出量本位差Si,本位向高位的借位Ci。其真值表如下所示:

(3)4位减法器由四个1位全减器通过串行级联构成,本机的借位作为下一级的借位输入。按照数学知识,减法是从最低位开始,依次向高位计算,这样做的原因是,高位不知道低位的2个数相减,有没有借位。所以借法计算,只能是从低到高依次计算。

3. 设计实现

(1)4位减法器设计与实现

 1 module sub_4bit(
 2     input     wire        [3:0]        x,
 3     input     wire         [3:0]        y,
 4     input     wire                     bin,
 5     
 6     output     wire         [3:0]        dif,
 7     output     wire                     bout
 8 );
 9 
10     wire                         bout1;
11     wire                        bout2;
12     wire                        bout3;
13 
14     full_sub full_sub_inst0(
15         .x                    (x[0]),
16         .y                    (y[0]),
17         .bin                (bin),
18 
19         .dif                (dif[0]),
20         .bout                (bout1)
21     );
22     
23     full_sub full_sub_inst1(
24         .x                    (x[1]),
25         .y                    (y[1]),
26         .bin                (bout1),
27 
28         .dif                (dif[1]),
29         .bout                (bout2)
30     );
31     
32     full_sub full_sub_inst2(
33         .x                    (x[2]),
34         .y                    (y[2]),
35         .bin                (bout2),
36 
37         .dif                (dif[2]),
38         .bout                (bout3)
39     );
40     
41     full_sub full_sub_inst3(
42         .x                    (x[3]),
43         .y                    (y[3]),
44         .bin                (bout3),
45 
46         .dif                (dif[3]),
47         .bout                (bout)
48     );    
49         
50 endmodule 

(2)全减器设计与实现

 1 module full_sub(
 2     input     wire                    x,
 3     input     wire                     y,
 4     input     wire                     bin,
 5     
 6     output     wire                     dif,
 7     output     wire                     bout
 8 );
 9 
10     wire                     dif_xy;
11     wire                    bout_xy;
12     wire                     bout_xybin;
13     
14     half_sub half_sub_inst0(
15         .x                    (x),
16         .y                    (y),
17 
18         .dif                (dif_xy),
19         .bout                (bout_xy)
20     );
21     
22     half_sub half_sub_inst1(
23         .x                    (dif_xy),
24         .y                    (bin),
25 
26         .dif                (dif),
27         .bout                (bout_xybin)
28     );
29     
30     assign bout = bout_xy | bout_xybin;
31 
32 endmodule 

(3)半减器设计与实现

 1 module half_sub(
 2     input     wire                    x,
 3     input     wire                     y,
 4     
 5     output     wire                     dif,
 6     output     wire                     bout
 7 );
 8 
 9     assign dif     = x ^ y;
10     assign bout = (~x) & y;
11 
12 endmodule 

4. 仿真验证

 1 `timescale 1ns/1ps
 2 
 3 module sub_4bit_tb();
 4 
 5     reg            [3:0]        x;
 6     reg             [3:0]        y;
 7     reg                         bin;
 8     
 9     wire             [3:0]        dif;
10     wire                         bout;
11 
12     sub_4bit sub_4bit_inst(
13         .x                    (x),
14         .y                    (y),
15         .bin                (bin),
16 
17         .dif                (dif),
18         .bout                (bout)
19     );
20     
21     initial begin
22         repeat(20)begin
23             x         = {$random}%16;
24             y         = {$random}%16;
25             bin     = 1'b0;
26             #20;
27         end
28     end
29     
30 endmodule 

5. 参考资料

(1)【HDL系列】半减器、全减器和减法器原理和设计 - 知乎 (zhihu.com)

 

posted @ 2021-07-30 17:28  豌豆茶  阅读(4068)  评论(1编辑  收藏  举报