計數器使用很常見也很實用。以下是幾個例子
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.利...