深圳做微信網(wǎng)站設(shè)計軟文推廣多少錢
接前文《【學(xué)習(xí)筆記】4、組合邏輯電路(上)》
4.4.5 算術(shù)運算電路
1. 半加器和全加器
- 半加器和全加器是算術(shù)運算電路中的基本單元。
- 半加器和全加器是1位相加的組合邏輯電路。
(1)半加器
-
半加器:只考慮兩個加數(shù)本身,不考慮低位進位。
-
A、B是兩個加數(shù)
-
S表示和數(shù)
-
C表示進位
-
列出真值表:
A | B | C | S |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
- 邏輯表達式
- S = A  ̄ B + A B  ̄ = A ⊕ B S=\overline{A}B+A\overline{B}=A⊕B S=AB+AB=A⊕B//異或
- C = A B C=AB C=AB
- 邏輯圖
(2)全加器
- 全加器:加數(shù)A,加數(shù)B,以及低位進位 C i C_i Ci?。
- S表示和數(shù)
- C o C_o Co?表示進位
- 列出真值表
A加數(shù)1 | B加數(shù)2 | C i 低位進位 C_i低位進位 Ci?低位進位 | C o 進位 C_o進位 Co?進位 | S和 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
- 列出邏輯表達式
- 不能直接給出最簡形式,借助卡諾圖。(先出現(xiàn)低位C,后出現(xiàn)高位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_i=A⊕B⊕C_i S=A?B?Ci?+A?B?Ci??+A?B?Ci??+ABCi?=A⊕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_i+A·\overline{B}·C_i+A·B=(A⊕B)·C_i+A·B Co?=A?B?Ci?+A?B?Ci?+A?B=(A⊕B)?Ci?+A?B
2. 多位數(shù)加法器
(1)并行相加,串行進位,加法
- 必須在低1位進行完成后,才可以進行高1位的加法。
- 先低位相加,進位,再高位相加。
- 受到進位信號的限制。
(2)集成4位超前進位加法器
-
74HC283
-
考慮到全加器組成的“并行相加,串行進位”的缺點,設(shè)計了新的多位加法邏輯電路。
-
這里的超前,指的是 各個位加法不用等低1位的進位信號,提前進行加法。
-
每位的進位,只由加數(shù)和被加數(shù)決定,與低位的進位無關(guān)。
-
前文的全加器邏輯表達式:
- S = A ⊕ B ⊕ C i S = A⊕B⊕C_i S=A⊕B⊕Ci? //這里的i表示輸入input
- C o = ( A ⊕ B ) ? C i + A ? B C_o =(A⊕B)·C_i+A·B Co?=(A⊕B)?Ci?+A?B//這里的i表示輸入input
- S i = A i ⊕ B i ⊕ C i ? 1 S_i = A_i⊕B_i⊕C_{i-1} Si?=Ai?⊕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 Ci?=(Ai?⊕Bi?)?Ci?1?+Ai??Bi?//i表示當前全加器,i-1表示前一個全加器
-
為了只觀察進位 C i C_i Ci?,定義中間變量 G i = A i B i , P i = A i ⊕ B i G_i=A_iB_i,P_i=A_i⊕B_i Gi?=Ai?Bi?,Pi?=Ai?⊕Bi?,這兩個中間變量,在計算一開始,就已經(jīng)固定了。
- S i = P i ⊕ C i ? 1 S_i = P_i⊕C_{i-1} Si?=Pi?⊕Ci?1?
- C i = P i ? C i ? 1 + G i C_{i} =P_i·C_{i-1}+G_i Ci?=Pi??Ci?1?+Gi?
-
這里重點關(guān)注 C i = P i ? C i ? 1 + G i C_{i} =P_i·C_{i-1}+G_i Ci?=Pi??Ci?1?+Gi?,一個迭代函數(shù)。
- C 0 = G 0 + P 0 C ? 1 C_0 = G_0+P_0C_{-1} C0?=G0?+P0?C?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_1+P_1C_{0}=G_1+P_1(G_0+P_0C_{-1})=G_1+P_1G_0+P_1P_0C_{-1} C1?=G1?+P1?C0?=G1?+P1?(G0?+P0?C?1?)=G1?+P1?G0?+P1?P0?C?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_2+P_2C_{1}=G_2+P_2(G_1+P_1G_0+P_1P_0C_{-1})=G_2+P_2G_1+P_2P_1G_0+P_2P_1P_0C_{-1} C2?=G2?+P2?C1?=G2?+P2?(G1?+P1?G0?+P1?P0?C?1?)=G2?+P2?G1?+P2?P1?G0?+P2?P1?P0?C?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_3+P_3C_2=G_3+P_3(G_2+P_2G_1+P_2P_1G_0+P_2P_1P_0C_{-1})=G_3+P_3G_2+P_3P_2G_1+P_3P_2P_1G_0+P_3P_2P_1P_0C_{-1} C3?=G3?+P3?C2?=G3?+P3?(G2?+P2?G1?+P2?P1?G0?+P2?P1?P0?C?1?)=G3?+P3?G2?+P3?P2?G1?+P3?P2?P1?G0?+P3?P2?P1?P0?C?1?
- 根據(jù)推導(dǎo),我們可以知道,當前加法器的進位信號 C i C_i Ci?,只和 P i P_i Pi?、 G i G_i Gi?、初始進位信號 C ? 1 C_{-1} C?1?有關(guān)。
-
邏輯圖。
-
下圖是猜測的74HC283邏輯圖。
-
串聯(lián)進位,級聯(lián)。
-
超前進位產(chǎn)生器(并不是一個完整的加法器)
- 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-B=A-(2^n-B_補)=A+B_補-2^n=A+B_反+1-2^n A?B=A?(2n?B補?)=A+B補??2n=A+B反?+1?2n
- 求4位減法的結(jié)果補碼: A ? B = A + B 反 + 1 A-B=A+B_反+1 A?B=A+B反?+1
- 結(jié)果補碼 D 3 : 0 ’ = A 3 : 0 + ( B 3 : 0 ) 反碼 + 1 , C o 為進位信號 結(jié)果補碼D_{3:0}^’ = A_{3:0}+(B_{3:0})_{反碼}+1,C_o為進位信號 結(jié)果補碼D3:0’?=A3:0?+(B3:0?)反碼?+1,Co?為進位信號
- 求結(jié)果的原碼
- 結(jié)果原碼 D 3 : 0 = [ 結(jié)果補碼 D 3 : 0 ’ , C o ] ? 2 n = [ 結(jié)果補碼 D 3 : 0 ’ , C o ] ? 2 4 = [ 結(jié)果補碼 D 3 : 0 ’ , C o ] ? ( 10000 ) b 結(jié)果原碼D_{3:0}=[結(jié)果補碼D_{3:0}^’,C_o] -2^n=[結(jié)果補碼D_{3:0}^’,C_o] -2^4=[結(jié)果補碼D_{3:0}^’,C_o] -(10000)_b 結(jié)果原碼D3:0?=[結(jié)果補碼D3:0’?,Co?]?2n=[結(jié)果補碼D3:0’?,Co?]?24=[結(jié)果補碼D3:0’?,Co?]?(10000)b?
- 已知 結(jié)果補碼 D 3 : 0 ’ 數(shù)值范圍是 ( 0000 ) b 到 ( 1111 ) b 結(jié)果補碼D_{3:0}^’數(shù)值范圍是(0000)_b到(1111)_b 結(jié)果補碼D3:0’?數(shù)值范圍是(0000)b?到(1111)b?。
- 當 C o = 1 C_o=1 Co?=1時,bit4=1, 減去 2 n = ( 10000 ) b 2^n=(10000)_b 2n=(10000)b?,不需要借位,異或0。
- 中間 D 0 ′ ′ = D 0 ′ ⊕ 0 = D 0 ′ 中間D_0^{''}=D_0^{'}⊕0=D_0^{'} 中間D0′′?=D0′?⊕0=D0′?;
- 中間 D 1 ′ ′ = D 1 ′ ⊕ 0 = D 1 ′ 中間D_1^{''}=D_1^{'}⊕0=D_1^{'} 中間D1′′?=D1′?⊕0=D1′?;
- 中間 D 2 ′ ′ = D 2 ′ ⊕ 0 = D 2 ′ 中間D_2^{''}=D_2^{'}⊕0=D_2^{'} 中間D2′′?=D2′?⊕0=D2′?;
- 中間 D 3 ′ ′ = D 3 ′ ⊕ 0 = D 3 ′ 中間D_3^{''}=D_3^{'}⊕0=D_3^{'} 中間D3′′?=D3′?⊕0=D3′?;
- 結(jié)果原碼 D 3 : 0 = D 3 : 0 ′ ′ + A 3 : 0 ′ ′ = 結(jié)果補碼 D 3 : 0 ′ = A 3 : 0 + B 3 : 0 反碼 + 1 結(jié)果原碼D_{3:0}=D_{3:0}^{''}+A_{3:0}^{''}=結(jié)果補碼D_{3:0}^{'}=A_{3:0}+B_{3:0}{反碼}+1 結(jié)果原碼D3:0?=D3:0′′?+A3:0′′?=結(jié)果補碼D3:0′?=A3:0?+B3:0?反碼+1
- 舉例:$A≥B,A=0101,B=0001
- 公式計算:A-B=A+B_{反碼}+1-2^4=(0101)_b+(1110)_b+1-(10000)_b=(10100)_b-(10000)_b=(00100)_b$ //不需要借位,
- 電路邏輯: A ? B = A 3 : 0 + B 3 : 0 反碼 + 1 A-B=A_{3:0}+B_{3:0}{反碼}+1 A?B=A3:0?+B3:0?反碼+1
- 當 C o = 0 C_o=0 Co?=0時,bit4=0, 減去 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′?)反?;
- 結(jié)果原碼 D 3 : 0 = D 3 : 0 ′ ′ + A 3 : 0 ′ ′ + C ? 1 = D 3 : 0 ′ 反碼 + 1 = ( A 3 : 0 + B 3 : 0 反碼 + 1 ) 反碼 + 1 結(jié)果原碼D_{3:0}=D_{3:0}^{''}+A_{3:0}^{''}+C_{-1}=D_{3:0}^{'}反碼+1=(A_{3:0}+B_{3:0}{反碼}+1)_{反碼}+1 結(jié)果原碼D3:0?=D3:0′′?+A3:0′′?+C?1?=D3:0′?反碼+1=(A3:0?+B3:0?反碼+1)反碼?+1
- 舉例: A < B , A = 0001 , B = 0101 A<B,A=0001,B=0101 A<B,A=0001,B=0101
- 公式計算: 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-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?B=A+B反碼?+1?24=(0001)b?+(1010)b?+1?(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)_b+1=(1·0100),也就是絕對值=4,符號=V借位信號=1,為負,-4 A?B=(A3:0?+B3:0?反碼+1)反碼?+1=((01100)b?)反碼?+1=(10011)b?+1=(1?0100),也就是絕對值=4,符號=V借位信號=1,為負,?4
4. 集成算術(shù)/邏輯單元
- 算術(shù)邏輯單元ALU(Arithmetic Logic Unit)。既支持算術(shù)運算,又支持邏輯運算。
- 74LS181是雙極型ALU。
- 功能引腳M=H時,執(zhí)行邏輯運算
- 功能引腳M=L時,執(zhí)行算術(shù)運算
4.5 組合可編程邏輯器件
4.5.1 PLD的結(jié)構(gòu)、表示方法及分類
1. PLD的結(jié)構(gòu)
- PLD:可編程邏輯器件
- 基本組成:與陣列、或陣列。
2. PLD的表示方法
- 早期使用熔絲和二極管,一次性編程。
- 可擦除CMOS技術(shù),使用浮柵技術(shù)。
3. PLD的分類
- 按照集成度劃分:
- 低密度(1000以下):PROM可編程只讀存儲器、PLA可編程邏輯陣列、PAL可編程陣列邏輯、GAL通用陣列邏輯
- 高密度(1000以上):CPLD復(fù)雜可編程邏輯器件、FPGA現(xiàn)場可編程門陣列
- 按照結(jié)構(gòu)體系劃分:
- 簡單PLD
- 復(fù)雜可編程邏輯器件CPLD
- 現(xiàn)場可編程邏輯器件FPGA
- 按照與或陣列是否可編程劃分:
- PROM:與陣列固定,或陣列可編程
- PAL和GAL:與陣列可編程、或陣列固定。
- PLA:與陣列、或陣列都可以編程。
4.5.2 組合邏輯電路的PLD實現(xiàn)
- 任何組合邏輯關(guān)系都可以變換成 與或 表達式
- 通過PLD的與、或陣列,可以實現(xiàn)任何一個邏輯函數(shù)。
1. 可編程邏輯陣列PLA
- 缺少開發(fā)環(huán)境支持,價格貴。
- 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 L0?=A?B?C+A?B?C+A?B?C+ABC
- L 1 = A B + A C + B C L_1=AB+AC+BC L1?=AB+AC+BC
- 列出真值表之后,可以發(fā)現(xiàn)該電路是“全加器”的功能。
- 全加器的邏輯表達式:
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_i=A⊕B⊕C_i S=A?B?Ci?+A?B?Ci??+A?B?Ci??+ABCi?=A⊕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_i+A·\overline{B}·C_i+A·B=(A⊕B)·C_i+A·B Co?=A?B?Ci?+A?B?Ci?+A?B=(A⊕B)?Ci?+A?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_i+A·\overline{B}·C_i+A·B=\overline{A}·B·C_i+A·\overline{B}·C_i+(A·B+ABC+ABC) 變形:Co?=A?B?Ci?+A?B?Ci?+A?B=A?B?Ci?+A?B?Ci?+(A?B+ABC+ABC)//吸收律
變形: 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_i+A·\overline{B}·C_i+(A·B+ABC+ABC)=(\overline{A}·B·C_i+ABC)+(A·\overline{B}·C_i+ABC)+AB=BC_i+AC_i+AB 變形:Co?=A?B?Ci?+A?B?Ci?+(A?B+ABC+ABC)=(A?B?Ci?+ABC)+(A?B?Ci?+ABC)+AB=BCi?+ACi?+AB
變形: C o = B C i + A C i + A B 變形:C_o =BC_i+AC_i+AB 變形:Co?=BCi?+ACi?+AB
2.可編程陣列邏輯PAL
- 與陣列可編程,或陣列固定。
- 已知 邏輯表達式,使用PAL與陣列實現(xiàn)該功能。
- 一個 或單元 接三個可編程 與單元。
- 沒有使用到的與單元,需要全接通,簡化圖是“與單元中畫一個大的X”,因為正反 與 在了一起,該支路邏輯值為0。
- L3有需要4個或輸入,硬件受限,可以使用L0的輸出作為兩個輸入。
4.6 用Verilog HDL描述組合邏輯電路
- HDL硬件描述語言
4.6.1 組合邏輯電路的門級建模
- verilog語言內(nèi)置的12個基本門級元件。
分類 | 元件符號 | 功能說明 |
---|---|---|
多輸入門 | and | 與門 |
多輸入門 | nand | 與非門 |
多輸入門 | or | 或門 |
多輸入門 | nor | 或非門 |
多輸入門 | xor | 異或門 |
多輸入門 | xnor | 異或非門 |
------------ | ---------- | ------------------------------------------ |
多輸出門 | buf | 緩沖器 |
多輸出門 | not | 反相器 |
------------ | ---------- | ------------------------------------------ |
三態(tài)門 | bufif1 | 三態(tài)緩沖器,if-如果,控制信號為1-高電平,輸出有效 (in->out) |
三態(tài)門 | bufif0 | 三態(tài)緩沖器 ,if-如果,控制信號為0-低電平,輸出有效(in->out) |
三態(tài)門 | notif1 | 三態(tài)反相器,if-如果,控制信號為1-高電平,輸出有效(in->out) |
三態(tài)門 | notif0 | 三態(tài)反相器,if-如果,控制信號為0-低電平,輸出有效 (in->out) |
1. 多輸入門
-
and、nand、or、nor、xor、xnor
-
只允許一個輸出,但允許有多個輸入。
-
多輸入門的輸出端out,不可能為高阻狀態(tài)z。
-
列出真值表,以2輸入為例。
and 與門 | i n 1 = 0 in_1=0 in1?=0 | i n 1 = 1 in_1=1 in1?=1 | i n 1 = x in_1=x in1?=x | i n 1 = z ( 高阻 ) in_1=z(高阻) in1?=z(高阻) |
---|---|---|---|---|
i n 2 = 0 in_2=0 in2?=0 | 0 | 0 | 0 | 0 |
i n 2 = 1 in_2=1 in2?=1 | 0 | out=1 | x | x |
i n 2 = x in_2=x in2?=x | 0 | x | x | x |
i n 2 = z ( 高阻 ) in_2=z(高阻) in2?=z(高阻) | 0 | x | x | x |
nand 與非門 | i n 1 = 0 in_1=0 in1?=0 | i n 1 = 1 in_1=1 in1?=1 | i n 1 = x in_1=x in1?=x | i n 1 = z ( 高阻 ) in_1=z(高阻) in1?=z(高阻) |
---|---|---|---|---|
i n 2 = 0 in_2=0 in2?=0 | out=1 | out=1 | out=1 | out=1 |
i n 2 = 1 in_2=1 in2?=1 | out=1 | 0 | x | x |
i n 2 = x in_2=x in2?=x | out=1 | x | x | x |
i n 2 = z ( 高阻 ) in_2=z(高阻) in2?=z(高阻) | out=1 | x | x | x |
or 或門 | i n 1 = 0 in_1=0 in1?=0 | i n 1 = 1 in_1=1 in1?=1 | i n 1 = x in_1=x in1?=x | i n 1 = z ( 高阻 ) in_1=z(高阻) in1?=z(高阻) |
---|---|---|---|---|
i n 2 = 0 in_2=0 in2?=0 | 0 | out=1 | x | x |
i n 2 = 1 in_2=1 in2?=1 | out=1 | out=1 | out=1 | out=1 |
i n 2 = x in_2=x in2?=x | x | out=1 | x | x |
i n 2 = z ( 高阻 ) in_2=z(高阻) in2?=z(高阻) | x | out=1 | x | x |
xor 異或門 | i n 1 = 0 in_1=0 in1?=0 | i n 1 = 1 in_1=1 in1?=1 | i n 1 = x in_1=x in1?=x | i n 1 = z ( 高阻 ) in_1=z(高阻) in1?=z(高阻) |
---|---|---|---|---|
i n 2 = 0 in_2=0 in2?=0 | 0 | out=1 | x | x |
i n 2 = 1 in_2=1 in2?=1 | out=1 | 0 | x | x |
i n 2 = x in_2=x in2?=x | x | x | x | x |
i n 2 = z ( 高阻 ) in_2=z(高阻) in2?=z(高阻) | x | x | x | x |
2. 多輸出門
-
buf緩沖器、not反相器
-
只能有一個輸入,但允許多個輸出。
-
列出1個輸出的真值表
buf 緩沖器 | i n = 0 in=0 in=0 | i n = 1 in=1 in=1 | i n = x in=x in=x | i n = z ( 高阻 ) in=z(高阻) in=z(高阻) |
---|---|---|---|---|
輸出out1 | 0 | 1 | x | x |
not 反相器 | i n = 0 in=0 in=0 | i n = 1 in=1 in=1 | i n = x in=x in=x | i n = z ( 高阻 ) in=z(高阻) in=z(高阻) |
---|---|---|---|---|
輸出out1 | 1 | 0 | x | x |
3. 三態(tài)門
-
bufif1、bufif0、notif1、notif0
-
有一個輸出,一個輸入,一個控制。
-
當控制信號為無效時,三態(tài)門輸出高阻狀態(tài)z。
-
if1表示,高電平時允許輸出(in->out),低電平時,輸出高阻狀態(tài)。
-
if0表示,低電平時允許輸出(in->out),高電平時,輸出高阻狀態(tài)。
-
列出真值表
bufif1 緩沖器 | 控制信號 c t r l = 0 控制信號ctrl=0 控制信號ctrl=0 | 控制信號 c t r l = 1 控制信號ctrl=1 控制信號ctrl=1 | 控制信號 c t r l = x 控制信號ctrl=x 控制信號ctrl=x | 控制信號 c t r l = z ( 高阻 ) 控制信號ctrl=z(高阻) 控制信號ctrl=z(高阻) |
---|---|---|---|---|
數(shù)據(jù)輸入 i n = 0 數(shù)據(jù)輸入in=0 數(shù)據(jù)輸入in=0 | out=z(高阻) | out=0 | out=0或者z | out=0或者z |
數(shù)據(jù)輸入 i n = 1 數(shù)據(jù)輸入in=1 數(shù)據(jù)輸入in=1 | out=z(高阻) | out=1 | out=1或者z | out=1或者z |
數(shù)據(jù)輸入 i n = x 數(shù)據(jù)輸入in=x 數(shù)據(jù)輸入in=x | out=z(高阻) | x | x | x |
數(shù)據(jù)輸入 i n = z ( 高阻 ) 數(shù)據(jù)輸入in=z(高阻) 數(shù)據(jù)輸入in=z(高阻) | out=z(高阻) | x | x | x |
notif1 緩沖器 | 控制信號 c t r l = 0 控制信號ctrl=0 控制信號ctrl=0 | 控制信號 c t r l = 1 控制信號ctrl=1 控制信號ctrl=1 | 控制信號 c t r l = x 控制信號ctrl=x 控制信號ctrl=x | 控制信號 c t r l = z ( 高阻 ) 控制信號ctrl=z(高阻) 控制信號ctrl=z(高阻) |
---|---|---|---|---|
數(shù)據(jù)輸入 i n = 0 數(shù)據(jù)輸入in=0 數(shù)據(jù)輸入in=0 | out=z(高阻) | out=1 | out=1或者z | out=1或者z |
數(shù)據(jù)輸入 i n = 1 數(shù)據(jù)輸入in=1 數(shù)據(jù)輸入in=1 | out=z(高阻) | out=0 | out=0或者z | out=0或者z |
數(shù)據(jù)輸入 i n = x 數(shù)據(jù)輸入in=x 數(shù)據(jù)輸入in=x | out=z(高阻) | x | x | x |
數(shù)據(jù)輸入 i n = z ( 高阻 ) 數(shù)據(jù)輸入in=z(高阻) 數(shù)據(jù)輸入in=z(高阻) | out=z(高阻) | x | x | x |
4. 舉例
(1) Verilog實現(xiàn)2線-4線譯碼器
- 2線-4線譯碼器,使用Verilog語言的門級元件進行描述。
- 2個數(shù)據(jù)輸入A1和A0
- 1個使能輸入E
- 4個輸出Y
- 3個內(nèi)部節(jié)點,使用wire定義。
- 關(guān)鍵字定義多個元件時,調(diào)用名不能省略,多個調(diào)用名元件之間必須使用逗號分隔。
//門級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;//內(nèi)部節(jié)點信號//非門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實現(xiàn)2選1數(shù)據(jù)選擇器
-
使用了三態(tài)門緩沖器bufif0,bufif1。
-
重點:L同時受兩路信號驅(qū)動。在多驅(qū)動元的情況下邏輯值會發(fā)生沖突,?從而產(chǎn)生不確定值。?類似于競爭冒險。
-
在Verilog中:
- 線網(wǎng) wire:用于表示單個門驅(qū)動或連續(xù)賦值語句驅(qū)動的網(wǎng)絡(luò)數(shù)據(jù)類型,?
- 三態(tài)線網(wǎng) tri:用來表示多驅(qū)動器驅(qū)動的網(wǎng)絡(luò)型數(shù)據(jù)。?
- 當沒有定義wire和tri的邏輯強度時,?在多驅(qū)動元的情況下邏輯值會發(fā)生沖突,?從而產(chǎn)生不確定值。?
//門級Gate-Level
//2線-1線數(shù)據(jù)選擇器 2-to-1-line multiplexer
module _2to1muxtri(A,B,SEL,L)input A,B,SEL;output L; //定義輸出信號tri L;//tri數(shù)據(jù)類型(三態(tài)線網(wǎng)),多驅(qū)動網(wǎng)絡(luò)類型。bufif1(L,B,SEL);bufif0(L,A,SEL);
endmodule
5. 分層次的電路設(shè)計方法簡介
-
自頂而下(top-down):先定義頂層模塊,再定義頂層模塊用到的子模塊。
-
自底向上(bottom-up):先定義底層的各個子模塊,再將子模塊組合起來,構(gòu)成頂層模塊。
- (1)使用門級元件定義底層的半加器。
- (2)調(diào)用2個半加器+一個或門,定義一個全加器。
- (3)調(diào)用4個1位全加器,構(gòu)成頂層的4位全加器。
-
上層模塊調(diào)用下層模塊時,通過模塊名完成調(diào)用過程,調(diào)用名不能省略。
- 調(diào)用模塊時,按照原來端口的排列順序,可以使用一套新的端口,也可以使用同名的舊端口。
- 調(diào)用模塊時,按照端口名稱,對應(yīng)下層模塊端口名稱。順序任意。 " . 下層端口 ( 上層端口 ) ? > . S ( S 1 ) " ".下層端口(上層端口)->.S(S1)" ".下層端口(上層端口)?>.S(S1)"
verilog實現(xiàn)4位全加器
- 非超前進位加法器。
- 底層半加器
//半加器
module halfadder(S,C,A,B)input A,B;output S,C;//和xor(S,A,B);//S=A⊕B//進位and(C,A,B);//C=AB
endmodule
- 2個半加器+1個或門=1個1位全加器
//全加器
module fulladder(S,CO,A,B,CI)input A,B,CI;output S,CO;wire S1,D1,D2;//計算中間值S1,D1halfadder HA1(S1,D1,A,B);//和halfadder HA2(S,D2,S1,CI);//進位or g1(CO,D2,D1);
endmodule
- 4個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;//內(nèi)部進位信號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);
endmodule
4.6.2 組合邏輯電路的數(shù)據(jù)流建模
- 門級建模太費事,工作效率低。
- 使用數(shù)據(jù)流建模,較高的抽象級別,描述電路。
- 通過“綜合軟件”,能夠自動轉(zhuǎn)換成門級電路。
1. 運算符
- 大約30個運算符。
類型 | 分類 | 符號 | 功能說明 |
---|---|---|---|
算術(shù)運算符 | 雙目運算符 | + | 二進制加 |
算術(shù)運算符 | 雙目運算符 | - | 二進制減 |
算術(shù)運算符 | 雙目運算符 | * | 二進制乘 |
算術(shù)運算符 | 雙目運算符 | / | 二進制除 |
算術(shù)運算符 | 雙目運算符 | % | 求模 |
------------ | ---------- | ----------------- | ----------------- |
關(guān)系運算符 | 雙目運算符 | > | 大于 |
關(guān)系運算符 | 雙目運算符 | < | 小于 |
關(guān)系運算符 | 雙目運算符 | >= | 大于等于 |
關(guān)系運算符 | 雙目運算符 | <= | 小于等于 |
關(guān)系運算符 | 雙目運算符 | == | 等于 |
關(guān)系運算符 | 雙目運算符 | != | 不等于 |
關(guān)系運算符 | 雙目運算符 | === | 全等于 |
關(guān)系運算符 | 雙目運算符 | !== | 不全等于 |
------------ | ---------- | ----------------- | ----------------- |
位運算符 | 雙目運算符 | ~ | 按位取反 |
位運算符 | 雙目運算符 | & | 按位與 |
位運算符 | 雙目運算符 | | | 按位或 |
位運算符 | 雙目運算符 | ^ | 按位異或 |
位運算符 | 雙目運算符 | ^~ 或 ~^ | 按位同或 |
------------ | ---------- | ----------------- | ----------------- |
縮位運算符 | 單目運算符 | & | 縮位與 |
縮位運算符 | 單目運算符 | ~& | 縮位與非 |
縮位運算符 | 單目運算符 | | | 縮位或 |
縮位運算符 | 單目運算符 | ~| | 縮位或非 |
縮位運算符 | 單目運算符 | ^ | 縮位異或 |
縮位運算符 | 單目運算符 | ^~ 或 ~^ | 縮位同或 |
------------ | ---------- | ----------------- | ----------------- |
邏輯運算符 | - | ! | 邏輯非 |
邏輯運算符 | - | && | 邏輯與 |
邏輯運算符 | - | || | 邏輯或 |
------------ | ---------- | ----------------- | ----------------- |
移位運算符 | 雙目運算符 | >> | 右移 |
移位運算符 | 雙目運算符 | << | 左移 |
------------ | ---------- | ----------------- | ----------------- |
位拼接運算符 | - | { , } { { } } | 將多個操作數(shù)拼接成一個操作數(shù) |
------------ | ---------- | ----------------- | ----------------- |
條件運算符 | 三目運算符 | ?: | 如果真,則,否,則 |
2.舉例
(1)連續(xù)賦值語句 assign
- verilog語言中,基本語句是“連續(xù)賦值語句”。
- 針對wire型變量進行賦值。
- 這里的“連續(xù)”,表示持續(xù)性賦值,而不是一次性。
- 如下所示,只要等式右邊邏輯值發(fā)生變化,會立即被計算出,并賦值給左邊的變量
wire A,B,SEL,L;//4個連線型變量assign L = (A&~SEL)|(B&SEL);//連續(xù)賦值
- 例如1:前文門級實現(xiàn)的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
- 數(shù)據(jù)流與門級建模對比
- 例如2,4位全加器,重新實現(xiàn):
- 被加數(shù)、加數(shù)都是4位的,如果發(fā)生進位,結(jié)果可能是5位。
- 用{Cout,SUM}拼接起來,Cout接收bit4,SUM接收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} = A+B+Cin;
endmodule
-
數(shù)據(jù)流與門級建模對比
-
例如3,2選1數(shù)據(jù)選擇器
-
使用連續(xù)賦值語句
module mux2x1_df(A,B,SEL,L);input A,B,SEL;output L;assign L=SEL?A:B;
endmodule
- 數(shù)據(jù)流與門級建模對比
4.6.3 組合邏輯電路的行為級建模
-
描述數(shù)字邏輯電路的功能和算法。
-
always是一個循環(huán)執(zhí)行語句,后面跟著循環(huán)執(zhí)行條件。
-
在always結(jié)構(gòu)中,邏輯表達式就是一種過程賦值語句。
always @( 循環(huán)執(zhí)行的條件 ) //不加分號“;”
//括號里的任何一個變量發(fā)生變化時,都會觸發(fā)執(zhí)行后面的過程賦值語句。
//執(zhí)行完最后一句后,執(zhí)行掛起,always語句再次等待變量發(fā)生變化。
//因此,循環(huán)執(zhí)行條件被稱為,“敏感變量”。
always @( 敏感變量 )
//敏感變量之間,使用關(guān)鍵詞or,代替邏輯或運算“|”
-
always結(jié)構(gòu),過程賦值語句,只能給reg類型的變量賦值。
-
條件語句(if-else)
-
多路分支語句(case-endcase)
1. 條件語句
- condition_expr 一般是 邏輯表達式或者關(guān)系表達式
- condition_expr = 0,x,z時,按照“假”處理。
- condition_expr = 1,按照“真”處理,并執(zhí)行相應(yīng)的語句。
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包圍著,構(gòu)成一個整體(順序語句塊)。
- 每個分支的表達式的值,必須不同。執(zhí)行完某一個分支后,case語句結(jié)束。(不需要break)
- 連續(xù)幾個分支,都執(zhí)行同樣的表達式,可以用逗號分隔各個分支表達式,將執(zhí)行語句放在其中最后一個表達式的后面。
case(case_expr)
item_expr1: statement1;
item_expr2: statement2;
......
default: default_statement;//可以省略
endcase
3. 舉例
- 2選1數(shù)據(jù)選擇器。
- 因為過程賦值語句,只能給reg數(shù)據(jù)賦值,所以需要把輸出L定義成reg類型。
module mux2to1_bh(A,B,SEL,L)input A,B,SEL;output L;reg L; //always @(SEL or A or B) //敏感變量,任何一個變化,都會觸發(fā)執(zhí)行if(SEL == 1)L=B; //if(SEL) L=B;else L=A;
endmodule
- 4選1數(shù)據(jù)選擇器
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) //敏感變量,任何一個變化,都會觸發(fā)執(zhí)行begin if(E==1) L=0; else case(SEL)2'd0: L=A[0];2'd1: L=A[1];2'd2: L=A[2];2'd3: L=A[3];endcaseend
endmodule