1. 設計要求:
設計一個4選1多路選擇器,數據輸入有四個,分別是dataa、datab、datac和datad,還需要一個選擇端sel。因為輸入有四路數據,選擇端要求能夠表現出四種狀態,因而選擇端位寬為2bit。
假設dataa、datab、datac和datad都是位寬為8bit的數據,當sel為00時,選擇dataa通過;當sel為01時,選擇datab通過;當sel為10時,選擇datac通過;當sel為11時,選擇datad通過。其系統框圖如下所示:

根據組合邏輯設計規則,將所有的情況全部列出,得出真值表,進而得到布爾表達式。但是現在輸入的組合排列太多了(2的34次冪),不能夠直接得出真值表。
2. 設計實現
(1)將輸入為8的四選一多路選擇器,拆分為8個位寬為1的四選一多路選擇器,首先列出位寬為1真值表,得出位寬為1的四選一多路選擇器。然后並接八個即可。
1 module mux4_1_8bit( 2 3 input wire [7:0] dataa, 4 input wire [7:0] datab, 5 input wire [7:0] datac, 6 input wire [7:0] datad, 7 input wire [1:0] sel, 8 9 output wire [7:0] odata 10 ); 11 12 mux4_1_bit mux4_1_bit_inst0( 13 14 .dataa (dataa[0]), 15 .datab (datab[0]), 16 .datac (datac[0]), 17 .datad (datad[0]), 18 .sel (sel), 19 .odata (odata[0]) 20 21 ); 22 23 mux4_1_bit mux4_1_bit_inst1( 24 25 .dataa (dataa[1]), 26 .datab (datab[1]), 27 .datac (datac[1]), 28 .datad (datad[1]), 29 .sel (sel), 30 .odata (odata[1]) 31 32 ); 33 34 mux4_1_bit mux4_1_bit_inst2( 35 36 .dataa (dataa[2]), 37 .datab (datab[2]), 38 .datac (datac[2]), 39 .datad (datad[2]), 40 .sel (sel), 41 .odata (odata[2]) 42 43 ); 44 45 mux4_1_bit mux4_1_bit_inst3( 46 47 .dataa (dataa[3]), 48 .datab (datab[3]), 49 .datac (datac[3]), 50 .datad (datad[3]), 51 .sel (sel), 52 .odata (odata[3]) 53 54 ); 55 56 mux4_1_bit mux4_1_bit_inst4( 57 58 .dataa (dataa[4]), 59 .datab (datab[4]), 60 .datac (datac[4]), 61 .datad (datad[4]), 62 .sel (sel), 63 .odata (odata[4]) 64 65 ); 66 67 mux4_1_bit mux4_1_bit_inst5( 68 69 .dataa (dataa[5]), 70 .datab (datab[5]), 71 .datac (datac[5]), 72 .datad (datad[5]), 73 .sel (sel), 74 .odata (odata[5]) 75 76 ); 77 78 mux4_1_bit mux4_1_bit_inst6( 79 80 .dataa (dataa[6]), 81 .datab (datab[6]), 82 .datac (datac[6]), 83 .datad (datad[6]), 84 .sel (sel), 85 .odata (odata[6]) 86 87 ); 88 89 mux4_1_bit mux4_1_bit_inst7( 90 91 .dataa (dataa[7]), 92 .datab (datab[7]), 93 .datac (datac[7]), 94 .datad (datad[7]), 95 .sel (sel), 96 .odata (odata[7]) 97 98 ); 99 100 endmodule
1 module mux4_1_bit( 2 3 input wire dataa, 4 input wire datab, 5 input wire datac, 6 input wire datad, 7 input wire [1:0] sel, 8 9 output reg odata 10 ); 11 12 always@(*)begin 13 case(sel) 14 2'b00 : odata = dataa; 15 2'b01 : odata = datab; 16 2'b10 : odata = datac; 17 2'b11 : odata = datad; 18 default : odata = dataa; 19 endcase 20 end 21 22 endmodule
1 `timescale 1ns/1ps 2 3 module mux4_1_8bit_tb(); 4 5 reg [7:0] dataa; 6 reg [7:0] datab; 7 reg [7:0] datac; 8 reg [7:0] datad; 9 reg [1:0] sel; 10 11 wire [7:0] odata; 12 13 14 mux4_1_8bit mux4_1_8bit_inst( 15 .dataa (dataa), 16 .datab (datab), 17 .datac (datac), 18 .datad (datad), 19 .sel (sel), 20 .odata (odata) 21 ); 22 23 initial begin 24 repeat(10)begin 25 dataa = {$random} % 256; 26 datab = {$random} % 256; 27 datac = {$random} % 256; 28 datad = {$random} % 256; 29 sel = {$random} % 4; 30 #20; 31 end 32 end 33 34 endmodule

(2)根據verilog的設計規則,可以直接描述邏輯功能,而不用描述門電路。這種設計規則有利於將設計做的比較大。
1 module mux4_1( 2 3 input wire [7:0] dataa, 4 input wire [7:0] datab, 5 input wire [7:0] datac, 6 input wire [7:0] datad, 7 input wire [1:0] sel, 8 9 output reg [7:0] odata 10 ); 11 12 always@(*)begin 13 case(sel) 14 2'b00 : odata = dataa; 15 2'b01 : odata = datab; 16 2'b10 : odata = datac; 17 2'b11 : odata = datad; 18 default : odata = dataa; 19 endcase 20 end 21 22 endmodule
1 `timescale 1ns/1ps 2 3 module mux4_1_tb(); 4 5 reg [7:0] dataa; 6 reg [7:0] datab; 7 reg [7:0] datac; 8 reg [7:0] datad; 9 reg [1:0] sel; 10 11 wire [7:0] odata; 12 13 14 mux4_1 mux4_1_inst( 15 .dataa (dataa), 16 .datab (datab), 17 .datac (datac), 18 .datad (datad), 19 .sel (sel), 20 .odata (odata) 21 ); 22 23 initial begin 24 repeat(10)begin 25 dataa = {$random} % 256; 26 datab = {$random} % 256; 27 datac = {$random} % 256; 28 datad = {$random} % 256; 29 sel = {$random} % 4; 30 #20; 31 end 32 end 33 34 endmodule

備注:由於本次輸入的的組合太多,不能全覆蓋測試。故采用隨機數來進行測試。
