Verilog HDL语言的计数器程序

    xiaoxiao2021-03-25  68

    1.二进制法六十进制计数器

    module timer(

     input clk,

     output reg[5:0] counter //转化为二进制有几位

     );

    parameter i=59; //宏定义任意进制计数器

    always@(posedge clk)

      begin

         if(counter == i)

                counter <= 0;

         else

                counter <= counter+1'b1;

      end

    endmodule  

    2.8421BCD码六十进制计数器

    module bcd_cnt60(

     input clk,en,clr,

     output reg[3:0] QL,//第四位

     output reg[7:4] QH//高四位

     );

    always@(posedge clk,negedge clr)

     begin

      if(~clr)

         begin

            QL<=0;

            QH<=0;

         end

      else if(en)

           begin

                if(QL==9)

                   begin

                   QL<=0;

                   if(QH==5)//嵌套条件

                         QH<=0;

                   else 

                         QH<=QH+1;

                   end

               else

                  QL<=QL+1;

             end

      else

           begin 

                QL <= QL; 

                QH <= QH;

            end

     end

    endmodule 

     

    3.级联法的六十进制计数器

    module top_counter(CLK,EN,CLR,sid_out,sed_out); input CLR; input CLK; input EN; output [3:0] sid_out; output [3:0] sed_out; wire  sid; counter_10 U1( .CLR(CLR), .CLK(CLK), .EN(EN), .COUT(sid), .OUT(sid_out), ); counter_6 U2( .CLR(CLR), .CLK(CLK), .EN(sid), .AUT(sed_out ), ); endmodule module counter_10 (CLK,EN,CLR,OUT,COUT); input CLR; input CLK; input EN; output reg[3:0]OUT; output COUT; always@(posedge CLK,negedge CLR) begin if(~CLR) OUT<=1'b0; else if(~EN) OUT<=OUT; else if(OUT==4'b1001) OUT<=1'b0000; else OUT<=OUT+1'b1; end assign COUT=((OUT==4'b1001)&EN)?1:0; endmodule  module counter_6 (CLK,EN,CLR,AUT,COUT); input CLR; input CLK; input EN; output reg[3:0]AUT; output COUT; always@(posedge CLK,negedge CLR) begin if(~CLR) AUT<=1'b0; else if(~EN) AUT<=AUT; else if(AUT==4'b0101) AUT<=1'b0000; else AUT<=AUT+1'b1; end endmodule 

    4.进位的反脉冲解决进位问题

    module test(  input clk,  output reg t,  input e,  output reg[3:0] counter //转化为二进制有几位  );

    parameter i=9; always@(posedge clk)   begin if(e) begin if(counter == i) begin t<=0; counter <=4'b0000; end else if(counter==i-1) begin t<=1; counter <= counter+1; end else begin counter<=counter+1;         t<=0; end end else counter<=counter;    end endmodule  

    转载请注明原文地址: https://ju.6miu.com/read-36553.html

    最新回复(0)