FPGA程式設計基礎(一)--引數傳遞與暫存器使用
一、引數對映
引數對映的功能就是實現引數化元件。所謂的”引數化元件“就是指元件的某些引數是可調的,通過調整這些引數從而可實現一類結構類似而功能不同的電路。在應用中,很多電路都可採用引數對映來達到統一設計,如計數器、分頻器、不同位寬的加法器以及不同重新整理頻率的VGA視訊介面驅動電路等。
引數傳遞
引數傳遞就是在編譯時對引數重新賦值而改變其值。傳遞的引數是子模組中定義的parameter,其傳遞方法有下面兩種。
- 時鐘”#“符號
在同一模組中使用”#“符號。引數賦值的順序必須與原始模組中進行引數定義的順序相同,並不是一定要給所有的引數都賦予新值,但不允許跳過任何一個引數,即使是保持不變的值也要寫在相應的位置。
module #(parameter1, parameter2) inst_name(port_map);
module_name #(.parameter_name(para_value), .parameter_name(para_value)) inst_name(port_map);
例:通過”#“字元實現一個模值可調的加1計數器
module cnt(
input clk,
input rst,
output reg[15:0] cnt_o
);
//定義引數化變數
parameter[15:0] Cmax = 1024;
always @(posedge clk or negedge rst) begin
if(!rst)
cnt_o <= 0;
else
if(cnt_o == Cmax)
cnt_o <= 0;
else
cnt_o <= cnt_o + 1;
end
endmodule
module param_counter(
input clk,
input rst,
output [15:0] cnt_o
);
//引數化呼叫,利用#符號將計數器的模值10傳入被呼叫模組
cnt #10 inst_cnt(
.clk(clk),
.rst(rst),
.cnt_o(cnt_o)
);
endmodule
- 使用defparam關鍵字
defparam關鍵字可以在上層模組去直接修改下層模組的引數值,從而實現引數化呼叫,其語法格式如下:
defparam heirarchy_path.paramer_name = value;
這種方法與例化分開,引數需要寫絕對路徑來指定。引數傳遞時各個引數值的排列次序必須與被呼叫模組中各個引數的次序保持一致,並且引數值和引數個數也必須相同。
如果只希望對被呼叫模組內的個別引數進行更改,所有不需要更改的引數值也必須按對應引數的順序在引數值列表中全部列出(原值拷貝)。
使用defparam語句進行重新賦值時必須參照原引數的名字生成成分級引數名。
例:通過”defparam“實現一個模值可調的加1計數器。
module param_counter(
input clk,
input rst,
output [15:0] cnt_o
);
//引數化呼叫,利用#符號將計數器的模值10傳入被呼叫模組
cnt inst_cnt(
.clk(clk),
.rst(rst),
.cnt_o(cnt_o)
);
//同過defparam修改引數
defparam inst_cnt.Cmax = 12;
endmodule
二、暫存器型別
暫存器變數,都有“寄存性”,即在接手下一次賦值前,將保持原值不變。暫存器型變數沒有強度之分,且所有暫存器類變數都必須明確給出型別說明(無預設狀態),暫存器資料型別這裡僅介紹兩種常用型別。
- reg:常用的暫存器型變數。用於行為描述中對暫存器類的說明,由過程賦值語句賦值;
- Integer: 32位帶符號整型變數
1、reg暫存器型別
暫存器資料型別reg是最常見的資料型別。暫存器可以取任意長度。reg型資料的預設值是未知的,reg型資料可以為正值或負值。但當一個reg型資料是一個表示式中的運算元時,它的值被當無符號值,即正值。如果一個4位的reg型資料被寫入-1,在表示式中運算時,其值被認為是+15。例如:
reg [3:0] Comb;
Comb = -2; //Comb的值為14(1110),1110是-2的補碼
2、integer暫存器型別
2、integer暫存器型別
整數暫存器包含整數值。整數暫存器可以作為普通暫存器使用。使用整數型說明形式如下:
integer integer1, integer2,......integerN[msb:lsb];
integer Hist[3:6]; //一組四個暫存器
一個整數型暫存器可儲存有符號數,並且算術操作符提供2的補碼運算結果。整數不能作為向量訪問。例如,對於上面的整數B的說明,B[6]和B[20:10]是非法的。一種擷取位值的方法是將整數賦值給一般的reg型別變數,然後從中選取相應的位,如下:
reg [31:0] Breg;
integer Bint;
Breg = Bint;
上例說明了如果通過簡單的賦值將整數裝換為位向量。型別轉型自動完成,不必使用特定的函式。從位向量到整數的轉換也可以通過賦值完成。例如:
integer J;
reg [3:0] Bcq;
J = 6; //J的值為32‘b0000...00110
Bcq = J; //Bcq的值為4'b0110
Bcq = 4'd0101;
J = Bcq; //J的值為32’b0000...00101
J = -6; // J的值為32‘b1111...11010
Bcq = J ; //Bcq的值為4'b1010
相關文章
- JAVA基礎之-引數傳遞Java
- 程式設計中暫存器的使用程式設計
- C#程式設計:ref【引數按引用傳遞】C#程式設計
- iOS彙編基礎(二)暫存器iOS
- 引數傳遞
- FPGA基礎設計(6)使用DAC的Interleaved模式FPGA模式
- 彙編基礎——常用暫存器及其用途
- C++ 遞迴與物件導向程式設計基礎C++遞迴物件程式設計
- JNI傳遞引數
- Mybatis引數傳遞MyBatis
- [ASP.NET] 使用Request 傳遞引數ASP.NET
- GO中的函式設計時候,引數傳遞選擇傳遞值還是傳遞指標?Go函式指標
- FPGA程式設計基礎(二)--常用行為模擬描述FPGA程式設計
- jdbctemplate呼叫儲存過程傳遞陣列引數JDBC儲存過程陣列
- vue事件帶預設引數,怎麼傳遞其他引數Vue事件
- React事件傳遞引數React事件
- 路由元件傳遞引數路由元件
- shell (3)指令碼引數傳遞與數學運算指令碼
- apicloud拉起小程式並傳遞引數APICloud
- shell程式引數傳遞給sqlplusSQL
- JS的方法引數傳遞(按值傳遞)JS
- JavaScript之Arguments物件暫存函式引數與屬性JavaScript物件函式
- 給一個介面傳遞引數,並接收返回的引數
- 程式分析與優化 - 8 暫存器分配優化
- C#引數傳遞之值引數C#
- Java程式設計基礎24——遞迴練習Java程式設計遞迴
- PLC(一)可程式設計控制器基礎程式設計
- 前臺傳遞引數使用變數@RequestParam springmvc變數SpringMVC
- Javascript 定時器呼叫傳遞引數的方法JavaScript定時器
- C++ 預設引數與引用傳遞:語法、用法及示例C++
- CS 暫存器 和 IP 暫存器
- JNI程式設計基礎(一)程式設計
- 請求引數的傳遞
- Shell學習【引數傳遞】
- JavaScript函式傳遞引數JavaScript函式
- out,ref,params引數傳遞
- 函式的引數傳遞函式
- 利用閉包傳遞引數