在使用FPGA的時(shí)候我們經(jīng)常會遇到這樣一個(gè)問題,這個(gè)信號我們到底是定義成wire類型還是定義成reg類型,如果定義不對編譯軟件也會通不過,有時(shí)候你通過編譯軟件的的提示將它改了回來,但你卻并不明白是為什么會報(bào)錯(cuò),而且下次還會再出現(xiàn),當(dāng)它再次出現(xiàn)時(shí),我們又得重復(fù)的去修改,這樣不僅耽誤我們開發(fā)的時(shí)間,而且還影響我們學(xué)習(xí)的心情,所以這篇文章就是幫助你如何正確使用wire和reg來定義一個(gè)信號。
1wire和reg的區(qū)別
我們知道Verilog是硬件描述語言,就是通過描述構(gòu)造底層的硬件電路來實(shí)現(xiàn)我們所需要的功能,那么當(dāng)我們在設(shè)計(jì)數(shù)字電路的過程中經(jīng)常需要將不同的芯片的引腳相互連接起來,而這一個(gè)過程其實(shí)就是wire所定義的變量類型,事實(shí)上當(dāng)你寫下如下語句時(shí)wire busy;
其實(shí)就是將某一連線命名為busy,接下來如何連線,就只需要對busy這個(gè)線型的信號進(jìn)行操作了。而reg類型的變量則不同,他是一個(gè)寄存器類型的變量,寄存器的功能就是可以將我需要的數(shù)據(jù)保存在我的寄存器里面,里面的數(shù)據(jù)也可以根據(jù)我的需要隨時(shí)變化,也就是說當(dāng)你定義一個(gè)需要保存一段時(shí)間的數(shù)據(jù)時(shí),你可以將它定義為一個(gè)寄存器變量,如果當(dāng)你寫下如下語句時(shí),reg busy;
這里就是將busy定義成為一個(gè)寄存器類型的變量,接下來你要如何去操作這個(gè)寄存器,就需要你用別的語句去描述了。綜合來看wire就是給某個(gè)連線取名字,reg就是給某個(gè)寄存器取名字。理解這一點(diǎn)后其實(shí)就很好區(qū)分那個(gè)時(shí)候用wire那個(gè)時(shí)候用reg了。
2什么時(shí)候定義wire型變量
2.1輸入變量input以及雙向變量inout
輸入進(jìn)來的變量都會使用wire來定義,這是因?yàn)閕nput的意思是輸入引腳的意思,你輸入到芯片內(nèi)部的引腳是不可能具有存儲功能的,一般你輸入進(jìn)來的變量都需要去連接到某個(gè)特定位置去參與邏輯運(yùn)算。因此這個(gè)信號也都是做連線使用,所以一般定義為wire。同理inout也是這個(gè)原理必須使用wire來定義。
2.2例化過程中兩個(gè)模塊的連接
在進(jìn)行例化的過程中我們經(jīng)常遇到這種情形,需要將兩個(gè)模塊兒通過線連起來,這個(gè)時(shí)候,我們就需要定義一個(gè)線型的變量,兩段分別連接兩個(gè)模塊所對應(yīng)的引腳。
2.3assign語句被指定的對象也被定義為wire
assign本身的意思就是指定,例如
assign andv = a&b;
其中的意思就是指定andv的值為a&b的值,由于它不受時(shí)鐘的約束,所以他是一個(gè)立即生成的組合邏輯,因此它不需要存儲信號的值,也不能存儲信號的值,因此這種語句在使用時(shí)被指定的信號只能用wire來定義它的變量類型。
2.4 部分output類型的變量
對于FPGA中的輸出頂層只能為wire類型的變量,而被例化的模塊兒內(nèi)部的output既可以為wire型的變量也可以為reg型的變量,這是因?yàn)樵贔PGA內(nèi)部的變量的輸出取決于信號的源頭是從組合電路中輸出的還是從時(shí)序電路中輸出的,無論那種輸出對應(yīng)的外部例化都有一個(gè)線與之連接,而頂層模塊中的output直接是連接到外部的輸出引腳,而這個(gè)輸出的外部的真實(shí)引腳與內(nèi)部的虛擬的信號必須要有一個(gè)信號線連接,所以這種情況就必須使用wire來作為信號的定義。
3什么時(shí)候定義reg型變量
3.1由always引導(dǎo)的時(shí)序邏輯電路
在時(shí)序邏輯電路中,信號不是立即發(fā)生變化,而是在驅(qū)動(dòng)時(shí)鐘到來后才開始變化,這種電路需要臨時(shí)存儲信號的信息,固需要用reg來定義時(shí)序邏輯電路中的變量。
3.2在做仿真是initial中的變量也用reg型變量定義
這是因?yàn)閕nitial中的變量是需要你賦初值的,有初始值就需要你有相應(yīng)的存儲位置,那么這必定是一個(gè)reg類型的變量。文章來源:http://www.zghlxwxcb.cn/news/detail-763017.html
3.3部分output中的變量
在非頂層模塊中的部分output中的變量如果是直接從時(shí)序邏輯電路中運(yùn)算出來的信號,可以直接定義為reg類型的變量輸出,如果直接從組合邏輯電路中輸出來的電路信號則只需要定義成wire類型的變量即可。
總而言之,究竟在什么時(shí)候定義它的數(shù)據(jù)類型,完全取決于它的電路需要,我們上面所總結(jié)的幾種情形是從我需要用在那些情形下,所以在這些情形下我應(yīng)該定義什么樣的參數(shù)類型,這其實(shí)是一種就著結(jié)果看方法的方式,最好的方式應(yīng)該是我需要設(shè)計(jì)的電路電路早已胸有成竹,固我需要什么樣的定義來服務(wù)我的電路。
熟能生巧,當(dāng)你熟悉了以后,什么時(shí)候定義什么變量都是理所應(yīng)當(dāng)。如果覺得我的文章對你有用請給我點(diǎn)贊關(guān)注和收藏,如果有那那些不妥的地方請?jiān)u論指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-763017.html
到了這里,關(guān)于淺顯易懂-Verilog中什么時(shí)候用wire?什么時(shí)候用reg?wire與reg只有又有啥區(qū)別?如何去選擇性的使用呢?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!