轉自:https://blog.csdn.net/vivid117/article/details/100747939
數字電路基礎知識——組合邏輯電路(數據選擇器MUX、也即多路復用器)
本次介紹數據選擇器的相關知識,數據選擇器在電路設計中尤為重要,尤其是對於在Verilog中的if-else的語法即 o = a?b :c 都可以看到有數據選擇器的使用。
介紹數據選擇器的設計原則以及實例:用Verilog描述一個多路復用器,輸入的通道數目N,每一路的位寬為M。
求log以2為低的整數的算法(使用移位寄存器、數據比較器)
一、二選一數據選擇器(2-1 MUX)
二選一的數據選擇器是最簡單的結構,其邏輯框圖、門級電路、以及真值表如下:
s為0時,A路導通; s為1時,B路導通
二、 用 2輸入mux,實現與,或,非,異或
二選一用Verilog語言描述:
o = s ? a : b;
-
與邏輯:
out = (a == 1’b0)? 1’b0: ((b == 1’b0)? 1’b0: 1’b1);
或
out = (a == 1’b1)? b: 1’b0;
Y=SA+S’B=AB+A’0=AB -
或邏輯:
out = (a == 1’b1)? 1’b1: ((b == 1’b1)? 1’b1: 1’b0);
或
out = (a == 1’b0)? b: 1’b1;
Y=SA+S’B=A’B+A=A+B -
非邏輯:
out = (a == 1’b1)? 1’b0: 1’b1; -
異或
out = (a == 1’b1)? ((b == 1’b1)? 1’b0: 1’b1) : (b);
Y=AB’+A’B
三、 四選一選擇器
在實際的芯片器件中,用的最多的是雙四選一選擇器 74HC153
下圖是內部邏輯電路圖:
四選一只需兩位地址輸入,四個輸入狀態選擇其中一個
而八選一需要三位地址輸入,八個輸入狀態選擇其中一個,利用S’作為第三個地址輸入端
因此可以利用這兩個四選一選擇器接成一個八選一的選擇器
四、用選擇器設計組合邏輯電路
基本原理:
利用如下關系
一個具有n位地址輸入的數據選擇器,可以產生任何形式的
輸入不大於n+1的組合函數
對於下面的邏輯表達式:
即Z=R’(A’G’)+R(A’G)+R((AG’)+1(AG))
當然也可以用R A 作為選通地址,G作為選通端,將函數化簡如下:
Z=(R’A’)G’+(RA’)G+(RA)1
五、例:用Verilog描述一個多路復用器,輸入的通道數目N,每一路的位寬為M。
- 代碼設計如下:
1 module mux 2 #( 3 parameter m = 8, 4 parameter n = 8, 5 parameter width = clogb2(n) 6 ) 7 ( 8 input [n*m-1:0] indata, 9 input [width-1:0] sel, 10 output [m-1:0] outdata 11 ); 12
13 assign outdata = indata[(m*(sel+1)-1)-:m]; 14
15 //------------------------------------------------------- 16 //以下兩個函數任用一個 17 //求2的對數函數
18 function integer log2; 19 input integer value; 20 begin 21 value = value-1; 22 for (log2=0; value>0; log2=log2+1) 23 value = value>>1; 24 end 25
26
27 endfunction 28
29 //求2的對數函數
30 function integer clogb2 (input integer bit_depth); 31 begin 32 for(clogb2=0; bit_depth>0; clogb2=clogb2+1) 33 bit_depth = bit_depth>>1; 34 end 35 endfunction 36
37 endmodule
這里需要注意:
- [n-:m]表示數據位寬為m的從n開始的數據位寬。如reg [6-:3] 表示 reg [6:4]
- 參數傳遞必須時具體數值,如在parameter定義。
- 求log以2為低的整數,具體方法上面用到的是移位寄存器,即將數據向右移位即可以得到所需最大的整數。
也可以利用下面的方法:
1 function integer log2(input integer x); 2 integer i; 3 begin 4 log2 = 1; 5 for (i = 0; 2**i < x; i = i + 1) //不用移位寄存器,只用比較器
6 begin 7 log2 = i + 1; 8 end 9 end 10 endfunction
注: 2**i 表示2i
log2(10)等於4
log2(16)等於4
log2(510001000)等於26
