Verilog HDLBits 第八期:3.1.2 Multiplexer
目錄
?前言
3.1.2.1 2 to 1multiplexer(Mux2to1)
Solution:
3.1.2.2 2 to 1 bus multiplexer(Mux2to1v)
Solution:
3.1.2.3 9?to 1multiplexer(Mux9to1v)
Solution:
3.1.2.4 256 to 1multiplexer(Mux256to1)
Solution:
?3.1.2.5 256 to 1 4-bit multiplexer(Mux256to1v)
Solution:
?前言
HDLbits網(wǎng)站如下
Problem sets - HDLBits (01xz.net)
從本期開(kāi)始我們繼續(xù)HDLbits第三章Circuits的學(xué)習(xí),本期的內(nèi)容是3.1.2Multiplexer
3.1.2.1 2 to 1multiplexer(Mux2to1)
創(chuàng)建一個(gè)一位寬的2選1數(shù)據(jù)選擇器。當(dāng)sel=0時(shí),選擇a;當(dāng)sel=1時(shí),選擇b
期望的答案長(zhǎng)度:1行
Hint:三目運(yùn)算符(cond?? iftrue?: iffalse)的可讀性更強(qiáng)
Solution:
module top_module (input a,input b,input sel,output out );assign out = (sel & b) | (~sel & a); // 數(shù)據(jù)選擇器由與門(mén)和或門(mén)表示// 三目運(yùn)算符的可讀性更強(qiáng),特別是面對(duì)向量時(shí):assign out = sel ? b : a;endmodule3.1.2.2 2 to 1 bus multiplexer(Mux2to1v)
創(chuàng)建一個(gè)100位寬的2選1數(shù)據(jù)選擇器。當(dāng)sel=0時(shí),選擇a;當(dāng)sel=1時(shí),選擇b
期望的答案長(zhǎng)度:1行
Hint:三目運(yùn)算符(cond?? iftrue?: iffalse)的可讀性更強(qiáng)
Solution:
module top_module (input [99:0] a,input [99:0] b,input sel,output [99:0] out );assign out = sel ? b : a;// 下面這種形式不能工作:// assign out = (sel & b) | (~sel & a);endmodule本題中,sel是1位向量,而a、b皆是100位向量,使用assign out = (sel & b) | (~sel & a);
sel&b表示b[99:1]并沒(méi)有驅(qū)動(dòng)邏輯,由時(shí)序圖可以看到,out=a
而換成assign out = ({100{sel}} & b) | ({100{~sel}} & a); 可以正常運(yùn)行。
3.1.2.3 9?to 1multiplexer(Mux9to1v)
創(chuàng)建一個(gè)16位寬的9選1數(shù)據(jù)選擇器。當(dāng)sel=0時(shí),選擇a;當(dāng)sel=1時(shí),選擇b,以此類(lèi)推。對(duì)于沒(méi)有用到的項(xiàng)(sel=9到15),所有輸出位都設(shè)為“1”
Hint:對(duì)于這么多選項(xiàng),case語(yǔ)句可能會(huì)很有用
Solution:
module top_module (input [15:0] a,input [15:0] b,input [15:0] c,input [15:0] d,input [15:0] e,input [15:0] f,input [15:0] g,input [15:0] h,input [15:0] i,input [3:0] sel,output logic [15:0] out );// case語(yǔ)句只能在過(guò)程塊(always塊)中使用。這是一個(gè)組合電路,所以使用組合always塊always @(*) beginout = '1; // '1 是所有位都設(shè)為1的特殊文字語(yǔ)法 '0, 'x, 'z 也是有效的// 我習(xí)慣先聲明out的默認(rèn)值,來(lái)代替case語(yǔ)句中的default項(xiàng)case (sel)4'h0: out = a;4'h1: out = b;4'h2: out = c;4'h3: out = d;4'h4: out = e;4'h5: out = f;4'h6: out = g;4'h7: out = h;4'h8: out = i;endcaseendendmodule3.1.2.4 256 to 1multiplexer(Mux256to1)
創(chuàng)建一個(gè)1位寬的256選1數(shù)據(jù)選擇器。256位輸入都打包成一個(gè)256位的輸入向量。sel=0,選擇in[0];sel=1,選擇in[1];sel=2,選擇in[2]
期望的答案長(zhǎng)度:1行
Hint:
- 有了這么多選項(xiàng),case 語(yǔ)句就沒(méi)那么有用了。
- 只要綜合器可以確定所選位的寬度是恒定的,則向量索引可以是可變的。特別是,使用變量索引從向量中選擇一位是可行的。
Solution:
module top_module (input [255:0] in,input [7:0] sel,output out );assign out = in[sel];endmodule?3.1.2.5 256 to 1 4-bit multiplexer(Mux256to1v)
創(chuàng)建一個(gè)4位寬的256選1數(shù)據(jù)選擇器。256個(gè)4bit輸入都打包成一個(gè)1024位的輸入向量。sel=0,選擇in[3:0];sel=1,選擇in[7:4];sel=2,選擇in[11:8]
期望的答案長(zhǎng)度:1-5行
Hint:
- 有了這么多選項(xiàng),case 語(yǔ)句就沒(méi)那么有用了。
- 只要綜合器可以確定所選位的寬度是恒定的,則向量索引可以是可變的。但他并不總是擅長(zhǎng)于此。有error?"... is not a constant",意味著它不能證明選擇寬度是恒定的。特別是 in[ sel*4+3 : sel*4 ] 不起作用。
- 位切片(“索引向量部分選擇”,自 Verilog-2001 起)具有更緊湊的語(yǔ)法。
Solution:
module top_module (input [1023:0] in,input [7:0] sel,output [3:0] out );assign out = {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]};endmodule我們不能部分選擇多個(gè)位,但我們可以一次選擇一位、重復(fù)四次,然后將它們連接在一起。
或者,片選多個(gè)比特的方法有兩種:
- assign out = in[sel*4 +: 4];? //選擇從索引“sel*4”開(kāi)始,然后選擇總寬度為 4 位的 (+:) 索引號(hào)遞增。
- assign out = in[sel*4+3 -: 4];?? ?// 選擇從索引 "sel*4+3" 開(kāi)始,然后選擇總寬度為 4 位的 (-:) 索引號(hào)遞減。
- 請(qǐng)注意:寬度必須是恒定的(本題中是4)
還算比較簡(jiǎn)單,同時(shí)學(xué)習(xí)了片選的新語(yǔ)法
總結(jié)
以上是生活随笔為你收集整理的Verilog HDLBits 第八期:3.1.2 Multiplexer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 4 轮拿下腾讯 Offer (附真题)
- 下一篇: 水文遥测终端(水文遥测终端机)遥测终端机