FPGA在校学习记录系列---实验5-60进制计数器的设计+开发板(Verilog HDL)

此系列记录FPGA在学校的学习过程。

FPGA系列
需要用到的软硬件:
软件:Quartus II 15.0 (64-bit)
在这里插入图片描述
硬件:
5CEBA4F23C7芯片

1.创建新的工程和开发板烧录在下面链接

新建工程链接:
FPGA在校学习记录系列—新建一个FPGA工程编写程序并仿真(Verilog HDL)
开发板烧录链接:
FPGA在校学习记录系列—实验4不同状态的LED+开发板(Verilog HDL)


这次创建的新工程名字为:CNT_60

2.基础的60进制计数器

module CNT_60
#(
    parameter   CNT_MAX =   6249999 	//最大计数值 这里是0.25秒
)
(
	input  i_clk,
	input  clr,       //清零
	input  en,
	input  select,     //选择
	input  cin_units,
	
	output reg [3:0] units,  //个位
	output reg [7:0] units_display, //数码管显示个位
	output reg [3:0] tens,  //十位
	output reg [7:0] tens_display, //数码管显示十位
	output reg sec_clk,
	count_units
);
reg [31:0] count;


always @(posedge i_clk or negedge en)
begin
	if(!en) 
	begin
		count <=0;
		sec_clk=1;
	end 
	else
	begin
		if(count == CNT_MAX) 
		begin
			sec_clk = ~sec_clk;
			count <=0;
		end 
		else
		begin
			count <= count +1'b1;
		end
	end
end


always @(posedge sec_clk or negedge en or negedge clr)
begin
	if(!en)
	begin
		
	end
	else
	begin
		if(!clr) units <=0;		
		else 
		begin
			units <=(units == 4'h9)?0:(units + 1);	
			count_units = (units == 4'h9)?1:0;
		end
	end
end

always @(units)
begin

			case(units)
				4'h0:	units_display = 8'hC0;
				4'h1:	units_display = 8'hF9;
				4'h2:	units_display = 8'hA4;
				4'h3:	units_display = 8'hB0;
				4'h4:	units_display = 8'h99;
				4'h5:	units_display = 8'h92;
				4'h6:	units_display = 8'h82;
				4'h7:	units_display = 8'hF8;
				4'h8:	units_display = 8'h80;
				4'h9:	units_display = 8'h90;
			default: units_display = 8'hFF;
			endcase

end

always @(posedge count_units or negedge en or negedge clr)
begin
	if(!en)
	begin
		
	end
	else
	begin
		if(!clr) tens <=0;		
		else 
		begin
			tens <=(tens == 4'h5)?0:(tens + 1);	
		end
	end
end

always @(tens)
begin

			case(tens)
				4'h0:	tens_display = 8'hC0;
				4'h1:	tens_display = 8'hF9;
				4'h2:	tens_display = 8'hA4;
				4'h3:	tens_display = 8'hB0;
				4'h4:	tens_display = 8'h99;
				4'h5:	tens_display = 8'h92;
				4'h6:	tens_display = 8'h82;
				4'h7:	tens_display = 8'hF8;
				4'h8:	tens_display = 8'h80;
				4'h9:	tens_display = 8'h90;
			default: tens_display = 8'hFF;
			endcase

end


endmodule

3.带暂停按键的60进制计数器

新增一个按键,暂停计数

module CNT_60
#(
    parameter   CNT_MAX =   6249999 	//最大计数值 这里是0.25秒
)
(
	input  i_clk,		//时钟
	input  clr,       //清零
	input  en,			//使能
	input  stop_cnt_60, //停止
	
	output reg [3:0] units,  //个位计数
	output reg [7:0] units_display, //数码管显示个位
	output reg [3:0] tens,  //十位计数
	output reg [7:0] tens_display, //数码管显示十位
	output reg sec_clk,		//分频后的第二个时钟
	cin_units		//个位进位标志		
);
reg [31:0] count;//时钟计数


always @(posedge i_clk or negedge en)
begin
	if(!en) 
	begin
		count <=0;
		sec_clk=1;
	end 
	else
	begin
		if(count == CNT_MAX) 
		begin
			sec_clk = ~sec_clk;
			count <=0;
		end 
		else
		begin
			count <= count +1'b1;
		end
	end
end


always @(posedge sec_clk or negedge en or negedge clr or negedge stop_cnt_60)
begin
	if(!en)
	begin
		units <= 4'h10;
	end
	else
	begin
		if(!clr) units <=0;		
		else 
		begin
			if(!stop_cnt_60) units <= units;
			else
			begin
				units <=(units == 4'h9)?0:(units + 1);	
				cin_units = (units == 4'h9)?1:0;
			end
		end
	end
end

always @(units)
begin

			case(units)
				4'h0:	units_display = 8'hC0;
				4'h1:	units_display = 8'hF9;
				4'h2:	units_display = 8'hA4;
				4'h3:	units_display = 8'hB0;
				4'h4:	units_display = 8'h99;
				4'h5:	units_display = 8'h92;
				4'h6:	units_display = 8'h82;
				4'h7:	units_display = 8'hF8;
				4'h8:	units_display = 8'h80;
				4'h9:	units_display = 8'h90;
			default: units_display = 8'hFF;
			endcase

end

always @(posedge cin_units or negedge en or negedge clr)
begin
	if(!en)
	begin
	tens <= 4'h10;
	end
	else
	begin
		if(!clr) tens <=0;		
		else 
		begin
			tens <=(tens == 4'h5)?0:(tens + 1);	
		end
	end
end

always @(tens)
begin

			case(tens)
				4'h0:	tens_display = 8'hC0;
				4'h1:	tens_display = 8'hF9;
				4'h2:	tens_display = 8'hA4;
				4'h3:	tens_display = 8'hB0;
				4'h4:	tens_display = 8'h99;
				4'h5:	tens_display = 8'h92;
				4'h6:	tens_display = 8'h82;
				4'h7:	tens_display = 8'hF8;
				4'h8:	tens_display = 8'h80;
				4'h9:	tens_display = 8'h90;
			default: tens_display = 8'hFF;
			endcase

end


endmodule

在这里插入图片描述

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Verilog代码,实现了10进制计数器60进制计数器的级联。 ```verilog module counter_10( input clk, // 时钟信号 input rst, // 复位信号 output reg [3:0] count // 4位10进制计数器的输出 ); always @(posedge clk or negedge rst) begin if (rst == 0) begin count <= 0; end else begin count <= count + 1; end end endmodule module counter_60( input clk, // 时钟信号 input rst, // 复位信号 input [3:0] in_count, // 上一级计数器的输出 output reg [5:0] count // 6位60进制计数器的输出 ); reg [3:0] sec_count; // 秒计数器 reg [5:0] min_count; // 分钟计数器 counter_10 sec_counter(.clk(clk), .rst(rst), .count(sec_count)); always @(posedge clk or negedge rst) begin if (rst == 0) begin min_count <= 0; sec_count <= 0; count <= 0; end else begin sec_count <= sec_count + 1; if (sec_count == 10) begin sec_count <= 0; min_count <= min_count + 1; if (min_count == 60) begin min_count <= 0; end end count <= {min_count, sec_count}; end end endmodule ``` 这个代码定义了一个4位10进制计数器和一个6位60进制计数器,并将它们级联在一起。其中,10进制计数器使用一个always块来实现简单的加一逻辑,而60进制计数器使用了两个计数器,一个用于计算秒数,另一个用于计算分钟数,在秒数计数器达到10时,分钟数计数器加1,并且在分钟数计数器达到60时,它将被重置为0。 在60进制计数器的模块中,我们使用了counter_10模块来实现秒数计数器。这个模块也是一个简单的计数器,只是它只有4位输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值