<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 設計應用 > VHDL設計進階:邏輯綜合的原則以及可綜合的代碼設計

          VHDL設計進階:邏輯綜合的原則以及可綜合的代碼設計

          作者: 時間:2013-08-27 來源:網絡 收藏

          4.5.1 always塊語言指導原則

          本文引用地址:http://www.ex-cimer.com/article/189515.htm

          使用always塊進行可綜合的時需要注意以下幾個問題。

          (1)每個always塊只能有一個事件控制“@(event-expression)”,而且要緊跟在always關鍵字后面。

          (2)always塊可以表示時序或者組合,也可以用always塊既表示電平敏感的透明鎖存器又同時表示組合。但是不推薦使用這種描述方法,因為這容易產生錯誤和多余的電平敏感的透明鎖存器。

          (3) 帶有posedge 或 negedge 關鍵字的事件表達式表示沿觸發(fā)的時序邏輯;沒有posedge 或negedge關鍵字的表示組合邏輯或電平敏感的鎖存器,或者兩種都表示。在表示時序和組合邏輯的事件控制表達式中如有多個沿和多個電平,其間必須用關鍵字“or” 連接 。

          (4)每個表示時序邏輯的always塊只能由一個時鐘跳變沿觸發(fā),置位或復位最好也由該時鐘跳變沿觸發(fā)。

          (5)每個在always塊中賦值的信號都必需定義成reg型或整型。整型變量缺省為32bit,使用Verilog操作符可對其進行二進制求補的算術運算。綜合器還支持整型量的范圍說明,這樣就允許產生不是32位的整型量,句法結構如下:

          integer[:]。

          (6)always塊中應該避免組合反饋回路。每次執(zhí)行always塊時,在生成組合邏輯的always塊中賦值的所有信號必需都有明確的值;否則需要設計者在設計中加入電平敏感的鎖存器來保持賦值前的最后一個值。

          只有這樣,綜合器才能正常生成電路。如果不這樣做,綜合器會發(fā)出警告,提示設計中插入了鎖存器。如果在設計中存在綜合器認為不是電平敏感鎖存器的組合回路時,綜合器會發(fā)出錯誤信息(例如設計中有異步狀態(tài)機時)。

          用always塊設計純組合邏輯電路時,在生成組合邏輯的always塊中,參與賦值的所有信號都必須有明確的值,即在賦值表達式右端參與賦值的信號都必需在always @(敏感電平列表)中列出。

          如果在賦值表達式右端引用了敏感電平列表中沒有列出的信號,那么在綜合時,將會為該信號產生一個隱含的透明鎖存器。這是因為該信號的變化不會立刻引起所賦值的變化,而必須等到敏感電平列表中某一個信號變化時,它的作用才顯現(xiàn)出來。

          也就是相當于存在著一個透明鎖存器把該信號的變化暫存起來,待敏感電平列表中某一個信號變化時再起作用,純組合邏輯電路不可能做到這一點。這樣,綜合后所得電路已經不是純組合邏輯電路了。這時綜合器會發(fā)出警告提示設計中插入了鎖存器,如下所示:

          input a,b,c;
          reg e,d;
          always @(a or b or c) begin
          e = d a b; //因為d沒有在敏感電平列表中,所以d變化時,e不能立刻變化,
          //要等到a或b或c變化時才體現(xiàn)出來。這就是說實際上相當于存在
          //一個電平敏感的透明鎖存器在起作用, 把d信號的變化鎖存其中
          d = e | c;
          end

          (7)對一個寄存器型(reg)或整型(integer)變量的賦值只允許在一個always塊內進行,如果在另一always塊也對其賦值,這是非法的。
          (8)把某一信號值賦為'bx,綜合器就把它解釋成無關狀態(tài),因而綜合器為其生成的硬件電路最簡潔。


          4.5.2 可綜合風格的Verilog HDL模塊實例
          1.組合邏輯電路設計實例


          例4.6:8位帶進位端的加法器的設計實例(利用簡單的算法描述)。

          module adder_8(cout,sum,a,b,cin); //模塊聲明
          output cout;
          output [7:0] sum;
          input cin;
          input[7:0] a,b; //端口聲明
          assign {cout,sum} = a + b + cin; //加法器算法
          endmodule

          例4.7:指令譯碼電路的設計實例(利用電平敏感的always塊來設計組合邏輯)。

          'define plus 3'd0 //操作碼的宏定義
          'define minus 3'd1
          'define band 3'd2
          'define bor 3'd3'
          'define unegate 3'd4

          module alu(out,opcode,a,b); //模塊聲明
          output [7:0] out;
          input [2:0] opcode;
          input [7:0] a,b; //端口聲明
          reg [7:0] out; //寄存器聲明

          always @(opcode or a or b) begin //用電平敏感的always塊描述組合邏輯
          case(opcode)
          'plus: out = a + b; //算術運算
          'minus: out = a - b;
          'band: out = a b; //位運算
          'bor: out = a | b;
          'unegate: out = ~a; //單目運算
          default: out = 8'hx;
          endcase
          end
          endmodule

          例4.8:比較后重組信號的組合邏輯(利用task和電平敏感的always塊設計)。

          module sort4(ra,rb,rc,rd,a,b,c,d); //模塊聲明
          output [t:0] ra, rb, rc, rd;
          input [t:0] a, b, c, d; //端口聲明
          reg [t:0] ra, rb, rc, rd;
          reg [t:0] va, vb, vc, vd; //寄存器聲明
          parameter t=3; //參數聲明

          always @(a or b or c or d) begin //用電平敏感的always塊描述組合邏輯
          {va,vb,vc,vd}={a,b,c,d};
          sort2(va,vc); //信號重組
          sort2(vb,vd);
          sort2(va,vb);
          sort2(vc,vd);
          sort2(vb,vc);
          {ra,rb,rc,rd}={va,vb,vc,vd};
          end

          task sort2; //x與y互換任務
          inout [t:0] x,y;
          reg [t:0] tmp;
          if(x > y) begin
          tmp = x; //使用臨時變量tmp保存x的值
          x = y;
          y = tmp;
          end
          endtask
          endmodule

          例4.9:比較器的設計實例(利用賦值語句設計組合邏輯)。

          module compare(equal,a,b); //模塊聲明
          output equal;
          input [size-1:0] a,b; //端口聲明
          parameter size=1; //參數聲明
          assign equal =(a==b)? 1 : 0; //比較器
          endmodule

          例4.10:3-8譯碼器設計實例(利用賦值語句設計組合邏輯)。

          module decoder(out,in); //模塊聲明
          output [7:0] out;
          input [2:0] in; //端口聲明
          assign out = 1'b1in; //把最低位的1左移 in(根據從in口輸入的值)位
          //將移位結果賦予out
          endmodule

          例4.11:3-8編碼器的設計實例。
          編碼器設計方案一。

          module encoder1(none_on,out,in); //模塊聲明
          output none_on;
          output [2:0] out;
          input [7:0] in; //端口聲明
          reg [2:0] out;
          reg none_on; //寄存器聲明
          always @(in) begin: local //in有變化時,觸發(fā)
          integer i; //變量聲明
          out = 0;
          none_on = 1; //初始化
          for( i=0; i8; i=i+1 ) begin //for循環(huán)語句
          if( in[i] ) begin //將in中值為1的位編碼
          out = i;
          none_on = 0;
          end
          end
          end
          endmodule


          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();