[文档].艾米电子 - 在综合中使用函数,Verilog
對讀者的假設
已經掌握:
- 可編程邏輯基礎
- Verilog HDL基礎
- 使用Verilog設計的Quartus II入門指南
- 使用Verilog設計的ModelSIm入門指南
內容
1 概述
在Verilog的模塊里,有些表達式也許會出現很多次。為了不重復輸入這些代碼,我們可以把常用的這部分抽象為一個routine,模塊內的function可以實現這一點。Verilog的函數有一個或多個的輸入參數,僅返回單值。在綜合期間,函數被展開,以映射為相應的硬件。因此,出于綜合的考慮,函數應該保持簡單,可以當作一些復雜表達式的縮略寫法。函數的基本寫法如下:
module . . . . . . // function defined within module function [result_type] [func_id] ([input_arg]); begin[statement] end endfunction . . . endmodule函數需要被定義在function和endfunction限定詞內部。可選的[result_type]指定返回值得數據類型,常選用帶范圍的reg或integer類型。[input_arg]被用來聲明輸入的參數,[func_id]被用來指定函數的名稱。函數通過表達式來返回的結果,如
[func_id] = ... ;2 范例
在二進制計數器那一節,我們討論了模-m計數器。有兩個參數:M,指定計數的范圍為[0, M-1];N,指定M個數需要多少位寬來存儲,其值為大于或等于log2(M)的整數。N的值不應該一個獨立的參數,一個更好的做法定義一個局部常量,然后在模塊內部計算它的值。通過使用函數可以實現,修改后的代碼如下:
module mod_m_bin_counter #(parameter M=10) // mod-M (// global clock and asyn resetinput clk,input rst_n,// counter interfaceoutput max_tick,output min_tick,output [N-1:0] q );// signal declaration localparam N = log2(M); // number of bits in counter reg [N-1:0] r_reg; wire [N-1:0] r_next;// body // register always@(posedge clk, negedge rst_n)if(!rst_n)r_reg <= 0;elser_reg <= r_next;// next-state logic assign r_next = (r_reg == (M-1)) ? 0 : r_reg + 1'b1; //output logic assign q = r_reg; assign max_tick = (r_reg == (M-1)) ? 1'b1 : 1'b0; assign min_tick = (r_reg == 0) ? 1'b1 : 1'b0;// log2 constant function function integer log2(input integer n);integer i; beginlog2 = 1;for(i=0; 2**i<n; i = i + 1)log2 = i + 1; end endfunctionendmodule定義在模塊內的函數log2(),用于求取局部變量N的值。由于在綜合之前的預處理中,函數已執行計算;因此函數將不引用任何物理電路。
參考
1 Pong P. Chu.FPGA Prototyping By Verilog Examples: Xilinx Spartan-3 Version.Wiley
另見
[與艾米一起學FPGA/SOPC].[邏輯實驗文檔連載計劃]
轉載于:https://www.cnblogs.com/yuphone/archive/2010/12/12/1903743.html
總結
以上是生活随笔為你收集整理的[文档].艾米电子 - 在综合中使用函数,Verilog的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ChatGPT 为啥这么强:万字长文详解
- 下一篇: 让NV对30系显卡降价不可能!厂商清仓R