• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > Verilog HDL基礎之:組合邏輯電路的實現(原創)

    Verilog HDL基礎之:組合邏輯電路的實現(原創)

    作者: 時間:2017-06-05 來源:網絡 收藏

    分為兩種,分別是組合邏輯與時序邏輯。

    本文引用地址:http://www.czjhyjcfj.com/article/201706/348845.htm

    (1)組合邏輯:輸出只是當前輸入邏輯電平的函數(有延時),與電路的原始狀態無關的邏輯電路。也就是說,當輸入信號中的任何一個發生變化時,輸出都有可能會根據其變化而變化,但與電路目前所處的狀態沒有任何關系。其中組合邏輯是由與、或、非門組成的網絡。常用的組合電路有:多路器、數據通路開關、加法器、乘法器等。

    (2)時序邏輯:輸出不只是當前輸入的邏輯電平的函數,還與電路目前所處的狀態有關。

    時序邏輯由多個觸發器和多個組合邏輯塊組成的網絡,常用的有:計數器、復雜的數據流動控制邏輯、運算控制邏輯、指令分析和操作控制邏輯等。同步時序邏輯是設計復雜的數字邏輯系統的核心。時序邏輯借助于狀態寄存器記住它目前所處的狀態。在不同的狀態下,即使所有的輸入都相同,其輸出也不一定相同。

    assign語句實現組合邏輯

    組合邏輯電路可以用assign語句實現,例如:

    例1:assign加法器。

    wire a,b,c;

    assign c = a + b; //加法器

    例1實現的是一個簡單的加法器,assign語句也可以實現復雜一些的組合邏輯電路,例如:

    例2:assign選擇器。

    wire a,b,c;

    wire ena;

    assign c = ena ? a : b; //數據選擇器

    例2實現的是一個數據選擇器。如果組合邏輯比較復雜,用assign語句書寫就會比較繁瑣,可讀性較差。例如用assign語句實現一個8選1數據選擇器,如下所示:

    例3:assign 8選1選擇器。

    wire a0,a1,a2,a3,a4,a5,a6,a7,b;

    wire [2:0] addr;

    assign b = //8選1數據選擇器

    (addr == 3’d0) ? a0 :(addr == 3’d1) ? a1 :

    (addr == 3’d2) ? a2 :(addr == 3’d3) ? a3 :

    (addr == 3’d4) ? a4 :(addr == 3’d5) ? a5 :

    (addr == 3’d6) ? a6 : a7;

    //在該表達式中,當addr不等于d0~d6時,b等于a7

    //當addr等于d6時,b等于a6;當addr等于d5時,b等于a5,且優先級

    //高于addr等于d6時的情況,依次類推

    所以復雜的組合邏輯電路最好用always塊實現。

    從上面的幾個例子可以看出,使用assign語句描述組合邏輯電路時,格式為:

    assign 輸出變量 = 輸入變量之間的運算結果;

    always塊實現組合邏輯

    組合邏輯電路也可以用assign語句實現,例如:

    例4:always加法器。

    wire a,b,c;

    always @ (a or b) //當a和b有變化時,觸發加法器操作

    c = a + b;

    上面這個例子實現了一個加法器,如果需要實現一個數據選擇器,可以書寫如下:

    例5:always選擇器。

    wire a,b,c;

    wire ena;

    always @ (a or b or ena) //當a、b和ena有變化時,進行下列操作

    if(ena == 1’b0) c = b;

    else c = a;

    如果想實現一個比較復雜的組合邏輯電路,例如:

    例6:always8選1選擇器。

    wire a0,a1,a2,a3,a4,a5,a6,a7,b;

    wire [2:0] addr;

    always @ (a0 or a1 or a2 or a3 or a4 or a5 or a6 or a7 or addr) begin

    case(addr) //使用case語句實現8選1數據選擇器

    3’d0: b = a0; //只有當a0~a7以及addr有變化時,才觸發case的操作

    3’d1: b = a1;

    3’d2: b = a2;

    3’d3: b = a3;

    3’d4: b = a4;

    3’d5: b = a5;

    3’d6: b = a6;

    3’d7: b = a7;

    endcase

    end

    由于在always塊中可以使用if、case等語句,所以對于復雜的組合邏輯,使用always語句進行描述顯得層次更加清楚,可讀性更強。

    從上面幾個例子可以看出,使用always語句描述組合邏輯電路時,格式為:

    always @ (敏感變量1 or敏感變量2 or敏感變量3 or …) begin

    各種語句的組合

    end

    其中的敏感變量包括所有的會引起輸出變化的輸入變量以及相應的控制變量。另外,使用always語句描述組合邏輯電路時,應該使用阻塞賦值方式,即“=”,而不是“=”。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 阿荣旗| 鄯善县| 高唐县| 丰台区| 大姚县| 海盐县| 阆中市| 台南市| 滁州市| 正蓝旗| 凉城县| 锦州市| 观塘区| 揭阳市| 宣城市| 新宾| 建阳市| 西乡县| 芦溪县| 西乡县| 宣城市| 双峰县| 西青区| 安吉县| 偏关县| 互助| 红桥区| 三穗县| 吉隆县| 隆德县| 荔浦县| 平顺县| 阿拉尔市| 乌恰县| 桦南县| 宜都市| 偃师市| 昌乐县| 阳春市| 遵义县| 邓州市|