第二次计数器作业

本文介绍了一种基于Verilog HDL的计数器和数码管显示模块的设计方法,包括时间基准模块、计数模块及显示模块的实现细节,并通过RTL图展示了其内部结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一部分作业

总体思路:先设计一个合适频率的时间基准模块,用溢出信号作为是使能信号输入,再设计符合显示要求的计数器,再设计数码管显示模块,显示出来。

人工绘制RTL图:

计数部分


时间基准部分


quartus生成RTL结构图

总体结构:


计数部分:


时间基准部分


数码管显示部分

SignalTap截图



视频链接:

代码:

////////////////计数程序///////////////////////
module jishu(
  CLK   ,   // 时钟
  CNTVAL,   // 输出
  rst   ,   //复位
  en    );  //使能
input CLK,rst;
input en;
output [4-1:0] CNTVAL;
reg [4-1:0] max=6;//计数最大值
reg [4-1:0] CNTVAL;
always @ (posedge CLK or posedge rst ) begin
 if(rst) begin  //高电平复位
   CNTVAL <= 0;
   max<=6;  //复位同时从计数最大值从6开始
 end
 else begin
   if(en)begin  //使能信号低电平有效,低电平时输出值保持不变
      if(CNTVAL >= max) begin  //超出计数最大值,从零重新开始
        CNTVAL <= 0;
        if(max<9)  //计数最大值从6开始递增,直到9
        max<=max+1'b1;
        else
        max<=6;
      end
      else
        CNTVAL <= CNTVAL + 1'b1; 
  end
  else CNTVAL <= CNTVAL ;
  end
end
endmodule  
////////////////数码管显示///////////////////////
module shumaguan (
bcd,
seg);
input [3:0]bcd;//实际输出数值
output seg;
reg [7:0]seg;  //各个引脚对应的高低电平
always @(bcd) begin
case (bcd) 
            4'b0000: seg = 8'h C0; 
			4'b0001: seg = 8'h F9; //1
			4'b0010: seg = 8'h A4; //2
			4'b0011: seg = 8'h B0; //3
			4'b0100: seg = 8'h 99; //4
			4'b0101: seg = 8'h 92; //5
			4'b0110: seg = 8'h 82; //6
			4'b0111: seg = 8'h F8; //7
			4'b1000: seg = 8'h 80; //8
			4'b1001: seg = 8'h 90; //9
		
endcase
end
endmodule
//////////////////// 时间基准模块/////////////////////////
module cnt_sync(
  CLK   ,   // clock
  CNTVAL,   // counter value
  OV    );  // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 25_000_000;//可以控制溢出信号的输出频率=50000000/MAX_VAL
reg [32-1:0] CNTVAL;
reg OV; //溢出信号作为下一级的时钟

always @ (posedge CLK) begin  //计数器的功能
  if(CNTVAL >= MAX_VAL)
    CNTVAL <= 0;
  else
    CNTVAL <= CNTVAL + 1'b1;
end

always @ (CNTVAL) begin  //计数计满输出一次溢出信号
  if(CNTVAL == MAX_VAL)
    OV = 1'b1;
  else
    OV = 1'b0;
end
endmodule   

第二部分作业

总体思路:

先设计一个合适频率的时间基准模块,用溢出信号作为是使能信号输入,再设计符合一个计数周期为34的计数器(因为数码管显示周期为34),再设计数码管显示模块,显示出对应的结果。

人工绘制RTL图:

计数部分


时间准基部分

quartus生成RTL结构图

总体结构:


计数部分:


时间准基部分:


数码管显示部分:

1.最左边的数码管


2.左边第二个数码管


3.左边第三个数码管


4.最右边的数码管


SignalTap截图



视频链接:http://www.miaopai.com/show/7raWeMNB7vNCY6ebutoyVQ__.htm

module jishu0_34(
  rst   ,
  en    ,
  CLK   ,  
  CNTVAL);
input CLK,en,rst;
output CNTVAL;
reg [6-1:0] CNTVAL=0;
always @ (posedge CLK or posedge rst ) begin
 if (rst)
   CNTVAL<=63;
 else begin
   if(en) begin
     if(CNTVAL <33)
       CNTVAL <= CNTVAL + 1'b1;
     else
       CNTVAL <= 0;
   end
   else  
     CNTVAL <= CNTVAL;
 end
end
endmodule
///////////////////////////////////////////////
module cnt_sync(
  CLK   ,   // 时钟
  CNTVAL,   // 输出
  OV    );  // 溢出信号
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 50_000_000;
reg [32-1:0] CNTVAL;
reg OV; //溢出信号作为下一级的使能
always @ (posedge CLK) begin  //计数器的功能
  if(CNTVAL >= MAX_VAL)
    CNTVAL <= 0;
  else
    CNTVAL <= CNTVAL + 1'b1;
end
always @ (CNTVAL) begin  //计数计满输出一次溢出信号
  if(CNTVAL == MAX_VAL)
    OV = 1'b1;
  else
    OV = 1'b0;
end
endmodule  
/////////////////////////////////////////////////////////
module shumaguan9 (
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg;  //各个引脚对应的高低电平
always @(bcd) begin // 计数到24时数码管显示0到9,否则数码管不亮
case (bcd)              
			6'b011000: seg = 8'h C0; //0
			6'b011001: seg = 8'h F9; //1
			6'b011010: seg = 8'h A4; //2
			6'b011011: seg = 8'h B0; //3
			6'b011100: seg = 8'h 99; //4
			6'b011101: seg = 8'h 92; //5
			6'b011110: seg = 8'h 82; //6
			6'b011111: seg = 8'h F8; //7
			6'b100000: seg = 8'h 80; //8
			6'b100001: seg = 8'h 90; //9
			6'b100010: seg = 8'h FF; 
default seg = 8'h FF;				
endcase
end
endmodule
/////////////////////////////////////////////////////
module shumaguan8 (
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg;  //各个引脚对应的高低电平
always @(bcd) begin  //计数值为15时数码管显示0到8,否则数码管不亮
case (bcd)              
			6'b001111: seg = 8'h C0; //0
			6'b010000: seg = 8'h F9; //1
		   	6'b010001: seg = 8'h A4; //2
			6'b010010: seg = 8'h B0; //3
			6'b010011: seg = 8'h 99; //4
			6'b010100: seg = 8'h 92; //5
			6'b010101: seg = 8'h 82; //6
			6'b010110: seg = 8'h F8; //7
			6'b010111: seg = 8'h 80; //8
default seg = 8'h FF;				
endcase
end
endmodule
module shumaguan7 (
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg;  //各个引脚对应的高低电平
always @(bcd) begin  //计数值为7时数码管显示0到7,否则数码管不亮
case (bcd) 
                        6'b000111: seg = 8'h C0; //0
			6'b001000: seg = 8'h F9; //1
			6'b001001: seg = 8'h A4; //2
			6'b001010: seg = 8'h B0; //3
			6'b001011: seg = 8'h 99; //4
			6'b001100: seg = 8'h 92; //5
			6'b001101: seg = 8'h 82; //6
			6'b001110: seg = 8'h F8; //7

default seg = 8'h FF;		
endcase
end
endmodule
module shumaguan6(
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg;  //各个引脚对应的高低电平
always @(bcd) begin  // 计数值为0时数码管显示0到6,否则数码管不亮
case (bcd) 
                        6'b000000: seg = 8'h C0;//0
			6'b000001: seg = 8'h F9;//1
			6'b000010: seg = 8'h A4;//2
			6'b000011: seg = 8'h B0;//3
			6'b000100: seg = 8'h 99;//4
			6'b000101: seg = 8'h 92;//5
			6'b000110: seg = 8'h 82;//6

default seg = 8'h FF;						
endcase
end
endmodule





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值