FPGA Verilog HDL 系列例項--------4位二進位制加減法計數器
阿新 • • 發佈:2019-02-07
Verilog HDL 之 4位二進位制加減法計數器
一、原理
計數器是數字系統中用的較多的基本邏輯器件。它不僅能記錄輸入時鐘脈衝的個數,還可以實現分頻、定時等功能。
計數器的種類很多。按脈衝方式可以分為同步計數器和非同步計數器;按進位制可以分為二進位制計數器和非二進位制計數器;按計數過程數字的增減,可分為加計數器、減計數器和可逆計數器。
本實驗就是設計一個4位二進位制加減法計數器,該計數器可以通過一個控制訊號決定計數器時加計數還是減計數,另外,該暫存器還有一個清零輸入,低電平有效。還有一個load裝載資料的訊號輸入,用於預置資料;還有一個C的輸出,用於計數器的級聯。其功能表如表1.1所示;
表1.1 4位二進位制加減法計數器功能表
二、實現
在設計檔案中輸入Verilog程式碼
1 /****************************** 分頻模組 *************************************/ 2 3 `timescale 1 ns /1 ps 4 module qu_dou ( clk ,rst , a ,b ); 5 6 input clk ; 7 wire clk ; 8 input rst ; 9 input a ;10 wire a ; 11 12 output b ; 13 reg b ; 14 15 reg [31:0] cnt ; 16 reg clkout ; 17 always @ ( posedge clk or negedge rst ) 18 begin 19 if ( rst ==1'b0 )20 cnt <=0 ; 21 else begin if ( a==1'b1 ) begin22 if ( cnt >=32'd3000000 ) 23 b<=1 ; 24 else25 cnt <= cnt +1'b1 ;26 27 end 28 else begin b <=1'b0 ;29 cnt <=0 ; 30 end 31 end 32 end 33 34 35 endmodule
功能實現
1 `timescale 1 ns /1 ps 2 3 module counter4 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,sysclk , rst ); 4 5 input load ; 6 input clk; 7 wire load ; 8 input clr ; 9 wire clr ; 10 input up_down ; 11 wire up_down ; 12 input [3:0] DIN ; 13 wire [3:0] DIN ; 14 input sysclk ; 15 input rst ; 16 17 output c ; 18 reg c ; 19 output [3:0] DOUT ; 20 wire [3:0] DOUT ; 21 reg [3:0] data_r; 22 23 /***************** 例化去抖模組 *************************************/24 wire clk_r ; 25 qu_dou qu_dou ( 26 .clk (sysclk) , 27 .rst (rst) , 28 .a (clk), 29 .b (clk_r)); 30 31 //*********************************************************************32 33 34 assign DOUT = data_r; 35 always @ ( posedge clk_r or posedge clr or posedge load) 36 begin 37 if ( clr ==1) //同步清零38 data_r <=0; 39 elseif ( load ==1) //同步預置40 data_r <= DIN; 41 else begin if ( up_down ==1) 42 begin 43 if ( data_r ==4'b1111) begin //加計數44 data_r <=4'b0000; 45 c =1; 46 end 47 else begin //減計數48 data_r <= data_r +1; 49 c =0 ; 50 end 51 end 52 else53 begin 54 if ( data_r ==4'b0000) begin //加計數55 data_r <=4'b1111; 56 c =1; 57 end 58 else begin //減計數59 data_r <= data_r -1; 60 c =0 ; 61 end 62 end 63 end 64 end 65 endmodule