Verilog HDL中一個重要的思想就是建模,「建模」顧名思義就是「建立模塊」的意思,在Verilog HDL中,模塊是具有一定功能的電路結構組合。
FPGA的所有設計可以只有一個模塊,也可以模塊嵌套,即頂層模塊由子模塊構成,子模塊又由下級子模塊構成。如下圖所示:
在設計初期就應該做好建模的規劃,也就是模塊的功能劃分。新手在初期設計的電路往往比較簡單,不會涉及很複雜的模塊劃分。
真正做項目時的設計往往都是系統級的,代碼動輒上萬行,項目初期期做好系統規劃,根據功能將系統劃將系統分割成更小的子模塊,並規劃各模塊的介面關係,這樣可以多名工程師分別同時設計不同的子模塊,最後進行聯合調試。
建模技巧還是由對電路系統的功能和結構的熟悉程度決定的。一個好的建模設計要層次清晰,各子模塊功能明確,這樣不僅使自己寫代碼時思路清晰,而且也利於別人閱讀你的代碼。
有的設計師沒有建模的概念,寫出來的代碼只有他自己能夠看得懂,甚至時間長了後自己也看不懂。
無論多麼複雜的系統,總能劃分成多個小的功能模塊。系統的設計可以按照下面三個步驟進行:
(1)把系統劃分成模塊;
(2)規劃各模塊的介面;
(3)對模塊編程並連接各模塊完成系統設計。
教科書中告訴我們FPGA的建模方法有數據流建模、行為建模、結構化建模等,在實際做設計的過程中,我們並不care到底用了什麼樣的建模方法。更多的是根據功能劃分模塊,然後代碼實現各模塊功能。
教科書中還告訴了我們,FPGA的設計流程有自下而上的設計流程和自頂向下的設計流程,兩種方法的區別是先設計最底層子模塊還是先設計頂層模塊。但是在實際的設計過程中,這種概念是很模糊的,初學者不用刻意去在乎。
模塊(module)是verilog最基本的概念,是verilog設計中的基本單元,每個verilog設計的系統中都由若干module組成。
1、模塊的實際意義是代表硬體電路上的邏輯實體。
2、每個模塊都實現特定的功能。
3、模塊之間是並行運行的。
4、模塊是分層的,高層模塊通過調用、連接低層模塊的實例來實現複雜的功能。
5、各模塊連接完成整個系統需要一個頂層模塊(top-module)。
下面是一個我從YouTube上找到的5分鐘介紹Verilog HDL的視頻,我進行了翻譯並添加了字幕,
module是層次化設計的基本構件,下面以視頻中的電路結構為例講解一下Verilog 中module的基本語法結構:
首先,是模塊聲明,我們用module和endmodule關鍵詞來標記模塊的開始和結束,在module和endmodule之間的代碼都是屬於本模塊的
其次,是模塊名,比如這裡我們將這個模塊取名為huamayi,模塊名是例化模塊時的聲明憑證。比如我設計了一種A型號的窗戶,蓋房子時,在房子上放置A窗戶就是例化的過程。
接下來我們將描述模塊的埠列表,我們的電路結構有三個對外埠,每個埠都需要給出一個名稱,我們示例電路的對外埠分別是o,x,y
還需要列出所有埠的輸入輸出類型,也就是埠定義,埠定義有三種:常見的input,output,還有inout。input為輸入埠,output為輸出埠,inout是雙向埠,既能輸出也能輸入,多用數據匯流排。示例電路中output 為o,input 為x,y:代碼表示如下圖
邏輯功能定義,這是一個module最重要的部分,它描述了這個module的功能,在本例子中,通過例化與、或、非門來定義模塊邏輯功能,Verilog中內置了14種基本門級元件,我們可以像例化其他模塊一樣例化與、或、非門,在例化模塊時,需要為例化的模塊指定一個名稱,此名稱在本模塊內是唯一的。
在一座房子裡面可以有兩個相同的模塊都叫窗戶,但名稱不會相同,比如一個叫做卧室窗戶,一個叫做客廳窗戶;同樣的也可以在一個電路中例化一個模塊多次,只要例化後的名字不一樣既可以,比如可以例化兩個或門分別叫o1和o2。在本例子電路中,分別例化了與、或、非門各一個(o1、n1、a1)。
例化完了與、或、非門,還應描述它們在電路中的連接關係,或門的兩個輸入分別連接至電路模塊的輸入端x和y,但是或門的輸出端連接至了與門的輸入,它們之間的連線是個內部信號,需要定義一個wire(線網)信號類型or_wire,那麼這個或門o1的連接關係應該如何表示呢。
在Verilog內置的原語中,規定了基本門元件的信號列表裡輸入在前,輸出在後,
所以或o1的連接關係應該是or o1(or_wire, x, y);
同理,定義wire類型信號not_wire;
非門n1和與門a1的連接關係也確定了:
not n1(not_wire,y);
and a1(o, or_wire, not_wire);
整個電路的Verilog HDL代碼描述到此結束,你可以看到verilog代碼與電路之間有明確的對應關係。
上面的例子是結構級建模方法,最後,我們再以一個半加器行為級建模的例子總結一下Verilog HDL模塊的語法要素:
1.空白符:使用空白符是為了提高可讀性及代碼組織。Verilog忽略空白符,除非用於分開其它的語言標記(注釋和列印輸出)。
2.注釋:注釋語法有兩種
第一種注釋為雙斜杠「//」,只能注釋單行
第二種注釋以「/*」開始,以「*/」結束,可一次注釋多行
3.標識符:標識符是用戶在描述時給Verilog對象起的名字,比如例子中的模塊名huamayi,埠名字x、y、o,以及例化的基本門元件o1、n1、a1等。標識符必須以字母(a-z, A-Z)或( _ )開頭,後面可以是字母、數字、( $ )或( _ )。如下圖中的紅字都是用戶定義的標識符。
4.關鍵字:verilog中定義了一些關鍵字,如module、output、or、wire等,verilog關鍵字區分大小寫,所有關鍵字都要求小寫。在代碼編輯器中,所有的關鍵字會高亮顯示
5.基本門級元件:Verilog HDL中有關門類型的關鍵字共有26個(14個是門級元件,12個為開關級元件)。
但是常用到的只有8個,其他的完全不用掌握。下面列出了八個基本的門類(GATETYPE關鍵字和它們所表示的門的類型:
6.wire與reg:下期講
7.操作符:下期講
8.assign賦值語句:下期講
如果你喜歡我的文章,請關注點贊!
推薦閱讀: