天天看點

QuartusII中LPM_COUNTER的使用

ALTERA建議,在設計時時序允許的情況下盡量使用Megafunction的資源,因為在多數情況下Megafunction的綜合和實作結果更為優化。現在,就LPM_COUNTER的使用,淺談一下。

Megafunction中LPM_COUNTER的參數設定主要是以下三部分:

1.計數輸出值位數和計數方向的設定:

QuartusII中LPM_COUNTER的使用

2. 計數系數和使能及進位的設定:

QuartusII中LPM_COUNTER的使用

需要注意的是:這裡的Count Enable計數使能,即其隻是計數的使能信号,加載信号并不受它的控制。

3.所需同步輸入和異步輸入的設定:

QuartusII中LPM_COUNTER的使用

其實,這三個部分的設定很簡單,主要是我們如何使用這些設定的問題。平時的數字設計中,我們經常需要對一些脈沖進行計數,而且是要求計到某個值時,産生一個相應的輸出,相當于我們通過計數産生一個标志信号,在這種情況下,modulus和carry_out的設定就起了作用了。現在我将modulus設為30,選擇向上計數的8位計數器,并選中carry_out,看一下仿真波形如下:

QuartusII中LPM_COUNTER的使用

也就是說,這時cout就可以做為一個标志信号,用來決定其他相關操作開始的标志。通過這樣簡單的設定,無疑節省了我們編寫代碼的工作時間,盡管這個設計代碼量很小。

好,現在再來看一下次LPM_COUNTER的verilog代碼,如下:

`timescale 1 ps / 1 ps

// synopsys translate_on

module alt_counter (
         aclr,

         clock,

         cnt_en,

         sset,

         updown,

         cout,

         q);

 

         input          aclr;

         input          clock;

         input          cnt_en;

         input          sset;

         input          updown;

         output       cout;

         output     [7:0]  q;

 

         wire  sub_wire0;

         wire [7:0] sub_wire1;

         wire  cout = sub_wire0;

         wire [7:0] q = sub_wire1[7:0];

         

         parameter n=30;                           //%%%%%%%%%%%//

 

         lpm_counter   lpm_counter_component (

                                     .aclr (aclr),

                                     .clock (clock),

                                     .updown (updown),

                                     .sset (sset),

                                     .cnt_en (cnt_en),

                                     .cout (sub_wire0),

                                     .q (sub_wire1),

                                     .aload (1'b0),

                                     .aset (1'b0),

                                     .cin (1'b1),

                                     .clk_en (1'b1),

                                     .data ({8{1'b0}}),

                                     .eq (),

                                     .sclr (1'b0),

                                     .sload (1'b0));

         defparam

                  lpm_counter_component.lpm_direction = "UNUSED",

                  lpm_counter_component.lpm_modulus = n,              //

                  lpm_counter_component.lpm_port_updown = "PORT_USED",

                  lpm_counter_component.lpm_type = "LPM_COUNTER",

                  lpm_counter_component.lpm_width = 8;

 

 

endmodule

           

其中标記為//行中的n是我更改的,原産生程式中為30,此處,我将其改為n後,在上面加上一行聲明parameter n=30;(标記為//%%%%%%//的行),便于程式的通用性移植。

此設計消耗8個寄存器,16個組合功能塊,共16個LE。當設定的modulus值大于255時,消耗8個寄存器,10個組合功能塊,共10個LE。當不使用cout輸出也不對modulus設定時,消耗9個組合功能塊,共9個LE,這也可為資源的使用提供參考。

此為文檔搬運,原文連結

繼續閱讀