FPGA設計中計數器的使用技巧

2021-08-28 05:57:11 字數 2473 閱讀 5147

計數器使用很常見也很實用。以下是幾個例子

1,簡單的cnt計數

//verilog

reg [31:0] cnt;

always @(posedge clk) cnt <= cnt+1;

這是乙個簡單的計數器,計數從0開始計數,計數範圍0~2^32-1.

2,帶有方向的cnt計數

//verilog

reg [31:0] cnt = 100;

reg cnt_direction; // 0 計數器遞減, 1 計數器遞增

always @(posedge clk) cnt <= cnt_direction ? cnt+1 : cnt-1

計數器初值是100,方向選擇訊號cnt_direction決定cnt是遞增還是遞減。

3,帶有生成tick的cnt計數

//verilog

wire max_tick;

wire min tick;

reg [31:0] cnt;

always @(posedge clk) cnt <= cnt+1;

//計數到32』h0產生min_tick

//計數到32』hffffffff產生max_tick

assign min_tick = (cnt == 32'h0);

assign max_tick = (cnt == 32'hffffffff);

在verilog中有按位操作符運算,&和|,&cnt表示每一位均為1時值為1,|cnt表示只要有一位為1值則為1,只有cnt全為0時則為0,所以|cnt取反表示全為0時值為1,上述**可以簡化為如下**

//verilog

wire max_tick;

wire min tick;

reg [31:0] cnt;

always @(posedge clk) cnt <= cnt+1;

//計數到32』h0產生min_tick

//計數到32』hffffffff產生max_tick

//&cnt表示每一位均為1時值為1,|cnt表示只要有一位為1值則為1,只有cnt全為0時則為0,所以|cnt取反表示

//全為0時值為1

assign min_tick = ~|cnt;

assign max_tick = &cnt;

4,使用計數器進行復位設定

系統做復位管理的時候,需要上電復位1ms,系統穩定的時候復位釋放,此時就需要計數器計數1ms,假如clk時鐘100m,則需要計數100k。此時如下設計,cnt計數到100k時候有cnt == 32』d100_000和cnt > 32』d100_000兩種方式,採用大於的方式寫,可以避免單粒子翻轉導致錯誤無法恢復。

//verilog

reg [31:0] cnt = 0 ;

reg rst = 0 ;

always @(posedge clk)

begin

cnt <= (cnt > 32'd100_000) ? cnt : cnt+1;

rst <= (cnt > 32'd100_000) ? 0 : 1;

end

5,使用計數器調節占空比進行pwm設定

通過調節輸出占空比來完成pwm的操作,此時使用cnt可以完美的調節占空比,假設系統clk=100m,1s完成從占空比0到1的變化,步進按照1ms步進。**可以如下方式編寫

parameter  step = 100;//1ms/1000 = 100_000/1000

reg [31:0] cnt_1ms = 0 ;

wire tick_1ms;

always @(posedge clk) cnt_1ms <= (cnt_1ms >= 32'd99_999) ? 0 : cnt_1ms+1;

assign tick_1ms =(cnt_1ms==32'd99_999);

reg [31:0] h_lever_cnt = 0;//高電平計數值

wire pwm_out;

always @(posedge clk)

if(tick_1ms)

h_lever_cnt <= (h_lever_cnt >= (32'd100_000 - step)) ? 0 : h_lever_cnt + step;

else

h_lever_cnt <= h_lever_cnt;

assign pwm_out =(cnt_1ms < h_lever_cnt) ? 1 : 0;

控制代碼類中計數器的分離

控制代碼類是管理基類指標的類,智慧型指標 的類其實就是控制代碼類。智慧型指標都有乙個對應的計數器,這個計數器可以在智慧型指標指向的物件中,在 c 中的智慧型指標 中就是這樣的 也可以在控制代碼類中。這兩種有一些區別。當計數器在智慧型指標物件的內部時,我們需要在類的外層加一層包裝,之前用ptr類,但是...

使用Verilog實現FPGA計數器功能

編寫veriloghdl 程式,實現如下功能 利用開發板上的數碼顯示解碼器設計乙個十進位制計數器,要求該計數器具有以下功能 1.計數範圍為 0 20 計算到 20時自動清零,計數間隔時間為1s 2.具有按鍵非同步 同步清零功能 1.用乙個時鐘脈衝,分出兩個頻率,乙個為計數頻率,乙個為掃瞄頻率。2.利...

使用Verilog實現FPGA計數器功能

編寫veriloghdl 程式,實現如下功能 利用開發板上的數碼顯示解碼器設計乙個十進位制計數器,要求該計數器具有以下功能 1.計數範圍為 0 20 計算到 20時自動清零,計數間隔時間為1s 2.具有按鍵非同步 同步清零功能 1.用乙個時鐘脈衝,分出兩個頻率,乙個為計數頻率,乙個為掃瞄頻率。2.利...