寫在前面的話
數據選擇器在數字電路設計中的應用尤為廣泛。同時,作為基礎的電路功能單元,也比較適合作為初學者的入門實驗。現在夢翼師兄陪大家一起來設計一個最基礎的數據選擇器。
項目需求
設計一個二選一數據選擇器,然后用一路控制信號選擇輸出數據選通哪一路輸入的數據信號。
系統架構
模塊功能介紹
模塊名 |
功能描述 |
mux2 |
通過Data_sel 選擇輸出結果的值 |
頂層模塊端口描述
端口名 |
端口說明 |
Data_a |
A通道數據輸入 |
Data_b |
B通道數據輸入 |
Data_out |
數據輸出端 |
Data_sel |
數據選通控制 |
代碼解釋
mux2代碼解釋
/**************************************************** * Engineer : 夢翼師兄 * QQ : 761664056 * The module function:二選一多路器 *****************************************************/ 00 module mux2( 01 data_a, //A通道數據輸入 02 data_b, //B通道數據輸入 03 data_sel, //輸出數據選通信號 04 data_out //數據輸出 05 ); 06 //系統輸入 07 input data_a; //A通道數據輸入 08 input data_b; //B通道數據輸入 09 input data_sel; //輸出數據選通信號 10 //系統輸出 11 output reg data_out;//數據輸出 12 //二選一多路器控制邏輯 13 always@(*) 14 begin 15 if(data_sel)//選通信號為高電平 16 data_out=data_a;//輸出結果為A通道數據 17 else //選通信號為低電平 18 data_out=data_b;//輸出結果為B通道數據 19 end 20 endmodule |
01~05行列出了多路器所有輸入/輸出接口,07~11行定義了端口屬性,13~19行描述了二選一多路器的邏輯功能。
仿真代碼
/**************************************************** * Engineer : 夢翼師兄 * QQ : 761664056 * The module function:多路器測試代碼 *****************************************************/ 00 `timescale 1ns/1ps //仿真時間單位是ns,仿真時間精度是ps 01 module mux2_tb; 02 03 reg data_a, data_b; //仿真激勵數據a,b信號端口 04 reg data_sel; //仿真激勵數據選擇信號端口 05 06 wire data_out; //仿真結果輸出信號 07 08 initial begin 09 data_a = 0; //data_a復初始值等於0 10 data_b = 0; //data_b復初始值等於0 11 data_sel = 0; //data_sel復初始值等於0 12 #200 data_a = 0; data_b = 1; //200ns之后,data_a=0;data_b=1; 13 #200 data_a = 1; data_b = 0; //200ns之后,data_a=1;data_b=0; 14 #200 data_a = 1; data_b = 1; //200ns之后,data_a=1;data_b=1; 15 #200 data_a = 0; data_b = 0; data_sel = 1; //200ns之后,data_a=0;data_b=0;data_sel=1; 16 #200 data_a = 0; data_b = 1; //200ns之后,data_a=0;data_b=1; 17 #200 data_a = 1; data_b = 0; //200ns之后,data_a=1;data_b=0; 18 #200 data_a = 1; data_b = 1; //200ns之后,data_a=1;data_b=1; 19 #400 $stop; //400ns之后,仿真結束 20 end 21 22 mux2 mux2( //把激勵信號送進mux2模塊 23 .data_a(data_a), 24 .data_b(data_b), 25 .data_sel(data_sel), 26 .data_out(data_out) 27 ); 28 29 endmodule |
仿真分析
仿真圖可知,當Data_sel為低電平的時候,Data_out=Data_b,當Data_sel為高電平的時候,Data_out=Data_a,Data_out的輸出由Data_sel的電平來決定,滿足了二選一數據選擇器的要求。
6.1.8 二選一數據寄存
下面我們將二選一數據選擇器的結構改造一下,使二選一數據選擇器的輸出端連接有寄存器
編寫代碼如下
/**************************************************** * Engineer : 夢翼師兄 * QQ : 761664056 * The module function:二選一多路器(帶寄存器輸出) *****************************************************/ 00 module mux2_clk( 01 clk, //時鍾信號輸入 02 rst_n, //復位信號輸入 03 data_a, //數據a輸入 04 data_b, //數據b輸入 05 data_sel, //數據選擇信號 06 data_out //數據輸出 07 ); 08 09 input clk, rst_n; //時鍾信號,復位信號輸入端口 10 input data_a, data_b; //數據a,b端口輸入 11 input data_sel; //數據選擇信號端口 12 13 output data_out; //數據輸出端口 14 15 reg data_out; 16 17 always@(posedge clk or negedge rst_n) //沿觸發檢測 18 begin 19 if(!rst_n) 20 data_out <= 1'd0; //復位初始化 21 else if(data_sel) 22 data_out <= data_a; //當data_sel為高電平,輸出data_a 23 else 24 data_out <= data_b; //當data_sel為低電平,輸出data_b 25 end 26 27 endmodule |
仿真代碼
/**************************************************** * Engineer : 夢翼師兄 * QQ : 761664056 * The module function:二選一多路器測試代碼(帶寄存器輸出) *****************************************************/ 00 `timescale 1ns/1ps //仿真時間單位是ns,仿真時間精度是ps 01 module mux2_clk_tb; 02 03 reg clk, rst_n; //仿真激勵時鍾,復位信號端口 04 reg data_a, data_b; //仿真激勵數據a,b信號端口 05 reg data_sel; //仿真激勵數據選擇信號端口 06 07 wire data_out; //仿真結果輸出信號 08 09 initial begin 10 clk = 0; //時鍾信號初始化 11 rst_n = 0; //復位信號有效 12 data_a = 0; //data_a復初始值等於0 13 data_b = 0; //data_b復初始值等於0 14 data_sel = 0; //data_sel復初始值等於0 15 #200.1 rst_n = 1; //復位結束 16 #200 data_a = 0; data_b = 1; //200ns之后,data_a=0;data_b=1; 17 #200 data_a = 1; data_b = 0; //200ns之后,data_a=1;data_b=0; 18 #200 data_a = 1; data_b = 1; //200ns之后,data_a=1;data_b=1; //200ns之后,data_a=0;data_b=0;data_sel=1; 19 #200 data_a = 0; data_b = 0; data_sel = 1; 20 #200 data_a = 0; data_b = 1; //200ns之后,data_a=0;data_b=1; 21 #200 data_a = 1; data_b = 0; //200ns之后,data_a=1;data_b=0; 22 #200 data_a = 1; data_b = 1; //200ns之后,data_a=1;data_b=1; 23 #400 $stop; //400ns之后,仿真結束 24 end 25 26 always#50 clk = ~clk; //產生1Mhz時鍾信號 27 28 mux2_clk mux2_clk( //把激勵信號送進mux2_clk模塊 29 .clk(clk), 30 .rst_n(rst_n), 31 .data_a(data_a), 32 .data_b(data_b), 33 .data_sel(data_sel), 34 .data_out(data_out) 35 ); 36 37 endmodule |
查看仿真波形如下
由仿真圖可知,當Data_sel的電平發生變化時,Data_out的輸出結果在時鍾上升沿到來的時候才會變化,輸出的結果被時鍾同步化了。