基於FPGA的4選1多路選擇器設計


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 

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

參考資料:
(1)FPGA零基礎學習:基於FPGA的多路選擇器設計(附代碼) - 知乎 (zhihu.com)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM