楊云海,章芬芬
(韶關學院 信息工程學院,廣東 韶關 512005)
硬件描述語言(以下簡稱為HDL)在電子設計自動化(以下簡稱EDA)過程中,可以用于數字電路的建模和仿真。計數器是一種常用的數字電路模塊,在設計的過程經常會被設計、調用。使用目前最為常用的兩種HDL(即VHDL與Verilog HDL)對實用計數器進行行為建模,并對比兩種語言的建模結果,對實用數字電路的設計有一定的指導作用,有一定的研究意義。
考慮到計數器模塊的實用性,能更方便地引入到更高層級的設計中,計數器模塊的控制接口要比較豐富。除了要有時鐘(clk)輸入以外,還要包含的控制信號有:異步清零(rst)、時鐘使能(en)、同步裝載(ld),等等;需要留有4位的裝載數據輸入端口(din);需要安排4位的計數輸出端口(dout)和1位的進位(計滿)輸出端口(cout)。
按照功能規(guī)劃,使用VHDL行為描述語句對電路進行建模。電路模型的VHDL代碼如下:
在程序中,由于需要使用了標準邏輯矢量(STD_LOGIC_VECTOR)與整形數據的加法操作,對“+”運算符進行了重載,并且使用了數據類型轉換函數,在整形與標準邏輯矢量之間進行數據類型轉換。因此,需要打開IEEE庫中相應的包。
在結構體中定義了一個“q”信號,在“reg”進程中定義了一個“q1”變量。其中,“q1”變量用于暫存計數的結果,“q”信號用于把“q1”的計數結果傳遞出進程以外。這樣的設置,層次分明,結構清晰,提高了代碼的可讀性,為以后對模塊的修改提供了方便。
在代碼中,使用了2個進程(Process)表達電路的行為,進程的標號分別為:“reg”和“com”。其中,“reg”進程表達了電路的時序邏輯,在時鐘信號“CLK”的推動下,計數器進行計數;“com”進程表達了電路的組合邏輯,根據“q”信號的取值情況,對計數輸出“dout”和進位輸出“cout”進行了驅動,把計數結果和進位結果傳遞出模塊。
在時序進程“reg”中,由于需要對各種控制信號進行判斷,使用了多層次嵌套的“if”語句。進程敏感信號列表與“if”語句的嵌套,實現了電路的異步復位、時鐘使能和同步裝載的控制功能。
按照功能規(guī)劃,使用Verilog HDL行為描述語句對電路進行建模。電路模型的Verilog HDL代碼如下:
在代碼中,先是對電路的輸入、輸出端口進行了定義,并定義了一個名為“q1”的寄存器類型變量(reg),用于計數結果的保存和累加。由于使用了“q1”寄存器,輸出端口不需要在過程之內進行賦值操作,所以保持了輸出端口“dout”和“cout”的網線(net)類型屬性。
在“always”過程中,由“q1”變量實現對計數結果的暫存。敏感信號列表與嵌套的“if”語句實現了電路的異步復位、時鐘使能和同步裝載的控制功能。
“q1”的計數結果由并行的連續(xù)賦值語句傳遞給輸出端口“dout”,并通過條件賦值語句對計數結果進行判斷后,決定進位輸出端口“cout”的值。
為了方便對比實用計數器的兩次電路建模,在2次的設計中,均采用了相同的輸入、輸出端口名稱,模塊內需要用到的信號、變量等標識符,也采用了相同的名稱。完成電路的行為建模以后,采用了Quartus Prime平臺,選擇使用Intel公司的FPGA,Cyclone 10 LP系列,10CL006YU256C8G 型號的PLD器件,對電路分別進行了實現(全程編譯,即各層級的綜合),并進行了功能仿真。
在Quartus Prime平臺上完成全程編譯以后,VHDL與Verilog HDL兩次設計的編譯報告內容都是一樣的,如圖1所示。
圖1 實用計數器VHDL與Verilog HDL設計的編譯報告
編譯報告顯示,2次的設計,均使用了器件上的8個邏輯單元(LE),使用了4個寄存器(Register),和13個引腳(Pin)。由編譯報告可知, 2次設計所使用的PLD器件上的邏輯資源數量,是一樣的。
通過查看2個設計的所產生的RTL網表,對比2次設計所形成的電路結構。圖2顯示了2次設計所形成的RTL網表的對比。
由于2次設計所使用的輸出、輸出端口,以及設計中用到的其他標識符都盡量統一了名稱,所以,兩次設計形成的RTL網表結構相同,大部分元件的名稱也一致(不一致的位置,只有4位寄存器元件的名稱)。由RTL網表可知,兩次設計形成的結果應該是一致的。
為了驗證設計的正確性,以及驗證2次設計所形成的結果,功能是否達到要求,功能是否一致,分別對2次設計進行了功能仿真。圖3顯示了2個設計的功能仿真結果。
圖2 實用計數器VHDL與Verilog HDL設計結果的RTL網表對比
圖3 實用計數器VHDL與Verilog HDL設計結果的功能仿真結果對比
為了比較直觀地對比2次設計的仿真波形,把2個設計的仿真輸入信號設置為完全一樣。通過對比兩次仿真的輸出結果,得到的結論是——功能仿真結果完全一致。功能仿真結果的一致,也驗證了2個設計RTL網表基本一致的情況。
對于2次設計的功能仿真進行分析,考查設計結果是否滿足設計需求。從圖3的仿真波形可以看出:異步復位(rst)、時鐘使能(en)、同步裝載(ld)的控制功能均已實現;計數輸出端口“dout”的范圍是0—15,計滿時(計數到達15的時候),進位輸出“cout”拉高。
因此,2次設計的結果是樣同的,并且都是符合功能規(guī)劃的。
通過對比實用計數器的VHDL與Verilog HDL行為建模,比較兩種硬件描述語言在使用上的異同點。
使用兩種不同的HDL,在EDA流程上是相同的,即都是采用:文本設計輸入、全程編譯、設置矢量波形文件、仿真,這幾個步驟開展電路的設計與驗證。當然,使用不同的HDL,可能要在平臺上對于仿真所使用的語言進行設置,但并非是所有平臺都需要這一設置,早期版本的Quartus就不需要作這一設置。所以,使用不同HDL進行設計輸入,基本不會影響EDA的各個流程。
使用不同的HDL進行電路建模,最大的不同在于——不同HDL對于電路功能的描述方法。以本文實用計數器的2次建模為例,雖然2次設計所實現的內容完全一樣,但不同的HDL的描述方式區(qū)別很大。經過對比與總結,得出以下使用VHDL與Verilog HDL進行電路建模的不同之處:
(1)在程序結構方面的不同。VHDL結構嚴謹,代碼的層次清晰,但要寫的代碼較多。
Verilog HDL結構則較為自由,語句的組織比較松散,但需要寫的代碼比較少。
(2)在數據類型要求方面的不同。VHDL對于數據類型有嚴格的要求,需要引入庫、包,對運算符進行重載,才能實現不同數據類型對象之間的運算(算術運算、比較運算、邏輯運算,等等)。禁止不同類型數據的對象之間的賦值。要完成賦值,必須要先進行數據類型的轉換,因此需要引用一些包含數據類型轉換函數的包。
Verilog HDL中的數據都被看作為“矢量”,在運算和賦值時能自動轉換,設計者不需要區(qū)分數據類型,程序中不需要進行數據類型的轉換,即可對數據對象進行運算和賦值等操作。
(3)與電路的映像方式不同??删C合的HDL語句都要變成邏輯電路結構,因此,HDL可綜合語句都會和一些電路元件實現相應的映射。但不同的HDL,語句與電路元件映射的方式和風格,是有所差別的。
VHDL對于電路的行為描述能力較好,行為描述結構清晰,邏輯清楚,易于為人們所理解,但對于電路的映射,顯得層級較高,并不能達到一一對應的關系。
Verilog HDL的行為描述語句則與電路結構有著較好的映射關系,比如:在本例中創(chuàng)建寄存器類型(reg)的變量,在綜合后會形成電路中的寄存器;語句中的各種條件判斷,也會映射為電路中相應位置的各個比較器。
總之,兩種硬件描述語言各有特點,各有優(yōu)勢,無所謂孰優(yōu)孰劣。
本文通過對比VHDL與Verilog HDL對于實用計數器的行為模型,能得到兩種語言的不同特點,對于今后開展數字電路的建模和設計,有一定的幫助。