赞
踩
本次实验的目的在于:
(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显示的,但是在数码管上体现的位置有所区别,其具体顺序如下图显示:

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。