本系列文章主要針對FPGA初學者編寫,包括FPGA的模塊書寫、基礎語法、狀態機、RAM、UART、SPI、VGA、以及功能驗證等。將每一個知識點作為一個章節進行講解,旨在更快速的提升初學者在FPGA開發方面的能力,每一個章節中都有針對性的代碼書寫以及代碼的講解,可作為讀者參考。
18
第十八章:function
function說明語句
function說明語句的用途就是要返回一個值,然后把這個值用在表達式中。本章講解function任務的用法。
不同點
任務和函數主要的不同點如下:
1、function中不能包含時序控制語句,而task任務可以包含時序控制語句;
2、function不能調用task任務,而task任務能調用function語句;
3、function至少要有一個input類型的參數,不能有output和inout類型的參數。而task任務可以沒有參數,也可以有多個類型的參數;
4、function返回一個值,而task任務則不返回值。
5、function只能對輸入值返回一個結果值,而task可以支持多種用途,可以計算并返回多個結果值。使用task時,只能通過output和inout類型的參數把結果值傳遞回來。
function使用語法
定義任務的語法:
function<返回值的類型或范圍>(函數名);
<端口說明語句>
<變量類型說明語句>
begin
<語句1>
<語句2>
………
end
endfunction
函數通過關鍵詞 function 和 endfunction 定義。不允許輸出端口聲明(包括輸出和雙向端口),但可以有多個輸入端口。<返回值的類型或范圍>指定函數返回值的類型或位寬,是一個可選項,若沒有指定,默認缺省值為寬度 1 bit的寄存器數據。(函數名)為所定義函數的名稱,對函數的調用也是通過函數名完成的,并在函數結構體內部代表一個內部變量,函數調用的返回值就是通過函數名變量傳遞給調用語句。函數定義在函數內部會隱式定義一個寄存器變量,該寄存器變量和函數同名并且位寬也一致。函數通過在函數定義中對該寄存器的顯式賦值來返回函數計算結果。
函數定義示例
函數的定義聲明了與函數同名的,函數內部的寄存器。如在函數的聲明語句中<返回值的類型或范圍>為默認,則這個寄存器是1位的。否則是與函數定義中<返回值的類型或范圍>一致的寄存器。函數的定義把函數返回值所賦值寄存器的名稱初始化與函數同名的內部變量。上述代碼示例定義了一個名為“function_use”的函數,把輸入a的值低3bit賦給了返回值function_use。需要注意的是在函數定義時不能包含任何時間控制語句,即不能包含#,@,wait等。
函數調用
下面舉例說明function 函數的定義與如何調用。
代碼示例
函數的調用時通過將函數作為表達式中的操作數來實現的。調用格式如下:
<函數名> (<表達式>,……<表達式>)
測試代碼如下:
仿真波形如圖所示:
由仿真圖可以看:
1、當 start 信號變成高電平的時候,state 狀態由 0 跳變到 1 時,此時調用 load_data 函數,把 data_in 的值通過調用函數的方式賦給shift_data ,同時狀態機狀態跳轉到 2。
2、當狀態跳轉到 2 的時候,此時調用shift 函數,把 shift_data 的值通過調用函數的方式往左移一位后賦給shift_data ,同時狀態機狀態跳轉到 3。
3、當狀態跳到 3 的時候,調用 load_data 函數,把 shift_data 的值通過調用函數的方式賦值給data_out ,同時狀態機狀態跳轉到 0。
4、最終結果:
8‘hF0左移1位,data_out=8‘hE0。
8‘hFF左移1位,data_out=8‘hFE。
責任編輯:lq
-
FPGA
+關注
關注
1630文章
21802瀏覽量
606369 -
Function
+關注
關注
0文章
14瀏覽量
9946 -
變量
+關注
關注
0文章
613瀏覽量
28475
原文標題:FPGA入門系列18--function
文章出處:【微信號:gh_873435264fd4,微信公眾號:FPGA技術聯盟】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Linux lsof命令的基本用法
![Linux lsof命令的基本<b class='flag-5'>用法</b>](https://file1.elecfans.com/web1/M00/F3/7F/wKgaoWcYc2mAFw5cAAA4fI5XmGk856.png)
Allegro X 23.11 版本更新 I 原理圖設計:變體及 function 的創建與管理
![Allegro X 23.11 版本更新 I 原理圖設計:變體及 <b class='flag-5'>function</b> 的創建與管理](https://file.elecfans.com/web2/M00/27/37/poYBAGHBmA2AD7e7AAAahjWuYP4250.jpg)
ESP32 IDF 4.3創建任務使用外部PSRAM分配內存,在任務里操作FLASH死機的原因?
三菱PLC傳送指令的用法
鴻蒙Ability Kit(程序框架服務)【UIAbility組件基本用法】
![鴻蒙Ability Kit(程序框架服務)【UIAbility組件基本<b class='flag-5'>用法</b>】](https://file1.elecfans.com/web2/M00/EC/1E/wKgZomZhJtuAGvhjAACAmnpjgBM543.png)
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程I/O密集型任務開發
PHP用戶定義函數詳細講解
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程CPU密集型任務TaskPool
鴻蒙原生應用開發-ArkTS語言基礎類庫單次I/O任務開發
AWTK 開源串口屏開發(10) - 告警信息的高級用法
![AWTK 開源串口屏開發(10) - 告警信息的高級<b class='flag-5'>用法</b>](https://file.elecfans.com/web2/M00/50/DA/pYYBAGLH6TyAB71EAAAPQ7KgtYA038.png)
評論