1. 程式人生 > >FPGA Verilog HDL 系列例項--------4位二進位制加減法計數器

FPGA Verilog HDL 系列例項--------4位二進位制加減法計數器

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