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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Verilog HDL基礎(chǔ)知識4之wire & reg

          Verilog HDL基礎(chǔ)知識4之wire & reg

          作者: 時(shí)間:2024-02-20 來源:電子森林 收藏

          簡單來說硬件描述語言有兩種用途:1、仿真,2、綜合。

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

          對于,也要從這兩個(gè)角度來考慮。

          從仿真的角度來說,HDL語言面對的是編譯器(如Modelsim等),相當(dāng)于軟件思路。 這時(shí): 對應(yīng)于連續(xù)賦值,如assign

          對應(yīng)于過程賦值,如always,initial

          從綜合的角度來說,HDL語言面對的是綜合器(如DC等),要從電路的角度來考慮。 這時(shí):

          1、型的變量綜合出來一般是一根導(dǎo)線;

          2、變量在always塊中有兩種情況:(1)、always后的敏感表中是(a or b or c)形式的,也就是不帶時(shí)鐘邊沿的,綜合出來還是組合邏輯(2)、always后的敏感表中是(posedge clk)形式的,也就是帶邊沿的,綜合出來一般是時(shí)序邏輯,會包含觸發(fā)器(Flip-Flop)

          在設(shè)計(jì)中,輸入信號一般來說你是不知道上一級是寄存器輸出還是組合邏輯輸出,那么對于本級來說就是一根導(dǎo)線,也就是wire型。而輸出信號則由你自己來決定是寄存器輸出還是組合邏輯輸出,wire型、reg型都可以。但一般的,整個(gè)設(shè)計(jì)的外部輸出(即最頂層模塊的輸出),要求是寄存器輸出,較穩(wěn)定、扇出能力也較好。

          為什么在verilog中要定義wire?

          有幾種情況變量需要定義成wire。

          一、assign 語句
          例如:
          reg a,b;
          wire and_result;
          ...
          assign and_result =a&&b;
          你可以試試把wire定義成reg。綜合器會報(bào)錯。
          二、元件例化時(shí)候的輸出必須用wire
          例如:
          wire dout;
          ram u_ram
          (
          ...
          .out(dout)
          ...
          );
          wire按照國外的教材上面的定義:
          wire為無邏輯連線。只做連線,wire本身是不帶邏輯性的,所以輸入什么輸出就是什么。所以你嘗試著用always語句對wire變量賦值。綜合器就會報(bào)錯。
          那么你可能會問。assign c =a&&b不是就是對wire的賦值嗎?
          其實(shí)并非如此。綜合器綜合時(shí)將a&&b綜合成ab經(jīng)過一個(gè)與門。而c只是連接到與門輸出的線。正真綜合出與門的是&&。而不是c。

          總結(jié)

          大體上來說,wire和reg都類似于C/C++的變量,但若此變量要放在begin…end內(nèi),該變量就需使用reg,在begin…end之外,則使用wire。

          另外使用wire時(shí),需搭配assign;reg則不必。

          input,ouput,inout默認(rèn)值都是wire。

          若wire和reg用錯地方,compiler都會提醒,所以不必太擔(dān)心。

          一個(gè)很重要的觀念,在Verilog中使用reg,並不表示合成后就是寄存器(register)。若在組合電路中使用reg,合成后仍只是net,唯有在循序電路中使用reg,合成后才會以flip-flop形式表示成register。

          Verilog中reg和wire的區(qū)別

          組合邏輯輸出變量,可以直接用assign。

          如果不指定為reg類型,那么就默認(rèn)為1位wire類型,故無需指定1位wire類型的變量。

          專門指定出wire類型,可能是多位或?yàn)槭钩绦蛞鬃x。

          wire只能被assign連續(xù)賦值,reg只能在initial和always中賦值。

          比如:  
           module lddata(clk,rst,cs,din,dout,tmpdata);   input clk, rst,cs;
           input din;
           output dout,tmpdata;
           reg tmpdata;
           always@(posedge clk or negedge rst)
           if(!rst)
               tmpdata <=0;
               else
               tmpdata<= din;
           assign dout = tmpdata|cs;
           endmodule

          其實(shí)他們是不同的抽象級別,wire 如同vhdl中的signal類型,是和實(shí)際的物理連接對應(yīng)的,而reg屬于算法描述層次用的類型,和實(shí)際電路沒有直接的對應(yīng)關(guān)系,也就是說它相當(dāng)于c語言中的變量(int,float等),vhdl中的variable。reg不和實(shí)際的電路如寄存器對應(yīng),高層次的描述時(shí)用。而always其實(shí)算是算法級描述的語句,所以其中的變量必須聲明為reg。

          比如:一個(gè)簡單的組合邏輯的例子,用了reg類型  
          module mux(a,b,c,sel);
           input a,b,sel;
           output c;reg c;
           always @(sel or a or b)
           if(sel ==1'b0) c=a;
           else c=b;
           endmodule;

          這個(gè)綜合出來就是一個(gè)簡單的二選一選擇器,組合邏輯電路。

          看它描述的方式,是不是就是把電路的行為(功能)描述出來了,這種就是算法級描述。

          wire表示直通,即輸入有變化,輸出馬上無條件地反映(如與、非門的簡單連接)。reg表示一定要有觸發(fā),沒有輸入的時(shí)候可以保持原來的值,但不直接實(shí)際的硬件電路對應(yīng)(并非不能生成實(shí)際電路)。

          線網(wǎng)型數(shù)據(jù)包括wire,wand,wor等幾種類型,需要在被一個(gè)或一個(gè)以上驅(qū)動源驅(qū)動時(shí),才能各自決定其不同線網(wǎng)型數(shù)據(jù)的最終值。

          兩者的區(qū)別是:reg寄存器型數(shù)據(jù)保持最后一次的賦值,而wire線網(wǎng)型數(shù)據(jù)需要持續(xù)的驅(qū)動。



          關(guān)鍵詞: FPGA verilog HDL wire reg

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁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); })();