FPGA程式設計基礎(一)--引數傳遞與暫存器使用

兔美醬xz發表於2014-10-17

一、引數對映

引數對映的功能就是實現引數化元件。所謂的”引數化元件“就是指元件的某些引數是可調的,通過調整這些引數從而可實現一類結構類似而功能不同的電路。在應用中,很多電路都可採用引數對映來達到統一設計,如計數器、分頻器、不同位寬的加法器以及不同重新整理頻率的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暫存器型別
整數暫存器包含整數值。整數暫存器可以作為普通暫存器使用。使用整數型說明形式如下:
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






















































相關文章