Verilog——串行四位加法器和超前四位加法器74HC283

news/2024/11/7 18:06:24/

Verilog——串行四位加法器和超前四位加法器74HC283

  • 一. 串行四位加法器
    • 设计思路
    • 1. 一位全加器
      • 1.1原理
      • 1.2代码实现
        • 1.2.1设计模块
        • 1.2.2测试模块
      • 1.3 仿真结果
    • 2.用四个一位全加器串行成四位加法器
      • 2.1原理
      • 2.2代码
        • 2.2.1设计模块
        • 2.2.2测试模块
      • 2.3仿真结果
  • 二.超前四位加法器74HC283
    • 设计思路
    • 1.超前进位产生电路
      • 1.1代码实现
        • 1.1.1设计代码
        • 1.1.2测试代码
      • 1.2 仿真结果
    • 2.应用超前进位产生电路设计出74HC283
      • 2.1代码实现
        • 2.1.1设计模块
        • 2.1.2测试模块
      • 2.2仿真结果
  • 三.问题与总结

一. 串行四位加法器

设计思路

先设计出一位全加器,在根据分层次分模块设计出四位加法器。

1. 一位全加器

1.1原理

根据全加器真值表进行行为级建模。 真值表如下图所示:
在这里插入图片描述

1.2代码实现

1.2.1设计模块

module full_adder(
input A,B,Ci,
output reg S,Co);
/*参数说明:
输入:
A,B为一位二进制被加数,Ci为来自低位的进位
输出:
S为和,Co为进位
*/
always@(*)
begincase({A,B,Ci})3'b000:begin S=0;Co=0; end3'b001:begin S=1;Co=0; end3'b010:begin S=1;Co=0; end3'b011:begin S=0;Co=1; end3'b100:begin S=1;Co=0; end3'b101:begin S=0;Co=1; end3'b110:begin S=0;Co=1; end3'b111:begin S=1;Co=1; endendcase
end
endmodule

1.2.2测试模块

//filename:tb_fulladder.v
`timescale 10ns/1ns
module tb_fulladder();
reg A,B,Ci;
wire S,Co;full_adder U(A,B,Ci,S,Co);initial$monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co);
initial
beginA=0;B=0;Ci=0;#5;A=1;B=0;Ci=1;#5;A=1;B=1;Ci=0;#5;$stop;
end
endmodule

1.3 仿真结果

在这里插入图片描述
在这里插入图片描述

2.用四个一位全加器串行成四位加法器

2.1原理

串行进位加法器。采用四个全加器构成四位数加法器。其原理图如图所示,将低位的进位输出信号接到高位的进位输出端。
在这里插入图片描述

2.2代码

2.2.1设计模块

module full_adder(
input A,B,Ci,
output reg S,Co);
/*参数说明:
输入:
A,B为一位二进制被加数,Ci为来自低位的进位
输出:
S为和,Co为进位
*/
always@(*)
begincase({A,B,Ci})3'b000:begin S=0;Co=0; end3'b001:begin S=1;Co=0; end3'b010:begin S=1;Co=0; end3'b011:begin S=0;Co=1; end3'b100:begin S=1;Co=0; end3'b101:begin S=0;Co=1; end3'b110:begin S=0;Co=1; end3'b111:begin S=1;Co=1; endendcase
end
endmodulemodule _4adder(
input [3:0] A,B,
input Ci,
output [3:0] S,
output Co);
/*参数说明:
输入:
A,B为四位二进制被加数,Ci为来自低位的进位
输出:
S为和,Co为进位
*/wire C0,C1,C2;
full_adder U0(A[0],B[0],Ci,S[0],C0);
full_adder U1(A[1],B[1],C0,S[1],C1);
full_adder U2(A[2],B[2],C1,S[2],C2);
full_adder U3(A[3],B[3],C2,S[3],Co);endmodule

2.2.2测试模块

//filename:tb_4adder.v
`timescale 10ns/1ns
module tb_74HC283();
reg [3:0] A,B;
reg Ci;
wire [3:0] S;
wire Co;
/*参数说明:
输入:
A,B为一位二进制被加数,Ci为来自低位的进位
输出:
S为和,Co为进位
*/_74HC283 U(A,B,Ci,S,Co);initial$monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co);
initial
beginA=4'b0000;B=4'b0000;Ci=0;#5;A=4'b0000;B=4'b0000;Ci=1;#5;A=4'b1111;B=4'b1111;Ci=0;#5;A=4'b1111;B=4'b1111;Ci=1;#5;$stop;
end
endmodule

2.3仿真结果

在这里插入图片描述在这里插入图片描述

二.超前四位加法器74HC283

设计思路

行为级建模加法器的功能明晰的,直接列真值表行为级建模,但是在编写过程中发现会出现这样

case({A,B,Ci})9'b0000_0000_0:begin S=4'b0000;Co=0; end9'b0000_0001—0:begin S=4'b0001;Co=0; end
......endcase

case语句会出现512条语句,显然不可取。

数据流建模:
由于串行进位加法器速度受到进位信号的限制。人们又设计出一种多位数超前进位加法逻辑电路。
定义两个中间变量:产生变量Gi,传输变量Pi。这两个变量都与进位信号无关。通过代换将各位进位信号表达为只含有Gi,Pi与Ci-1的逻辑表达式(如下),所以个位的进位信号都只与两个加数和向最低位的进位信号Ci-1有关,因此它们是可以并行产生的。
难点核心体现在这个超前进位产生电路中,上面我们知道超前进位产生电路输入和输出的逻辑表达式之后,采用数据流建模即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.超前进位产生电路

1.1代码实现

1.1.1设计代码

  //filename:ahead_gene_circuit.v
module ahead_gene_circuit(
input [3:0] P,G,
input Ci,
output  [3:0] C);
/*参数说明:
输入:
P,G为定义的中间变量,产生变量Gi,传输变量Pi
Ci为来自低位的进位
输出:
C为各位的进位信号
*/
//根据各位进位信号的逻辑表达式,进行数据流建模。
assign C[0]=G[0]|(P[0]&Ci);
assign C[1]=G[1]|(P[1]&C[0]);
assign C[2]=G[2]|(P[2]&C[1]);
assign C[3]=G[3]|(P[3]&C[2]);
endmodule

1.1.2测试代码

//filename:tb_ahead_gene_circuit.v
`timescale 10ns/1ns
module tb_ahead_gene_circuit();
reg [3:0] P,G;
reg Ci;
wire  [3:0] C;ahead_gene_circuit U(P,G,Ci,C);
initial$monitor($time,"\tP=%b,G=%b,Ci=%b,C=%b",P,G,Ci,C);
initial    beginP=4'b0000;G=4'b0000;Ci=0;#5;P=4'b1111;G=4'b1111;Ci=0;#5;P=4'b1010;G=4'b1010;Ci=0;#5;P=4'b1010;G=4'b1010;Ci=1;#5;$stop;
end
endmodule

1.2 仿真结果

在这里插入图片描述
在这里插入图片描述

2.应用超前进位产生电路设计出74HC283

2.1代码实现

2.1.1设计模块

//filename:ahead_gene_circuit.v
module ahead_gene_circuit(
input [3:0] P,G,
input Ci,
output  [3:0] C);
/*参数说明:
输入:
Pi为传输信号,Gi为产生信号
Ci为对最低位的进位
输出:
C为各位的进位信号
*/
//根据各位进位信号的逻辑表达式,进行数据流建模。
assign C[0]=G[0]|(P[0]&Ci);
assign C[1]=G[1]|(P[1]&C[0]);
assign C[2]=G[2]|(P[2]&C[1]);
assign C[3]=G[3]|(P[3]&C[2]);
endmodulemodule _74HC283(
input [3:0] A,B,
input Ci,
output [3:0] S,
output Co);
/*参数说明:
输入:A,B为被加数;Ci为对最低位的进位
输出:S为和,co为产生的进位信号
*/
//根据中间变量的定义表示出gi和pi。
wire [3:0] P,G,C;
assign P=A^B;
assign G=A&B;
//应用超前进位产生电路。
ahead_gene_circuit U(P,G,Ci,C);assign Co=C[3];
assign S[3]=C[2]^P[3];
assign S[2]=C[1]^P[2];
assign S[1]=C[0]^P[1];
assign S[0]=Ci^P[0];
endmodule

2.1.2测试模块

`timescale 10ns/1ns
module tb2_74HC283();
reg [3:0] A,B;
reg Ci;
wire [3:0] S;
wire Co;_74HC283 U(A,B,Ci,S,Co);
initial$monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co);
initial    beginA=4'b0000;B=4'b0000;Ci=0;#5;A=4'b1111;B=4'b1111;Ci=0;#5;A=4'b1010;B=4'b1010;Ci=0;#5;A=4'b1010;B=4'b1010;Ci=1;#5;$stop;
end
endmodule

2.2仿真结果

在这里插入图片描述
在这里插入图片描述

三.问题与总结

1。对于两个多位二进制数,也可以直接按位或,按位异或等等,不需要对数组一个一个进行或,异或等操作。
2.仿真时,对于多位二进制数进行波形显示时,点击对用变量左侧的加号,将数据波形分开,效果更好。

文章图片来自康华光编写的《电子技术基础——数字部分》


http://www.ppmy.cn/news/547925.html

相关文章

LeetCode:283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: …

LeetCode 283题解

AC 通过 public class LeetCode283 {public void moveZeroes(int[] nums) {int k 0; // nums[0-k] 存储的是 前面k 个不等于 0 的数for(int i 0; i < nums.length; i){if(nums[i]!0){if (k ! i) {// 0 1 2 0 当遍历 到1 时 k 还是0 0 1 交换后是 1 0 此时 k 1int tmp n…

lm283_BP283X 最小输入输出压差和OVP电压的关系

本程序旨在计算当选定开路输出电压时&#xff0c;计算出可以保证系统能 正常保护 的 最小输入输出压差 &#xff1b;(输入电压为Bulk 正常带载输出电压 Vo 150 V 正常带载输出电流 Io 120 mA 输入Bulk电容最大值 Vindc_max 373 V 系统工作频率 Fosc 90 KHz 开路电压 Vovp 200 V…

Imx283 Uboot2017+Linux3/4/5系统内核移植

Imx283 Uboot2017Linux3/4/5系统内核移植 前言 用的周立功的EasyArm283&#xff0c;实习的时候买的&#xff0c;一直没咋弄&#xff0c;前几天突然看到了想玩一下&#xff08;其实最近一直再画板子&#xff0c;想玩一下软件了哈哈&#xff09;&#xff0c;感觉2.34的内核有点…

NAT穿透详解

1.引言 ​ 要实现两台内网主机进行通信&#xff0c;常规的方案如下&#xff1a; 客户端A<------------>服务端<------------>客户端B​ 服务端提供转发监听服务&#xff0c;需要有固定公网IP和端口。客户端A和B分别连接服务端&#xff0c;数据通过服务端进行转发…

lm283_飞利浦LED泛光灯具 BVP283 LED户外照明灯具350W 超高功率泛光灯

飞利浦LED泛光灯具 LED户外照明灯具 BVP283 350W 超高功率泛光灯飞利浦LED泛光灯具 LED户外照明灯具 BVP283 350W 超高功率泛光灯飞利浦LED泛光灯具 LED户外照明灯具 BVP283 350W 超高功率泛光灯 飞利浦超值经济型LED泛光照明方案 Tango G2 LED Extension BVP282:16000lm/20000…

lm283_数电_芯片手册_74LS283

June 1989 54LS283󰁋DM54LS283󰁋DM74LS283 4-Bit Binary Adders with Fast Carry General Description These full adders perform the addition of two 4-bit binary numbers󰀟 The sum ( R ) outputs are provided for each bit and the resultant carry (C4) is obtai…

283

论文阅读备份