秒表设计(Verilog)--quartus13

秒表设计(Verilog)–quartus13

本次实验的目的在于:
(1) 掌握利用硬件描述语言设计计数器、分频电路、译码电路的方法;
(2) 掌握利用例化语句设计顶层电路的方法。

实验内容

秒表设计:要求:
(1)数码管显示;
(2)能清零、暂停;
(3)精确到1/100秒。

实验设备

(1)DE2-115实验板一块
(2)高配置计算机一台

实验原理

电路框图
在这里插入图片描述

1、分频电路设计、编译;
设计方案:该模块有三个端口,分别是原始时钟输入端口、时钟清零信号输入端口、分频时钟输出端口。设置时钟清零信号为高电平时时钟清零,即输出的时钟为低电平。由于开发板提供的时钟信号频率为50MHz,而我们需要的为100Hz的时钟输入,所以分频系数k为:
在这里插入图片描述
设置一个计数器,当计数器计数小于k-1时,计数器加1,时钟输出为0;当计数器计数到k-1的时,计数器清零,时钟输出为1。

//分频
module fenpin(clk,clr,clk2);
input clk,clr;
output clk2;
reg clk2;
reg[31:0] cnter0;
always@(posedge clk or negedge clr)
if (~clr) 
     cnter0<=0;
else 
     if (cnter0==500000-1) 
       begin 
        cnter0<=0; clk2<=1'b1; 
        end
     else  
        begin 
         cnter0<=cnter0+1; clk2<=0;
         end
endmodule

2、模100、模60计数器设计、编译;
模100计数器设计方案:
该模块有五个端口:时钟输入端口,清零端口,个位计数输出端口,十位计数输出端口,进位端口。清零信号输入为低电平时计数器清零。在时钟高电平及清零端口输入为高电平时电路工作:模100计数器分为两个模10计数部分,中间用前一个模10的进位作为后一个模10计数器的时钟输入,后一个模10计数器的进位为输出的进位。这样设计是为了输出的计数端口可以直接连接到译码器译码。
波形仿真图:
在这里插入图片描述

//模100计数器
module counter100(clk,clr,qa,qb,co);
input clk,clr;
output[3:0] qa,qb;
output co;
reg[3:0] qa,qb;
reg cin,co;
always @(posedge clk or negedge clr) begin
if(~clr)
	begin
		qa<=0;
		cin<=0;
	end
	else  
		if(qa==9)
		begin
			qa<=0;
			cin<=1;
		end
		else
		begin
			qa<=qa+1;
			cin<=0;
		end
end
always @(posedge cin or negedge clr) begin
if(~clr)
	begin
		qb<=0;
		co<=0;
	end
	else 
		if(qb==9)
		begin
			qb<=0;
			co<=1;
		end
		else
		begin
			qb<=qb+1;
			co<=0;
		end
end
endmodule

3、模60计数器设计方案
模60设计方案与模100几乎一致,不同的是模60计数器没有最终的进位输出。
波形仿真图:
在这里插入图片描述

//模60计数器
module counter60(clk,clr,qa,qb);
input clk,clr;
output[3:0] qa,qb;
reg[3:0] qa,qb;
reg cin;
always @(posedge clk or negedge clr) begin
if(~clr)
	begin
		qa<=0;
		cin<=0;
	end
	else 
		if(qa==9)
		begin
			qa<=0;
			cin<=1;
		end
		else
		begin
			qa<=qa+1;
			cin<=0;
		end
end
always @(posedge cin or negedge clr) begin
if(~clr)
	begin
		qb<=0;
	end
	else 
		if(qb==5)
		begin
			qb<=0;
		end
		else
		begin
			qb<=qb+1;
		end
end
endmodule

4、七段译码器电路设计、编译;
该模块有两个端口:需要译码的输入端口和译码输出端口。输入信号后将输入的信号通过比对输出对应的译码。但是需要注意的是我们使用的开发板七段数码管是共阳极的。
波形仿真图:
在这里插入图片描述

//七段译码器
module decoder7(in,out);
input[3:0] in;
output[6:0] out;
wire[3:0] in;
reg [6:0] out;
always@(in,out)
begin
	case (in)
		4'd0:out=7'b1000000;
		4'd1:out=7'b1111001;
		4'd2:out=7'b0100100;
		4'd3:out=7'b0110000;
		4'd4:out=7'b0011001;
		4'd5:out=7'b0010010;
		4'd6:out=7'b0000011;
		4'd7:out=7'b1111000;
		4'd8:out=7'b0000000;
		4'd9:out=7'b0011000;
		default: out=7'b1000000;
	endcase
end
endmodule
4、	分频代码
module fenpin(clk,clr,clk2);
input clk,clr;
output clk2;
reg clk2;
reg[31:0] cnter0;
always@(posedge clk or negedge clr)
if (~clr) 
     cnter0<=0;
else 
     if (cnter0==500000-1) 
       begin 
        cnter0<=0; clk2<=1'b1; 
        end
     else  
        begin 
         cnter0<=cnter0+1; clk2<=0;
         end
endmodule

5、顶层电路设计、编译,分配管脚、下载、测试。
顶层文件主要是使用例化语句调用上面写好的模块,然后通过wire类型的变量来把电路所有的模块级联起来。采用的程序测试层次及模块如下图所示:

//秒表
module seconds(CLOCK_50,SW,HEX0,HEX1,HEX2,HEX3);
input CLOCK_50;
input[1:0] SW;
output[6:0] HEX0,HEX1,HEX2,HEX3;
wire [6:0] HEX0,HEX1,HEX2,HEX3;
wire clk1,co;
wire[3:0] qa,qb,qc,qd;
fenpin fp(.clk(CLOCK_50),.clr(SW[0]),.clk2(clk1));
counter100 ct100(.clk(clk1),.clr(SW[1]),.qa(qa),.qb(qb),.co(co));
counter60 ct60(.clk(co),.clr(SW[1]),.qa(qc),.qb(qd));
decoder7 dc0(.in(qa),.out(HEX0));
decoder7 dc1(.in(qb),.out(HEX1));
decoder7 dc2(.in(qc),.out(HEX2));
decoder7 dc3(.in(qd),.out(HEX3));
endmodule

思考

如何设计暂停功能?简述原理
设计暂停功能的方法主要有两种。第一种是让计数器使能端置0从而使计数器不工作,所以也就达到了暂停功能。第二种是通过阻断时钟输入从而让计数器不工作从而实现暂停功能。我在本次实验中采用的是通过将输入时钟清零从而实现暂停功能的方法。

总结

1、使用连续赋值语句assign时等号左边的变量有类型要求,这个变量只能是wire类型的,如果定义为reg类型的变量就会出现错误。
2、在将程序烧录到开发板上运行时数码管的显示不正确,其具体情况是:可以明显的看到秒的个位在后两位变化一定时间后改变一次,秒的个位改变十次后秒的十位改变一次,但是数码管上不会有正常的数字显示。最后通过调试发现我们使用的开发板上的数码管和我平时接触到的数码管不太一致。第一个不一致的部分是这个数码管是共阳极显示的数码管,需要我们给到低电平时数码管才亮。第二个不一致的部分时这个数码管虽然也是工具{a,b,c,d,e,f,g}的顺序控制七段LED显示的,但是在数码管上体现的位置有所区别,其具体顺序如下图显示:
在这里插入图片描述

  • 11
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃折耳根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值