我是靠谱客的博主 过时草莓,最近开发中收集的这篇文章主要介绍两位十进制递增/递减计数器的Verilog代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.一般利用按键或者拨码开关实现递增/递减控制,该计数器可以写成CNT<=CNT+2*K-1,当K=1时,CNT<=CNT+1,为递增计数,否则为递减计数。

2.递增计数到99时需要回0,而递减到0时需要回到99。

3.数码管需要译码输出,且扫描显示,当显示2位数时,未使用到的数码管均要设置为不予选中(0)。

4.该程序在安路EF1A650LG144开发板上验证通过,软件版本5.6.1,代码如下:

module CNT99 (CLK1Hz,CLK1KHz,DG,Q,K);
input CLK1Hz,CLK1KHz,K;//CLK1Hz为计数器时钟,CLK1KHz为数码管扫描时钟,K为计数器增减控制
output reg [7:0] Q; //段码
output reg [7:0] DG= 8'b00000001; //位码,1选中   
reg [6:0] CNT;  //计数器
reg [3:0] data; //要显示的数
always @ (posedge CLK1Hz)  //上升沿触发
  if ((CNT>=99)&&K)    //递增计数到99
   	 CNT<=0;
   else  if ((CNT==0)&&(!K))  //递减计数到0时再从99开始
     CNT<=99;
   else
     CNT<=CNT+2*K-1;         //增减控制
always @ (posedge CLK1KHz)  //扫描显示
   case(DG)
      8'b00000001: begin data<=CNT/10;  DG<={DG[6:0],DG[7]};end //十位  
      8'b00000010: begin data<=CNT%10;  DG<={DG[0],DG[7:1]};end //个位
      default:begin data<=10;DG=8'b00000001;end 
   endcase       
always @(data)   //数码管译码,DP,G-A,0点亮
  case(data)
        0:Q=8'b11000000;
        1:Q=8'b11111001;
      	2:Q=8'b10100100;
		3:Q=8'b10110000;
    	4:Q=8'b10011001;
		5:Q=8'b10010010;
		6:Q=8'b10000010;
		7:Q=8'b11111000;
		8:Q=8'b10000000;
		9:Q=8'b10010000;
		default:Q=8'b11111111;
  endcase
endmodule

5.高云MiniStar开发板(GW1NSR)主频时钟为27M,且只有此一个输出,需要分频产生1KHz扫描时钟和1Hz的计数时钟,另数码管仅有4个,故都需相应作出调整,代码如下:

module CNT99 (CLK,DG,Q,K);
input CLK,K;//CLK,27M时钟,K为计数器增减控制
output reg [7:0] Q; //段码
output reg [3:0] DG=4'b0001; //位码,1选中   
reg [6:0] CNT;  //计数器
reg [3:0] data; //要显示的数
reg CLK1KHz,CLK1Hz;
reg [13:0] N1K; //分频到1KHz计数器
reg [8:0] N;   //分频到1Hz计数器

always@(posedge CLK)//分频产生扫描时钟
  if (N1K>=13499) begin  N1K<=0; CLK1KHz<=~CLK1KHz; end 
    else N1K<=N1K+1;
always@(posedge CLK1KHz)//分频产生计数时钟
  if (N>=499) begin  N<=0; CLK1Hz<=~CLK1Hz; end 
    else N<=N+1;
   
always @ (posedge CLK1Hz)  //上升沿触发
  if ((CNT>=99)&&K)    //递增计数到99
   	 CNT<=0;
   else  if ((CNT==0)&&(!K))  //递减计数从99开始
     CNT<=99;
   else
     CNT<=CNT+2*K-1;         //增减控制
always @ (posedge CLK1KHz)  //扫描显示
   case(DG)
      4'b0001: begin data<=CNT/10;  DG<=4'b0010;end //十位  
      4'b0010: begin data<=CNT%10;  DG<=4'b0001;end //个位 
      default: begin data<=10; DG<=4'b0010;end 
   endcase       
always @(data)   //数码管译码,DP,G-A,0点亮
  case(data)
        0:Q=8'b11000000;
        1:Q=8'b11111001;
      	2:Q=8'b10100100;
		3:Q=8'b10110000;
    	4:Q=8'b10011001;
		5:Q=8'b10010010;
		6:Q=8'b10000010;
		7:Q=8'b11111000;
		8:Q=8'b10000000;
		9:Q=8'b10010000;
		default:Q=8'b11111111;
  endcase
endmodule

最后

以上就是过时草莓为你收集整理的两位十进制递增/递减计数器的Verilog代码的全部内容,希望文章能够帮你解决两位十进制递增/递减计数器的Verilog代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部