基于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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了