加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

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

2013/08/20
1
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

數字邏輯電路分為兩種,分別是組合邏輯與時序邏輯。

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

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

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

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,且優(yōu)先級

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

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

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

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

always塊實現組合邏輯

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

例4:always加法器。

wire a,b,c;

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

      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有變化時,才觸發(fā)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語句描述組合邏輯電路時,應該使用阻塞賦值方式,即“=”,而不是“<=”。

相關推薦

電子產業(yè)圖譜

華清遠見(www.farsight.com.cn)是國內領先嵌入師培訓機構,2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠見除提供嵌入式相關的長期就業(yè)培訓、短期高端培訓、師資培訓及企業(yè)員工內訓等業(yè)務外,其下屬研發(fā)中心還負責嵌入式、Android及物聯網方向的教學實驗平臺的研發(fā)及培訓教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯網相關圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。