灵璧哪有做网站的,网站建设0doit,网店开店流程步骤,网站技术解决方案是什么接前文《【学习笔记】4、组合逻辑电路(上)》
4.4.5 算术运算电路
1. 半加器和全加器
半加器和全加器是算术运算电路中的基本单元。半加器和全加器是1位相加的组合逻辑电路。
#xff08;1#xff09;半加器 半加器#xff1a;只考虑两个加数本身#xff0c;不考虑低位进…接前文《【学习笔记】4、组合逻辑电路(上)》
4.4.5 算术运算电路
1. 半加器和全加器
半加器和全加器是算术运算电路中的基本单元。半加器和全加器是1位相加的组合逻辑电路。
1半加器 半加器只考虑两个加数本身不考虑低位进位。 A、B是两个加数 S表示和数 C表示进位 列出真值表
ABCS0000010110011110
逻辑表达式 S A ‾ B A B ‾ A ⊕ B S\overline{A}BA\overline{B}A⊕B SABABA⊕B//异或 C A B CAB CAB 逻辑图
2全加器
全加器加数A加数B以及低位进位 C i C_i Ci。S表示和数 C o C_o Co表示进位列出真值表
A加数1B加数2 C i 低位进位 C_i低位进位 Ci低位进位 C o 进位 C_o进位 Co进位S和0000001001100011101000101011101011011111
列出逻辑表达式不能直接给出最简形式借助卡诺图。先出现低位C后出现高位A S A ‾ ⋅ B ‾ ⋅ C i A ‾ ⋅ B ⋅ C i ‾ A ⋅ B ‾ ⋅ C i ‾ A B C i A ⊕ B ⊕ C i S\overline{A}·\overline{B}·C_i\overline{A}·B·\overline{C_i}A·\overline{B}·\overline{C_i}ABC_iA⊕B⊕C_i SA⋅B⋅CiA⋅B⋅CiA⋅B⋅CiABCiA⊕B⊕Ci//异或 C o A ‾ ⋅ B ⋅ C i A ⋅ B ‾ ⋅ C i A ⋅ B A ⊕ B ⋅ C i A ⋅ B C_o \overline{A}·B·C_iA·\overline{B}·C_iA·BA⊕B·C_iA·B CoA⋅B⋅CiA⋅B⋅CiA⋅BA⊕B⋅CiA⋅B 2. 多位数加法器
1并行相加串行进位加法
必须在低1位进行完成后才可以进行高1位的加法。先低位相加进位再高位相加。受到进位信号的限制。
2集成4位超前进位加法器 74HC283 考虑到全加器组成的“并行相加串行进位”的缺点设计了新的多位加法逻辑电路。 这里的超前指的是 各个位加法不用等低1位的进位信号提前进行加法。 每位的进位只由加数和被加数决定与低位的进位无关。 前文的全加器逻辑表达式 S A ⊕ B ⊕ C i S A⊕B⊕C_i SA⊕B⊕Ci //这里的i表示输入input C o A ⊕ B ⋅ C i A ⋅ B C_o A⊕B·C_iA·B CoA⊕B⋅CiA⋅B//这里的i表示输入input S i A i ⊕ B i ⊕ C i − 1 S_i A_i⊕B_i⊕C_{i-1} SiAi⊕Bi⊕Ci−1//i表示当前全加器i-1表示前一个全加器 C i A i ⊕ B i ⋅ C i − 1 A i ⋅ B i C_{i} A_i⊕B_i·C_{i-1}A_i·B_i CiAi⊕Bi⋅Ci−1Ai⋅Bi//i表示当前全加器i-1表示前一个全加器 为了只观察进位 C i C_i Ci定义中间变量 G i A i B i P i A i ⊕ B i G_iA_iB_iP_iA_i⊕B_i GiAiBiPiAi⊕Bi,这两个中间变量在计算一开始就已经固定了。 S i P i ⊕ C i − 1 S_i P_i⊕C_{i-1} SiPi⊕Ci−1 C i P i ⋅ C i − 1 G i C_{i} P_i·C_{i-1}G_i CiPi⋅Ci−1Gi 这里重点关注 C i P i ⋅ C i − 1 G i C_{i} P_i·C_{i-1}G_i CiPi⋅Ci−1Gi一个迭代函数。 C 0 G 0 P 0 C − 1 C_0 G_0P_0C_{-1} C0G0P0C−1 C 1 G 1 P 1 C 0 G 1 P 1 ( G 0 P 0 C − 1 ) G 1 P 1 G 0 P 1 P 0 C − 1 C_1 G_1P_1C_{0}G_1P_1(G_0P_0C_{-1})G_1P_1G_0P_1P_0C_{-1} C1G1P1C0G1P1(G0P0C−1)G1P1G0P1P0C−1 C 2 G 2 P 2 C 1 G 2 P 2 ( G 1 P 1 G 0 P 1 P 0 C − 1 ) G 2 P 2 G 1 P 2 P 1 G 0 P 2 P 1 P 0 C − 1 C_2 G_2P_2C_{1}G_2P_2(G_1P_1G_0P_1P_0C_{-1})G_2P_2G_1P_2P_1G_0P_2P_1P_0C_{-1} C2G2P2C1G2P2(G1P1G0P1P0C−1)G2P2G1P2P1G0P2P1P0C−1 C 3 G 3 P 3 C 2 G 3 P 3 ( G 2 P 2 G 1 P 2 P 1 G 0 P 2 P 1 P 0 C − 1 ) G 3 P 3 G 2 P 3 P 2 G 1 P 3 P 2 P 1 G 0 P 3 P 2 P 1 P 0 C − 1 C_3 G_3P_3C_2G_3P_3(G_2P_2G_1P_2P_1G_0P_2P_1P_0C_{-1})G_3P_3G_2P_3P_2G_1P_3P_2P_1G_0P_3P_2P_1P_0C_{-1} C3G3P3C2G3P3(G2P2G1P2P1G0P2P1P0C−1)G3P3G2P3P2G1P3P2P1G0P3P2P1P0C−1根据推导我们可以知道当前加法器的进位信号 C i C_i Ci只和 P i P_i Pi、 G i G_i Gi、初始进位信号 C − 1 C_{-1} C−1有关。 逻辑图。 下图是猜测的74HC283逻辑图。 串联进位级联。 超前进位产生器并不是一个完整的加法器 74LS182
3. 减法运算
补码 N 补码 2 n − N 原码 N_{补码}2^n-N_{原码} N补码2n−N原码补码 N 补码 N 反码 1 N_{补码}N_{反码}1 N补码N反码1将减法变成加法。 A − B A − ( 2 n − B 补 ) A B 补 − 2 n A B 反 1 − 2 n A-BA-(2^n-B_补)AB_补-2^nAB_反1-2^n A−BA−(2n−B补)AB补−2nAB反1−2n 求4位减法的结果补码 A − B A B 反 1 A-BAB_反1 A−BAB反1 结果补码 D 3 : 0 ’ A 3 : 0 ( B 3 : 0 ) 反码 1 C o 为进位信号 结果补码D_{3:0}^’ A_{3:0}(B_{3:0})_{反码}1C_o为进位信号 结果补码D3:0’A3:0(B3:0)反码1Co为进位信号 求结果的原码 结果原码 D 3 : 0 [ 结果补码 D 3 : 0 ’ C o ] − 2 n [ 结果补码 D 3 : 0 ’ C o ] − 2 4 [ 结果补码 D 3 : 0 ’ C o ] − ( 10000 ) b 结果原码D_{3:0}[结果补码D_{3:0}^’C_o] -2^n[结果补码D_{3:0}^’C_o] -2^4[结果补码D_{3:0}^’C_o] -(10000)_b 结果原码D3:0[结果补码D3:0’Co]−2n[结果补码D3:0’Co]−24[结果补码D3:0’Co]−(10000)b已知 结果补码 D 3 : 0 ’ 数值范围是 ( 0000 ) b 到 ( 1111 ) b 结果补码D_{3:0}^’数值范围是(0000)_b到(1111)_b 结果补码D3:0’数值范围是(0000)b到(1111)b。当 C o 1 C_o1 Co1时bit41, 减去 2 n ( 10000 ) b 2^n(10000)_b 2n(10000)b,不需要借位异或0。 中间 D 0 ′ ′ D 0 ′ ⊕ 0 D 0 ′ 中间D_0^{}D_0^{}⊕0D_0^{} 中间D0′′D0′⊕0D0′ 中间 D 1 ′ ′ D 1 ′ ⊕ 0 D 1 ′ 中间D_1^{}D_1^{}⊕0D_1^{} 中间D1′′D1′⊕0D1′ 中间 D 2 ′ ′ D 2 ′ ⊕ 0 D 2 ′ 中间D_2^{}D_2^{}⊕0D_2^{} 中间D2′′D2′⊕0D2′ 中间 D 3 ′ ′ D 3 ′ ⊕ 0 D 3 ′ 中间D_3^{}D_3^{}⊕0D_3^{} 中间D3′′D3′⊕0D3′ 结果原码 D 3 : 0 D 3 : 0 ′ ′ A 3 : 0 ′ ′ 结果补码 D 3 : 0 ′ A 3 : 0 B 3 : 0 反码 1 结果原码D_{3:0}D_{3:0}^{}A_{3:0}^{}结果补码D_{3:0}^{}A_{3:0}B_{3:0}{反码}1 结果原码D3:0D3:0′′A3:0′′结果补码D3:0′A3:0B3:0反码1举例$A≥BA0101B0001 公式计算A-BAB_{反码}1-2^4(0101)_b(1110)_b1-(10000)_b(10100)_b-(10000)_b(00100)_b$ //不需要借位电路逻辑 A − B A 3 : 0 B 3 : 0 反码 1 A-BA_{3:0}B_{3:0}{反码}1 A−BA3:0B3:0反码1 当 C o 0 C_o0 Co0时bit40, 减去 2 n ( 10000 ) b 2^n(10000)_b 2n(10000)b,需要借位异或1。 中间 D 0 ′ ′ D 0 ′ ⊕ 1 ( D 0 ′ ) 反 中间D_0^{}D_0^{}⊕1(D_0^{})_{反} 中间D0′′D0′⊕1(D0′)反 中间 D 1 ′ ′ D 1 ′ ⊕ 1 ( D 1 ′ ) 反 中间D_1^{}D_1^{}⊕1(D_1^{})_{反} 中间D1′′D1′⊕1(D1′)反 中间 D 2 ′ ′ D 2 ′ ⊕ 1 ( D 2 ′ ) 反 中间D_2^{}D_2^{}⊕1(D_2^{})_{反} 中间D2′′D2′⊕1(D2′)反 中间 D 3 ′ ′ D 3 ′ ⊕ 1 ( D 3 ′ ) 反 中间D_3^{}D_3^{}⊕1(D_3^{})_{反} 中间D3′′D3′⊕1(D3′)反 结果原码 D 3 : 0 D 3 : 0 ′ ′ A 3 : 0 ′ ′ C − 1 D 3 : 0 ′ 反码 1 ( A 3 : 0 B 3 : 0 反码 1 ) 反码 1 结果原码D_{3:0}D_{3:0}^{}A_{3:0}^{}C_{-1}D_{3:0}^{}反码1(A_{3:0}B_{3:0}{反码}1)_{反码}1 结果原码D3:0D3:0′′A3:0′′C−1D3:0′反码1(A3:0B3:0反码1)反码1举例 A B A 0001 B 0101 ABA0001B0101 ABA0001B0101 公式计算 A − B A B 反码 1 − 2 4 ( 0001 ) b ( 1010 ) b 1 − ( 10000 ) b ( 01100 ) b − ( 10000 ) b ( 借位 1 ⋅ 01100 ) b − ( 10000 ) b ( 11100 ) b 直接计算得到的就是 − 4 的补码 A-BAB_{反码}1-2^4(0001)_b(1010)_b1-(10000)_b(01100)_b-(10000)_b(借位1·01100)_b-(10000)_b(11100)_b直接计算得到的就是-4的补码 A−BAB反码1−24(0001)b(1010)b1−(10000)b(01100)b−(10000)b(借位1⋅01100)b−(10000)b(11100)b直接计算得到的就是−4的补码电路逻辑: A − B ( A 3 : 0 B 3 : 0 反码 1 ) 反码 1 ( ( 01100 ) b ) 反码 1 ( 10011 ) b 1 ( 1 ⋅ 0100 ) 也就是绝对值 4 符号 V 借位信号 1 为负 − 4 A-B(A_{3:0}B_{3:0}{反码}1)_{反码}1((01100)_b)_{反码}1(10011)_b1(1·0100)也就是绝对值4符号V借位信号1为负-4 A−B(A3:0B3:0反码1)反码1((01100)b)反码1(10011)b1(1⋅0100)也就是绝对值4符号V借位信号1为负−4
4. 集成算术/逻辑单元
算术逻辑单元ALUArithmetic Logic Unit。既支持算术运算又支持逻辑运算。74LS181是双极型ALU。功能引脚MH时执行逻辑运算功能引脚ML时执行算术运算
4.5 组合可编程逻辑器件
4.5.1 PLD的结构、表示方法及分类
1. PLD的结构
PLD可编程逻辑器件基本组成与阵列、或阵列。
2. PLD的表示方法
早期使用熔丝和二极管一次性编程。可擦除CMOS技术使用浮栅技术。
3. PLD的分类
按照集成度划分 低密度1000以下PROM可编程只读存储器、PLA可编程逻辑阵列、PAL可编程阵列逻辑、GAL通用阵列逻辑高密度1000以上CPLD复杂可编程逻辑器件、FPGA现场可编程门阵列 按照结构体系划分 简单PLD复杂可编程逻辑器件CPLD现场可编程逻辑器件FPGA 按照与或阵列是否可编程划分 PROM与阵列固定或阵列可编程PAL和GAL与阵列可编程、或阵列固定。PLA与阵列、或阵列都可以编程。
4.5.2 组合逻辑电路的PLD实现
任何组合逻辑关系都可以变换成 与或 表达式通过PLD的与、或阵列可以实现任何一个逻辑函数。
1. 可编程逻辑阵列PLA
缺少开发环境支持价格贵。 L 0 A ‾ ⋅ B ‾ ⋅ C A ‾ ⋅ B ⋅ C ‾ A ⋅ B ‾ ⋅ C ‾ A B C L_0 \overline{A}·\overline{B}·C\overline{A}·B·\overline{C}A·\overline{B}·\overline{C}ABC L0A⋅B⋅CA⋅B⋅CA⋅B⋅CABC L 1 A B A C B C L_1ABACBC L1ABACBC列出真值表之后可以发现该电路是“全加器”的功能。全加器的逻辑表达式 S A ‾ ⋅ B ‾ ⋅ C i A ‾ ⋅ B ⋅ C i ‾ A ⋅ B ‾ ⋅ C i ‾ A B C i A ⊕ B ⊕ C i S\overline{A}·\overline{B}·C_i\overline{A}·B·\overline{C_i}A·\overline{B}·\overline{C_i}ABC_iA⊕B⊕C_i SA⋅B⋅CiA⋅B⋅CiA⋅B⋅CiABCiA⊕B⊕Ci//异或 C o A ‾ ⋅ B ⋅ C i A ⋅ B ‾ ⋅ C i A ⋅ B A ⊕ B ⋅ C i A ⋅ B C_o \overline{A}·B·C_iA·\overline{B}·C_iA·BA⊕B·C_iA·B CoA⋅B⋅CiA⋅B⋅CiA⋅BA⊕B⋅CiA⋅B 变形 C o A ‾ ⋅ B ⋅ C i A ⋅ B ‾ ⋅ C i A ⋅ B A ‾ ⋅ B ⋅ C i A ⋅ B ‾ ⋅ C i ( A ⋅ B A B C A B C ) 变形C_o \overline{A}·B·C_iA·\overline{B}·C_iA·B\overline{A}·B·C_iA·\overline{B}·C_i(A·BABCABC) 变形CoA⋅B⋅CiA⋅B⋅CiA⋅BA⋅B⋅CiA⋅B⋅Ci(A⋅BABCABC)//吸收律 变形 C o A ‾ ⋅ B ⋅ C i A ⋅ B ‾ ⋅ C i ( A ⋅ B A B C A B C ) ( A ‾ ⋅ B ⋅ C i A B C ) ( A ⋅ B ‾ ⋅ C i A B C ) A B B C i A C i A B 变形C_o \overline{A}·B·C_iA·\overline{B}·C_i(A·BABCABC)(\overline{A}·B·C_iABC)(A·\overline{B}·C_iABC)ABBC_iAC_iAB 变形CoA⋅B⋅CiA⋅B⋅Ci(A⋅BABCABC)(A⋅B⋅CiABC)(A⋅B⋅CiABC)ABBCiACiAB 变形 C o B C i A C i A B 变形C_o BC_iAC_iAB 变形CoBCiACiAB
2.可编程阵列逻辑PAL
与阵列可编程或阵列固定。已知 逻辑表达式使用PAL与阵列实现该功能。一个 或单元 接三个可编程 与单元。没有使用到的与单元需要全接通简化图是“与单元中画一个大的X”因为正反 与 在了一起该支路逻辑值为0。L3有需要4个或输入硬件受限可以使用L0的输出作为两个输入。
4.6 用Verilog HDL描述组合逻辑电路
HDL硬件描述语言
4.6.1 组合逻辑电路的门级建模
verilog语言内置的12个基本门级元件。
分类元件符号功能说明多输入门and与门多输入门nand与非门多输入门or或门多输入门nor或非门多输入门xor异或门多输入门xnor异或非门----------------------------------------------------------------多输出门buf缓冲器多输出门not反相器----------------------------------------------------------------三态门bufif1三态缓冲器if-如果控制信号为1-高电平输出有效 in-out三态门bufif0三态缓冲器 if-如果控制信号为0-低电平输出有效in-out三态门notif1三态反相器if-如果控制信号为1-高电平输出有效in-out三态门notif0三态反相器if-如果控制信号为0-低电平输出有效 in-out)
1. 多输入门 and、nand、or、nor、xor、xnor 只允许一个输出但允许有多个输入。 多输入门的输出端out不可能为高阻状态z。 列出真值表以2输入为例。
and 与门 i n 1 0 in_10 in10 i n 1 1 in_11 in11 i n 1 x in_1x in1x i n 1 z ( 高阻 ) in_1z(高阻) in1z(高阻) i n 2 0 in_20 in200000 i n 2 1 in_21 in210out1xx i n 2 x in_2x in2x0xxx i n 2 z ( 高阻 ) in_2z(高阻) in2z(高阻)0xxx
nand 与非门 i n 1 0 in_10 in10 i n 1 1 in_11 in11 i n 1 x in_1x in1x i n 1 z ( 高阻 ) in_1z(高阻) in1z(高阻) i n 2 0 in_20 in20out1out1out1out1 i n 2 1 in_21 in21out10xx i n 2 x in_2x in2xout1xxx i n 2 z ( 高阻 ) in_2z(高阻) in2z(高阻)out1xxx
or 或门 i n 1 0 in_10 in10 i n 1 1 in_11 in11 i n 1 x in_1x in1x i n 1 z ( 高阻 ) in_1z(高阻) in1z(高阻) i n 2 0 in_20 in200out1xx i n 2 1 in_21 in21out1out1out1out1 i n 2 x in_2x in2xxout1xx i n 2 z ( 高阻 ) in_2z(高阻) in2z(高阻)xout1xx
xor 异或门 i n 1 0 in_10 in10 i n 1 1 in_11 in11 i n 1 x in_1x in1x i n 1 z ( 高阻 ) in_1z(高阻) in1z(高阻) i n 2 0 in_20 in200out1xx i n 2 1 in_21 in21out10xx i n 2 x in_2x in2xxxxx i n 2 z ( 高阻 ) in_2z(高阻) in2z(高阻)xxxx
2. 多输出门 buf缓冲器、not反相器 只能有一个输入但允许多个输出。 列出1个输出的真值表
buf 缓冲器 i n 0 in0 in0 i n 1 in1 in1 i n x inx inx i n z ( 高阻 ) inz(高阻) inz(高阻)输出out101xx
not 反相器 i n 0 in0 in0 i n 1 in1 in1 i n x inx inx i n z ( 高阻 ) inz(高阻) inz(高阻)输出out110xx
3. 三态门 bufif1、bufif0、notif1、notif0 有一个输出一个输入一个控制。 当控制信号为无效时三态门输出高阻状态z。 if1表示高电平时允许输出in-out低电平时输出高阻状态。 if0表示低电平时允许输出in-out高电平时输出高阻状态。 列出真值表
bufif1 缓冲器 控制信号 c t r l 0 控制信号ctrl0 控制信号ctrl0 控制信号 c t r l 1 控制信号ctrl1 控制信号ctrl1 控制信号 c t r l x 控制信号ctrlx 控制信号ctrlx 控制信号 c t r l z ( 高阻 ) 控制信号ctrlz(高阻) 控制信号ctrlz(高阻) 数据输入 i n 0 数据输入in0 数据输入in0outz高阻out0out0或者zout0或者z 数据输入 i n 1 数据输入in1 数据输入in1outz高阻out1out1或者zout1或者z 数据输入 i n x 数据输入inx 数据输入inxoutz高阻xxx 数据输入 i n z ( 高阻 ) 数据输入inz(高阻) 数据输入inz(高阻)outz高阻xxx
notif1 缓冲器 控制信号 c t r l 0 控制信号ctrl0 控制信号ctrl0 控制信号 c t r l 1 控制信号ctrl1 控制信号ctrl1 控制信号 c t r l x 控制信号ctrlx 控制信号ctrlx 控制信号 c t r l z ( 高阻 ) 控制信号ctrlz(高阻) 控制信号ctrlz(高阻) 数据输入 i n 0 数据输入in0 数据输入in0outz高阻out1out1或者zout1或者z 数据输入 i n 1 数据输入in1 数据输入in1outz高阻out0out0或者zout0或者z 数据输入 i n x 数据输入inx 数据输入inxoutz高阻xxx 数据输入 i n z ( 高阻 ) 数据输入inz(高阻) 数据输入inz(高阻)outz高阻xxx
4. 举例
(1) Verilog实现2线-4线译码器
2线-4线译码器使用Verilog语言的门级元件进行描述。 2个数据输入A1和A01个使能输入E4个输出Y3个内部节点使用wire定义。关键字定义多个元件时调用名不能省略多个调用名元件之间必须使用逗号分隔。
//门级Gate-Level
//2线-4线译码器 2-to-4 line decodermodule _2to4decoder(A1,A0,E,Y);input A,B,E; //定义输入信号output [3:0]Y;//定义输出信号wire A1not,A0not,Enot;//内部节点信号//非门not n1(A1not,A1),n2(A0not,A0),n3(Enot,E);//与非门nand n4(Y[0],A1not,A0not,Enot),n5(Y[1],A1not,A0 ,Enot),n6(Y[2],A1 ,A0not,Enot),n7(Y[3],A1 ,A0 ,Enot);endmodule
(2) Verilog实现2选1数据选择器 使用了三态门缓冲器bufif0bufif1。 重点L同时受两路信号驱动。在多驱动元的情况下逻辑值会发生冲突从而产生不确定值。类似于竞争冒险。 在Verilog中 线网 wire用于表示单个门驱动或连续赋值语句驱动的网络数据类型三态线网 tri用来表示多驱动器驱动的网络型数据。当没有定义wire和tri的逻辑强度时在多驱动元的情况下逻辑值会发生冲突从而产生不确定值。
//门级Gate-Level
//2线-1线数据选择器 2-to-1-line multiplexer
module _2to1muxtri(A,B,SEL,L)input A,B,SEL;output L; //定义输出信号tri L;//tri数据类型三态线网多驱动网络类型。bufif1(L,B,SEL);bufif0(L,A,SEL);
endmodule
5. 分层次的电路设计方法简介 自顶而下top-down先定义顶层模块再定义顶层模块用到的子模块。 自底向上bottom-up先定义底层的各个子模块再将子模块组合起来构成顶层模块。 1使用门级元件定义底层的半加器。2调用2个半加器一个或门定义一个全加器。3调用4个1位全加器构成顶层的4位全加器。 上层模块调用下层模块时通过模块名完成调用过程调用名不能省略。 调用模块时按照原来端口的排列顺序可以使用一套新的端口也可以使用同名的旧端口。调用模块时按照端口名称对应下层模块端口名称。顺序任意。 . 下层端口 ( 上层端口 ) − . S ( S 1 ) .下层端口(上层端口)-.S(S1) .下层端口(上层端口)−.S(S1)
verilog实现4位全加器
非超前进位加法器。底层半加器
//半加器
module halfadder(S,C,A,B)input A,B;output S,C;//和xor(S,A,B);//SA⊕B//进位and(C,A,B);//CAB
endmodule2个半加器1个或门1个1位全加器
//全加器
module fulladder(S,CO,A,B,CI)input A,B,CI;output S,CO;wire S1,D1,D2;//计算中间值S1D1halfadder HA1(S1,D1,A,B);//和halfadder HA2(S,D2,S1,CI);//进位or g1(CO,D2,D1);
endmodule4个1位全加器1个4位全加器
module _4bit_adder(S,C3,A,B,C_1)input [3:0]A,B;input C_1;output [3:0]S;output C3;wire C0,C1,C2;//内部进位信号fulladder FA0(S[0],C0,A[0],B[0],C_1),FA1(S[1],C1,A[1],B[1],C0),FA2(S[2],C2,A[2],B[2],C1),FA3(S[3],C3,A[3],B[3],C2);
endmodule4.6.2 组合逻辑电路的数据流建模
门级建模太费事工作效率低。使用数据流建模较高的抽象级别描述电路。通过“综合软件”能够自动转换成门级电路。
1. 运算符
大约30个运算符。
类型分类符号功能说明算术运算符双目运算符二进制加算术运算符双目运算符-二进制减算术运算符双目运算符*二进制乘算术运算符双目运算符/二进制除算术运算符双目运算符%求模--------------------------------------------------------关系运算符双目运算符大于关系运算符双目运算符小于关系运算符双目运算符大于等于关系运算符双目运算符小于等于关系运算符双目运算符等于关系运算符双目运算符!不等于关系运算符双目运算符全等于关系运算符双目运算符!不全等于--------------------------------------------------------位运算符双目运算符~按位取反位运算符双目运算符按位与位运算符双目运算符|按位或位运算符双目运算符^按位异或位运算符双目运算符^~ 或 ~^按位同或--------------------------------------------------------缩位运算符单目运算符缩位与缩位运算符单目运算符~缩位与非缩位运算符单目运算符|缩位或缩位运算符单目运算符~|缩位或非缩位运算符单目运算符^缩位异或缩位运算符单目运算符^~ 或 ~^缩位同或--------------------------------------------------------逻辑运算符-!逻辑非逻辑运算符-逻辑与逻辑运算符-||逻辑或--------------------------------------------------------移位运算符双目运算符右移移位运算符双目运算符左移--------------------------------------------------------位拼接运算符-{ , } { { } }将多个操作数拼接成一个操作数--------------------------------------------------------条件运算符三目运算符?:如果真则否则
2.举例
1连续赋值语句 assign
verilog语言中基本语句是“连续赋值语句”。针对wire型变量进行赋值。这里的“连续”表示持续性赋值而不是一次性。如下所示只要等式右边逻辑值发生变化会立即被计算出并赋值给左边的变量
wire A,B,SEL,L;//4个连线型变量assign L (A~SEL)|(BSEL);//连续赋值
例如1前文门级实现的2-4译码器重新描述如下
module decoder_df(A1,A0,E,Y);input A1,A0,E;output [3:0]Y;assign Y[0] ~(~A1 ~A0 ~E);//000assign Y[1] ~(~A1 A0 ~E);//010assign Y[2] ~( A1 ~A0 ~E);//100assign Y[3] ~( A1 A0 ~E);//110
endmodule数据流与门级建模对比 例如24位全加器重新实现被加数、加数都是4位的如果发生进位结果可能是5位。用{Cout,SUM}拼接起来Cout接收bit4SUM接收bit[3:0]。
module binary_adder(A,B,Cin,SUM,Cout);input [3:0]A,B;input Cin;output [3:0]SUM;output Cout;assign {Cout,SUM} ABCin;
endmodule数据流与门级建模对比 例如32选1数据选择器 使用连续赋值语句
module mux2x1_df(A,B,SEL,L);input A,B,SEL;output L;assign LSEL?A:B;
endmodule数据流与门级建模对比
4.6.3 组合逻辑电路的行为级建模 描述数字逻辑电路的功能和算法。 always是一个循环执行语句后面跟着循环执行条件。 在always结构中逻辑表达式就是一种过程赋值语句。
always ( 循环执行的条件 ) //不加分号“;”
//括号里的任何一个变量发生变化时都会触发执行后面的过程赋值语句。
//执行完最后一句后执行挂起always语句再次等待变量发生变化。
//因此循环执行条件被称为“敏感变量”。
always ( 敏感变量 )
//敏感变量之间使用关键词or代替逻辑或运算“|”always结构过程赋值语句只能给reg类型的变量赋值。 条件语句if-else 多路分支语句case-endcase
1. 条件语句
condition_expr 一般是 逻辑表达式或者关系表达式condition_expr 0xz时按照“假”处理。condition_expr 1按照“真”处理并执行相应的语句。
if(condition_expr) true_statement; if(condition_expr) true_statement;
else fale_statement;if(condition_expr1) true_statement1;
else if(condition_expr2)true_statement2;
else if(condition_expr3)true_statement3;
......
else default_statement;2. 多路分支语句
先计算case_expr的值。每个分支可以是单条语句也可以是多条语句。多条语句时需要用begin和end包围着构成一个整体顺序语句块。每个分支的表达式的值必须不同。执行完某一个分支后case语句结束。不需要break连续几个分支都执行同样的表达式可以用逗号分隔各个分支表达式将执行语句放在其中最后一个表达式的后面。
case(case_expr)
item_expr1: statement1;
item_expr2: statement2;
......
default: default_statement;//可以省略
endcase3. 举例
2选1数据选择器。因为过程赋值语句只能给reg数据赋值所以需要把输出L定义成reg类型。
module mux2to1_bh(A,B,SEL,L)input A,B,SEL;output L;reg L; //always (SEL or A or B) //敏感变量任何一个变化都会触发执行if(SEL 1)LB; //if(SEL) LB;else LA;
endmodule4选1数据选择器
module mux4to1_bh(A,SEL,E,L)input [3:0]A;input [1:0]SEL;input E;output L;reg L; always ( A or SEL or E) //敏感变量任何一个变化都会触发执行begin if(E1) L0; else case(SEL)2d0: LA[0];2d1: LA[1];2d2: LA[2];2d3: LA[3];endcaseend
endmodule