基于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);