Verilog HDL 快速入门
Verilog HDL 快速入門
Verilog HDL是一種硬件描述語言(HDL:Hardware Description Language),它是以文本形式來描述數(shù)字系統(tǒng)硬件的結(jié)構(gòu)和行為的語言。 世界上最流行的兩種硬件描述語言是Verilog HDL和VHDL。
注意,VerilogHDL是一種描述語言,它和常見的編程語言C有根本的不同。C語言,讓計(jì)算機(jī)的CPU從上往下按順序執(zhí)行每一條指令,執(zhí)行完程序就結(jié)束了。
而,VerilogHDL主要是描述了一個(gè)數(shù)字模塊的結(jié)構(gòu),或者行為。有點(diǎn)像商業(yè)合同,合同里面也會(huì)描述產(chǎn)品的結(jié)構(gòu),產(chǎn)品的功能等等。合同的每一個(gè)條款,并不需要嚴(yán)格的先后順序,只要把項(xiàng)目的方方面面都考慮完整,寫下來就OK了。VerilogHDL也是這樣。
我們用VerilogHDL描述數(shù)字模塊的功能,剩下的交給編譯器(如,Quartus),編譯器會(huì)根據(jù)我們的要求設(shè)計(jì)重構(gòu)FPGA內(nèi)部硬件。對(duì)于大批懶人來說,這技術(shù)簡直碉堡了。這就是EDA(Electronic Design Automation,電子設(shè)計(jì)自動(dòng)化)。
好,下面就來認(rèn)識(shí)一下VerilogHDL
我們先設(shè)計(jì)一個(gè)“數(shù)據(jù)選擇器”:
s是數(shù)據(jù)選擇控制端,
a,b是輸入信號(hào),y是輸出信號(hào)
代碼如下:
每個(gè)Verilog文件中都有一個(gè)module 開始,endmodule 結(jié)束的代碼塊。
這個(gè)代碼塊的定義了一個(gè)名字叫 mux2_1 的模塊,模塊名后面緊跟的括號(hào)內(nèi)寫明了該模塊的接口信號(hào),相當(dāng)于數(shù)字器件的引腳。
但是括號(hào)內(nèi)沒有說明接口的信號(hào)方向,所以緊跟著另起一行用input 和output 再說明一下。注釋和C語法一樣,可以用// 或 /* */ 。
assign 是Verilog的關(guān)鍵詞,書上稱為連續(xù)賦值。我一般把他視為“連線”操作,assign后面的緊跟的 y 在硬件上是一根導(dǎo)線(或輸出引腳)。
assign y = (s == 0) ? a : b;
這句話的意思是:s如果為0,那么等號(hào)左邊就是a,否則就是b。將這個(gè)表達(dá)式的輸出結(jié)果接在輸出引腳 y 上。
這就是一個(gè)簡單的Verilog程序,不需要我們?nèi)ピO(shè)計(jì)與非門,直接表達(dá)你的你想要的功能就好了。然后,編譯下載到FPGA,功能就實(shí)現(xiàn)了。
要注意的是,assign 后面永遠(yuǎn)跟著一個(gè) =,它們是一起使用的。
即,assign xx = zz;
上面的2選1數(shù)據(jù)選擇器,內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)如下:
所以,上面的assign語句還可以這樣寫,直接使用邏輯表達(dá)式:
assign y = (a & (~ s)) | (b & s);
這個(gè)是在門級(jí)對(duì)邏輯關(guān)系進(jìn)行描述,所以不屬于行為描述,算是結(jié)構(gòu)描述吧。下面這種描述方式,叫做門原語,算結(jié)構(gòu)描述。這里的關(guān)鍵詞wire 表示電路中的導(dǎo)線(信號(hào)線)。
看,這是告訴我們電路中有什么元器件,又是怎么連接的,所以這個(gè)屬于結(jié)構(gòu)描述。
很明顯,有時(shí)候結(jié)構(gòu)描述比行為描述要費(fèi)力得多,而且不太容易理解程序功能。
另外,上面的這個(gè)程序中,這4個(gè)邏輯門的順序,可以隨便寫,不用管先后順序。
這個(gè)數(shù)據(jù)選擇器,還可以使用如下行為描述方法:
module mux2_1(a, b, s, y);input a, b, s; output y; reg y; //reg 表示寄存器always @(a, b, s)beginif(!s) y = a;else y = b;end endmodule這里reg表示寄存器(存儲(chǔ)器),需要提醒一下的是,assign后面只能接wire型,不能接reg型。(當(dāng)然output從物理上也是wire)
為什么不能?因?yàn)榧拇嫫鞯馁x值除了需要輸入信號(hào),還需要觸發(fā)信號(hào)(例如D觸發(fā)器寄存器),assign?sorry,he can’t。
always @(a, b, s)中,括號(hào)里面的輸入信號(hào)a,b,s表示敏感信號(hào)。
always @( ) 是連在一起使用的。
這句話的意思是,敏感信號(hào)列表中的任何一個(gè)信號(hào)發(fā)生變化,將會(huì)引發(fā)
begin …… end 之間的行為。
Verilog用begin和end包圍代碼段,相當(dāng)于c語言中的大括號(hào){ }的功能。
if(!s) y = a;
這里的“=”單獨(dú)使用,叫做“阻塞賦值”。我把他理解為“串行賦值”。
比如,有這么一段代碼:
b=a;
c=b;
那么最后,c的值就等于a,這個(gè)行為在描述的時(shí)候,語句的先后順序,決定了賦值的先后。
在Verilog中,和它對(duì)應(yīng)的還有一個(gè)“非阻塞賦值”,表示方法是 <=,我把這種賦值稱為“并行賦值”。具體區(qū)別,請(qǐng)參考另一篇短文阻塞賦值和非阻塞賦值。
總結(jié)
以上是生活随笔為你收集整理的Verilog HDL 快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle_查询sql执行剩余时间
- 下一篇: 322. Coin Change