基礎項目(2)二選一數據選擇器的設計


寫在前面的話

數據選擇器在數字電路設計中的應用尤為廣泛。同時,作為基礎的電路功能單元,也比較適合作為初學者的入門實驗。現在夢翼師兄陪大家一起來設計一個最基礎的數據選擇器。

項目需求

設計一個二選一數據選擇器,然后用一路控制信號選擇輸出數據選通哪一路輸入的數據信號。

 

系統架構

 

模塊功能介紹

模塊名

功能描述

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的輸出結果在時鍾上升沿到來的時候才會變化,輸出的結果被時鍾同步化了。

 

 

 


 

 


免責聲明!

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



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