HDLBits 是一組小型電路設計習題集,使用 Verilog/SystemVerilog 硬件描述語言 (HDL) 練習數字硬件設計~
網址如下:
https://hdlbits.01xz.net/
關于HDLBits的Verilog實現可以查看下面專欄:
https://www.zhihu.com/column/c_1131528588117385216
縮略詞索引:
SV:SystemVerilog
從今天開始新的一章-Circuits,包括基本邏輯電路、時序電路、組合電路等。
今天更新整個關于卡諾圖部分,數電忘記的,可以先回顧一下。
卡諾圖
簡介
卡諾圖(KM或K -map)是一種簡化布爾代數表達式的方法。Maurice Karnaugh在 1953年為Edward W. Veitch 1952 Veitch 圖做了改進,并介紹了新的Marquand 圖,即我們現在熟知的卡諾圖。
卡諾圖利用人類的模式識別能力減少了對大量計算的需求,還允許快速識別和消除潛在的競爭條件。
所需的布爾結果從真值表轉移到二維網格中,在卡諾圖中,單元格按格雷碼排序,每個單元格位置代表輸入條件的一種組合。單元格也稱為最小項,而每個單元格值代表布爾函數的相應輸出值。識別出最佳的 1 或 0 組,它們表示原始真值表中邏輯的規范形式的項。這些術語可用于編寫表示所需邏輯的最小布爾表達式。
示例
卡諾圖用于簡化布爾代數函數。例如,考慮以下真值表描述的布爾函數。
函數的真值表
序號 | A | B | C | D | f(A,B,C,D) |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 0 |
2 | 0 | 0 | 1 | 0 | 0 |
3 | 0 | 0 | 1 | 1 | 0 |
4 | 0 | 1 | 0 | 0 | 0 |
5 | 0 | 1 | 0 | 1 | 0 |
6 | 0 | 1 | 1 | 0 | 1 |
7 | 0 | 1 | 1 | 1 | 0 |
8 | 1 | 0 | 0 | 0 | 1 |
9 | 1 | 0 | 0 | 1 | 1 |
10 | 1 | 0 | 1 | 0 | 1 |
11 | 1 | 0 | 1 | 1 | 1 |
12 | 1 | 1 | 0 | 0 | 1 |
13 | 1 | 1 | 0 | 1 | 1 |
14 | 1 | 1 | 1 | 0 | 1 |
15 | 1 | 1 | 1 | 1 | 0 |
以下是使用布爾變量A、B、C、D描述未簡化布爾代數中相同函數的兩種不同符號。
mi是要映射的最小項(即,在真值表中輸出為 1 的行)。
mi是要映射的最大項(即,真值表中輸出為 0 的行)
在上面的例子中,四個輸入變量可以用 16 種不同的方式組合,所以真值表有 16 行,卡諾圖有 16 個位置。因此,卡諾圖以 4 × 4 的網格排列。
行和列索引(顯示在卡諾圖的頂部和左側)以格雷碼而不是二進制數字順序排列。格雷碼確保每對相鄰單元之間只有一個變量發生變化。完整卡諾圖的每個單元格都包含一個二進制數字,表示該輸入組合的函數輸出。
分組
在構建卡諾圖之后,它被用來尋找布爾代數最簡單的可能形式之一——規范形式——獲取真值表中的信息。卡諾圖中相鄰的 1 代表簡化表達式的機會。最終表達式的最小項是通過在地圖中圈出 1 組來找到的。Minterm 組必須是矩形的,并且面積必須是 2 的冪(即 1、2、4、8...)。最小項矩形應盡可能大,不包含任何 0。組可以重疊以使每個組更大。下例中的最優分組用綠、紅、藍線標記,紅、綠組重疊。紅色組是一個 2×2 的正方形,綠色組是一個 4×1 的矩形,重疊區域用棕色表示。
單元格通常由描述單元格覆蓋的輸入的邏輯值的簡寫表示。例如,AD表示一個單元格覆蓋了A和D為1的 2x2 區域,即上圖中編號為 13、9、15、11 的單元格。另一方面,A D(非)表示A為真且D為假(即D(非)為真)的單元格。
網格是環形連接的,這意味著矩形組可以環繞邊緣(見圖)。最右邊的單元格實際上與最左邊的單元格“相鄰”,因為相應的輸入值僅相差一位;同樣,最頂端的和最底端的也是如此。因此,A D(非)可以是一個有效術語——它在頂部包括單元格 12 和 8,并環繞到底部以包括單元格 10 和 14——就像B(非) D(非)一樣,它包括四個角。
解決方案
函數 f(A, B, C, D) 的 K-map 顯示為對應于最小項的彩色矩形。棕色區域是紅色 2×2 正方形和綠色 4×1 矩形的重疊部分。f 的倒數的 K-map 顯示為灰色矩形,對應于 maxterms。
一旦構建了卡諾圖并且相鄰的 1 通過矩形和方形框連接起來,就可以通過檢查每個框內哪些變量保持相同來找到代數小項。
對于紅色分組:
A是相同的,并且在整個框中都等于 1,因此它應該包含在紅色最小項的代數表示中。
B不保持相同的狀態(它從 1 變為 0),因此應該被排除在外。
C不變。它始終為 0,因此應包括其補碼 NOT-C。因此,應包括C。
D發生變化,因此被排除在外。
因此,布爾乘積和表達式中的第一個最小項是A C(非)。
對于綠色分組,A和B保持相同的狀態,而C和D改變。B為 0,必須先取反才能包含在內。因此,第二項是A B(非)。請注意,綠色分組與紅色分組重疊是可以接受的。
同樣,藍色分組給出了術語BC D((非))。
將每一組的解組合起來:電路的最后的化簡結果如下:
還有其他方式,就不展開描述了,可以自行學習。
Problem 72-Kmap1
題目說明
根據卡諾圖來實現電路:
圖片來自HDLBits
我們可以嘗試最大項之積和最小項之和的形式來完成電路設計。
模塊端口聲明
moduletop_module( inputa, inputb, inputc, outputout);
題目解析
按照下圖方框化簡:
得到:
f(a,b,c)=a+b+c=a'b'c'(摩根定理)
所以可以有兩種方式解決。
moduletop_module( inputlogica, inputlogicb, inputlogicc, outputlogicout ); assignout=a|b|c; endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 73-Kmap2
題目說明
還是根據卡諾圖來設計電路,本題為4個變量。
圖片來自HDLBits
在編寫verilog之前,我們可先化簡卡諾圖。
模塊端口聲明
moduletop_module( inputa,b,cin, outputcout,sum);
題目解析
根據下圖先化簡卡諾圖得到最小和:
f(a,b,c,d) = a'd'+b'c'+ab'd+bcd
moduletop_module( inputlogica, inputlogicb, inputlogicc, inputlogicd, outputlogicout ); assignout=~a&~d|~b&~c|a&~b&d|b&c&d; endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 74-Kmap3
題目說明
根據卡諾圖實現電路:
圖片來自HDLBits
還是先化簡卡諾圖,其中D為don't care值。相當于X。可以一起圈。
模塊端口聲明
moduletop_module( inputa, inputb, inputc, inputd, outputout);
題目解析
可以這樣圈,進行化簡:
PS:
2^n個方格相鄰的最小項,可以合并成1項,消去n個變量。
moduletop_module( inputlogica, inputlogicb, inputlogicc, inputlogicd, outputlogicout); assignout=a|~b&c; endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 75-Kmap4
題目說明
根據卡諾圖實現電路:
圖片來自HDLBits
模塊端口聲明
moduletop_module( inputa, inputb, inputc, inputd, outputout);
題目解析
這題沒什么能化簡的,就老老實實敲代碼吧。
moduletop_module( inputlogica, inputlogicb, inputlogicc, inputlogicd, outputlogicout ); assignout=~a&b&~c&~d|a&~b&~c&~d|~a&~b&~c&d|a&b&~c&d |~a&b&c&d|a&~b&c&d|~a&~b&c&~d|a&b&c&~d; endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 76-ece241_2013_q2
題目說明
一個4輸入a, b, c, d和一輸出的邏輯電路,當輸入為2, 7或15時,輸出為1, 當輸入為0, 1, 4, 5, 6, 9, 10, 13, 或 14 時,輸出為0,當輸入為3,8,11或12時輸出為任意值。舉例來說,7對應輸入abcd為0,1,1,1.
注意: 該電路的SOP和POS必須均為化簡后的最小值
模塊端口聲明
moduletop_module( inputa, inputb, inputc, inputd, outputout_sop, outputout_pos );
題目解析
直接根據題目做出答案比較難,所以我們需要先根據題目畫出卡諾圖:
SOP圈法就是圈1,如下:
POS圈法就是圈0,如下:
moduletop_module( inputlogica, inputlogicb, inputlogicc, inputlogicd, outputlogicout_sop, outputlogicout_pos ); assignout_sop=c&d|~a&~b&c; assignout_pos=c&(~a|b)&(~b|~c|d); endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中無波形。
這一題就結束了。
Problem 77-m2014 q3
題目說明
還是根據卡諾圖實現電路:
圖片來自HDLBits
模塊端口聲明
moduletop_module( input[4:1]x, outputf);
題目解析
沒什么難度,與其他沒區別。
moduletop_module( inputlogic[4:1]x, outputlogicf); assignf=(~x[1]&x[3])|(x[1]&x[2]&~x[3]); endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中無波形。
這一題就結束了。
Problem 78-2012_q1g
題目說明
還是根據卡諾圖畫出電路:
圖片來自HDLBits
模塊端口聲明
moduletop_module( input[4:1]x, outputf );
題目解析
都是同一個道理。
moduletop_module( inputlogic[4:1]x, outputlogicf ); assignf=~x[2]&~x[4]|~x[1]&x[3]|x[2]&x[3]&x[4]; endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中無波形。
這一題就結束了。
Problem 79-ece241_2014_q3
題目說明
根據題目給出的卡諾圖,用一個4-1的多路選擇器和盡可能多的2-1多路選擇器來實現電路,不允許使用其他邏輯門,必須使用ab作為選擇器的輸入。
圖片來自HDLBits
模塊端口聲明
moduletop_module( inputc, inputd, output[3:0]mux_in );
題目解析
開始題目比較“萌”,因為把東西結合起來了,所以一時難以下手。
這題如果從選擇器入手就比較簡單了,從圖中看到,當ab為固定值,輸出是由cd的輸入決定。
接下來就是看卡諾圖了,從卡諾圖中:
當ab == 2'b00時,化簡卡諾圖,得到mux_in[0] = c+d=cd;
當ab == 2'b01時,化簡卡諾圖,得到mux_in[1] = 1'b0;
當ab == 2'b10時,化簡卡諾圖,得到mux_in[2] = d';
當ab == 2'b11時,化簡卡諾圖,得到mux_in[3] = cd;
此處需注意mux_in[3:0], 一個高位低位的問題,不要搞反了。
moduletop_module( inputlogicc, inputlogicd, outputlogic[3:0]mux_in ); assignmux_in={(c&d),(~d),1'b0,(c|d)}; endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
總結
今天的幾道題就結束了,對于理解卡諾圖化簡的人來說就比較簡單了,沒學過或者忘記的,可以去回顧一下相關知識。整體比較簡單,沒有復雜的代碼,沒有復雜的設計思路,主要在于卡諾圖的理解。
最后我這邊做題的代碼也是個人理解使用,有錯誤歡迎大家批評指正,祝大家學習愉快~
-
卡諾圖
+關注
關注
0文章
14瀏覽量
8641 -
代碼
+關注
關注
30文章
4753瀏覽量
68368 -
選擇器
+關注
關注
0文章
106瀏覽量
14523
原文標題:HDLBits: 在線學習 SystemVerilog(十三)-Problem 72-79(卡諾圖)
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論